第一部分:子查询
子查询(subquery):出现在其他SQL语句内的SELECT子句
例如: SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中: SELECT * FROM t1 称为Outer Query/Outer Statement SELECT col2 FROM t2 称为SubQuery
特点:嵌套在查询内部,且必须始终出现在 圆括号内
子查询可以包含多个关键字或条件: DISTINCT,GROUP BY,ORDER BY,LIMIT,函数等 子查询的外层查询可以是: SELECT,INSERT,UPDATE,SET,DO
子查询可以返回:标量,一行,一列,子查询
比较运算符: = , >, <, >=, <=, <>, !=, <=> 语法结构: operand comparison_operator subquery
用ANY, SOME, ALL修饰 operand comparison_operator ANY (subquery) operand comparison_operator SOME(subquery) operand comparison_operator ALL(subquery)
使用[NOT] IN : operand comparison_operator [NOT] IN (subquery) =ANY 与 IN 等效 !=ALL 与 <>ALL 与 NOT IN 等效
使用[NOT] EXISTS: 如果子查询返回任何一行,EXISTS将返回TRUE 否则返回FALSE
INSERT...SELECT将查询结果写入数据表 INSERT [INTO] tbl_name [(col_name,...)] SELECT...
多表更新 UPDATE table_references SET col_name1={expr1 | DEFAULT} [,col_name1={expr1 | DEFAULT}]...[WHERE where_condition]
第二部分:连接
连接:MySQL在SELECT语句,多表更新,多表删除语句中支持JOIN操作
连接语法结构: table_reference {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN} table_reference [[AS] alias] ON condition_expr
数据参照表可以赋予别名
例如: UPDATE table1 INNER JOIN table2 ON table1.name=table2.name SET table1.age=table2.age
连接类型: INNER JOIN,内连接 JOIN == INNER JOIN == CROSS JOIN等价 LEFT [OUTER] JOIN,左外连接 RIGHT [OUTER] JOIN,右外连接
说明: 内连接(INNER JOIN):显示左表及右表符合连接条件的记录,A ∩ B
左外连接(LEFT JOIN):显示左表中的全部和右表符合连接条件的记录,A ∪ (A ∩ B) 右外连接(RIGHT JOIN):显示右表中的全部和左表符合连接条件的记录,B ∪ (A ∩ B) 连接条件 通常使用ON关键字来设定连接条件,也可以实验WHERE,WHERE关键字进行结果集记录的过滤
CREATE ...SELECT创建数据表的同时,将查询结果写入到数据表 CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] select_statement
No query specified? 因为在\G后面是不需要加;
事实外键,物理外键
外连接 A LEFT JOIN B join_condition
(1)数据表B的结果集合依赖数据表A (2)数据表A 的结果集合根据左连接条件依赖所有的数据表(B表除外) (3)左外连接条件决定如何检索数据表B(在没有指定WHERE条件的情况下) (4)如果数据表A的某条记录符合WHERE条件,但是在数据表B不存在符合连接条件的记录,将生成一个所有列为空的额外的B行 (5)如果使用内连接查找的记录在数据表中不存在,并且在WHERE子句中尝试一下操作:col_name IS NULL 时,如果col_name 被定义为NOT NULL ,MySQL将在找到符合连接执行条件的记录后停止搜索更多的行。
自身连接 同一数据表对其自身进行连接
多表删除 DELETE tbl_name[. *] [,tbl_name[.*]]... FROM table_references [WHERE where_condition]