连接
连接是在多个表之间通过一定的连接条件,使表之间发生关联,进而能从多个表之间获取数据。
在 WHERE子句中书写连接条件。 如果在多个表中出现相同的列名,则需要使用表名作为来自该表的列名的前缀。 N个表相连时,至少需要N-1个连接条件。
第七天(2018/8/1)
日期时间函数
- CURDATE()和CURRENT_DATE() :获取当前日期函数;
- NOW():返回服务器的当前日期和时间;
- CURTIME():返回当前时间,只包含时分秒;
- UTC_DATE():返回世界标准时间日期函数;
- UTC_TIME():返回世界标准时间函数;
- TIMEDIFF(expr1, expr2):返回两个日期相减相差的时间数;
- DATEDIFF(expr1, expr2):返回两个日期相减相差的天数;
- DATE_ADD(date,INTERVAL expr type):日期加上一个时间间隔值;
- DATE_SUB(date,INTERVAL expr type):日期减去一个时间间隔值;
- DATE(date)、TIME(date)、YEAR(date):选取日期时间的各个部分:
- EXTRACT(unit FROM date):从日期中抽取出某个单独的部分或组合;
- DAYOFWEEK(date) 、DAYOFMONTH(date) 、DAYOFYEAR(date):返回日期在一周、一月、一年中是第几天
- DAYNAME、MONTHNAME:返回日期的星期和月份名称;
- DATE_FORMAT(date,format):格式化日期;
- TIME_FORMATE(time,formate):格式化时间;
流程控制函数
- 常见的控制流程函数如下:
– CASE
– IF
– IFNULL
– NULLIF
- CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
- CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
- 在第一个方案的返回结果中, value=compare-value。
- 而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。
- SELECT CASE 11 WHEN 1 THEN 'one'
WHEN 2 THEN 'two' ELSE 'more' END;
- SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
- IF(expr1,expr2,expr3)
– 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。
– IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
– SELECT IF(1>2,2,3);
- SELECT IF(1<2,'yes ','no');
- IFNULL(expr1,expr2)|NULLIF(expr1,expr2)
– 假如expr1 不为NULL ,则IFNULL() 的返回值为expr1 ; 否则其返回值为expr2 。
– IFNULL() 的返回值是数字或是字符串,具体情况取决于其所使用的语境
- Database():返回使用utf8 字符集的默认( 当前) 数据库名
- Version():返回指示MySQL 服务器版本的字符串。
- User():返回当前MySQL 用户名和机主名
- Inet_aton():给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。
- Inet_ntoa():给定一个数字网络地址, 返回作为字符串的该地址的点地址表示。
- Password(str):从原文密码str 计算并返回密码字符串,当参数为NULL 时返回NULL。
- Md5(str):为字符串算出一个MD5 128 比特检查和。
多表查询
- 笛卡尔积是:
– 第一个表中的所有行和第二个表中的所有行都发生连接。
- 笛卡尔积在下列情况产生:
– 连接条件被省略
– 连接条件是无效的
- 为了避免笛卡尔积的产生,通常需要在WHERE子句中包含一个有效的连接条件。
等值连接
用等于号的形式进行多表的连接
例:SELECT ENAME,DNAME,LOC
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
限制歧义列名
- 在用到多个表时可以使用表名作前缀来限定列;
- 通过使用表前缀可以提高性能;
- 通过使用列的别名可以区分来自不同表但是名字相同的列;
非等值连接
用不等号的形式进行多表连接
例:SELECT ENAME,SAL,GRADE
FROM EMP,SALGRADE
WHERE SAL >= LOSAL
AND SAL <= HISAL
自连接
自身连接,也叫自连接,是一个表通过某种条件和本身进行连接的一种方式,就如同多个表连接一样
SELECT T1.ENAME 员工姓名,T2.ENAME 上级姓名
FROM EMP T1,EMP T2
WHERE T1.MGR = T2.EMPNO
ANSI SQL:1999标准的连接语法
交叉连接
交叉连接会产生连个表的交叉乘积,和两个表之间的笛卡尔积是一样的;
使用CROSS JOIN 子句完成
例:
SELECT *
FROM EMP
CROSS JOIN DEPT
自然连接
自然连接是对两个表之间相同名字和数据类型的列进行的等值连接;
如果两个表之间相同名称的列的数据类型不同,则会产生错误;
使用NATURAL JOIN子句来完成
例:
SELECT *
FROM EMP
NATURAL JOIN DEPT
USING子句
自然连接是使用所有名称和数据类型相匹配的列作为连接条件,而USING子句可以指定用某个或某几个相同名字和数据类型的列作为连接条件。
例:
SELECT ENAME,DNAME,LOC
FROM EMP
JOIN DEPT
USING (DEPTNO)
注:
如果有若干个列名称相同但数据类型不同,自然连接子句可以用USING子句来替换,以指定产生等值连接的列。
如果有多于一个列都匹配的情况,使用USING子句只能指定其中的一列。
USING子句中的用到的列不能使用表名和别名作为前缀。
NATURAL JOIN子句和USING子句是相互排斥的,不能同时使用
ON子句
自然连接条件基本上是具有相同列名的表之间的等值连接;
如果要指定任意连接条件,或指定要连接的列,则可以使用ON子句;
用ON将连接条件和其它检索条件分隔开,其它检索条件写在WHERE子句;
ON子句可以提高代码的可读性。
例:
SELECT *
FROM EMP
JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO
JOIN SALGRADE
ON SAL BETWEEN LOSAL AND HISAL
左外连接
左外连接以FROM子句中的左边表为基表,该表所有行数据按照连接条件无论是否与右边表能匹配上,都会被显示出来。
SELECT *
FROM DEPT -- 哪张表需要全部显示哪张表就是主表,写在前面
LEFT JOIN EMP
ON DEPT.DEPTNO = EMP.DEPTNO