主要是对数值型进行处理。
-- 绝对值 select ABS(-4) 4的绝对值,ABS(-1.1); -- 向下取整,向上取整,四舍五入 select CEILING(4.1),FLOOR(1.1),ROUND(-4.4) -- 取余 select MOD(60,11); -- 随机数 select RAND(),RAND(),RAND() -- 截断 select TRUNCATE(2.33999999,2);
对字符串进行处理。
select LEFT('abcdefg',2); select RIGHT('abcdefg',2); select REVERSE('hijklmn'); select REPLACE('abcdefg','abc','x');
date,time,datetime,timestamp,year。
select CURRENT_DATE(); select CURTIME(); select now();
select UNIX_TIMESTAMP(); select FROM_UNIXTIME(1660785720);
select MONTH(SYSDATE()); select MONTHNAME(SYSDATE()); select DAYNAME(SYSDATE()); select DAYOFWEEK(SYSDATE()); select WEEK(SYSDATE()); select DAYOFMONTH(SYSDATE()); select YEAR(SYSDATE());
-- 日期加法 select DATE_ADD(SYSDATE(),INTERVAL 70 DAY); -- 日期减法 select DATE_SUB(SYSDATE(),INTERVAL 10 DAY); -- 时间间隔 select DATEDIFF('2023-01-01',SYSDATE()); -- 日期格式化 select DATE_FORMAT(SYSDATE(),'%W %M %D %Y');
-- 把传入的参数的字符串按照md5算法进行加密,得到一个32位的16进制的字符串 select MD5('123456');
md5算法是不可逆的。
可以进行条件判断,用来实现SQL语句的逻辑。
select IF(2 > 1,'a','b'); select IFNULL(sal,0); select NULLIF(age,0);
对一系列的值进行判断:
-- 输出学生的各科的成绩,以及评级,60以下D,60-70是C,71-80是B,80以上是A SELECT *, CASE WHEN score < 60 THEN 'D' WHEN score >= 60 AND score < 70 THEN 'C' WHEN score >= 70 AND score < 80 THEN 'B' WHEN score >= 80 THEN 'A' END AS '评级' FROM mystudent;
-- 行转列 SELECT user_name, max( CASE course WHEN '数学' THEN score ELSE 0 END ) '数学', max( CASE course WHEN '语文' THEN score ELSE 0 END ) '语文', max( CASE course WHEN '英语' THEN score ELSE 0 END ) '英语' FROM mystudent GROUP BY user_name
不符合第一范式表结构:
id | name | 联系方式 |
---|---|---|
1001 | aaa | [[email protected] , 13314569878](mailto:[email protected] , 13314569878) |
1002 | bbb | [[email protected] , 13245678945](mailto:[email protected] , 13245678945) |
1003 | ccc | [[email protected] , 15000456987](mailto:[email protected] , 15000456987) |
符合第一范式的表结构:
id | name | 邮箱 | 手机号 |
---|---|---|---|
1001 | aaa | [email protected] | 12321321321 |
1002 | bbb | [email protected] | 32132654654 |
1003 | ccc | [email protected] | 45654654654 |
必须有主键,这是数据库设计的基本要求,一般情况下我们采用数值型或定长字符串,列不能再分,比如:联系方式。
关于第一范式,保证每一行的数据是唯一,每个表必须有主键。
建立在第一范式的基础上,要求所有非主键字段完全依赖于主键,不能产生部分依赖。
学号 | 性别 | 姓名 | 课程编号 | 课程名称 | 教室 | 成绩 |
---|---|---|---|---|---|---|
1001 | 男 | a | 2001 | java | 301 | 89 |
1002 | 女 | b | 2002 | mysql | 302 | 90 |
1003 | 男 | c | 2003 | html | 303 | 91 |
1004 | 男 | d | 2004 | python | 304 | 52 |
1005 | 女 | e | 2005 | c++ | 305 | 67 |
1006 | 男 | f | 2006 | c# | 306 | 84 |
解决方案:
学生表:学号是主键
学号 | 性别 | 姓名 |
---|---|---|
1001 | 男 | a |
1002 | 女 | b |
1003 | 男 | c |
1004 | 男 | d |
1005 | 女 | e |
1006 | 男 | f |
课程表:课程编号是主键
课程编号 | 课程名称 | 教室 |
---|---|---|
2001 | java | 301 |
2002 | mysql | 302 |
2003 | html | 303 |
2004 | python | 304 |
2005 | c++ | 305 |
2006 | c# | 306 |
成绩表:学号和课程编号为联合主键
学号 | 课程编号 | 成绩 |
---|---|---|
1001 | 2001 | 89 |
1002 | 2002 | 90 |
1003 | 2003 | 91 |
1004 | 2004 | 52 |
1005 | 2005 | 67 |
1006 | 2006 | 84 |
建立在第二范式基础上,非主键字段不能传递依赖于主键字段。
不满足第三范式:
学号 | 姓名 | 课程编号 | 课程名称 |
---|---|---|---|
1001 | a | 2001 | java |
1002 | b | 2002 | mysql |
1003 | c | 2003 | html |
1004 | d | 2004 | python |
1005 | e | 2005 | c++ |
1006 | f | 2006 | c# |
解决方案:
学生表:学号是主键
学号 | 姓名 | 课程编号 |
---|---|---|
1001 | a | 2001 |
1002 | b | 2002 |
1003 | c | 2003 |
1004 | d | 2004 |
1005 | e | 2005 |
1006 | f | 2006 |
课程表:课程编号是主键
课程编号 | 课程名称 |
---|---|
2001 | java |
2002 | mysql |
2003 | html |
2004 | python |
2005 | c++ |
2006 | c# |
学生信息表分为基本信息表和信息信息表。
两张表,外键在多的一方。
索引
,视图
,存储过程,触发器,函数....