⼦查询(嵌套sql)
SELECT语句是SQL的查询。迄今为⽌我们所看到的所有SELECT语句都是简单查询,即从单个数据库表中检索数据的单条语句。SQL还允许创建⼦查询(subquery),即嵌套在其他查询中的查询。子查询指嵌套在查询内部,且必须始终出现圆括号内。子查询可以包含多个关键字或条件,如distinct、GROUP BY、ORDER BY,LIMIT,函数等,子查询的外层查询可以是:SELECT INSERT UPDATE ,SET 或DO。
需要注意的是:
⼦查询中的WHERE⼦句与前⾯使⽤的WHERE⼦句稍有不同,因为它使⽤了完全限定列名这种类型的⼦查询称为相关⼦查询。任何时候只要列名可能有多义性,就必须使⽤这种语法(表名和列名由⼀个句点分隔)。
子查询是目前已明确的sql语句中查询效率最低,应尽量避免使用子查询。
子查询类型
1、where型:把内层查询的结果作为外层查询的比较条件
2、from型:把内层的查询结果当成临时表,供外层sql再次查询。查询结果集可以当成表看待。临时表要使用一个别名。
3、exists型:把外层sql的结果,拿到内层sql去测试,如果内层的sql成立,则该行取出。内层查询是exists后的查询。
4、any, in 。
5、from前子查询
使用[NOT] IN 的子查询
语法:
operand comparison_operator [NOT]IN (subquery)
=ANY 运算符与IN 等效
!= ALL或<>ALL运算符与 NOT IN 等效
关系表
关系表的设计要保证把信息分解成多个表,尽量数据间的耦合性。各表通过某些常用值相互关联
一对一
一张表中的数据有且只有对应另一张表中的数据
一对多
一个表中的数据可以对应另外一张表的多个数据,在数据表设计中较常见
多对多
一张表中的一个数据可以对应另一张表的多个数据,反之,另一张表中的一个数据也可以对应一张表的多个数据。
多表更新
表的参照关系:一张表通过JOIN
table_reference
{[INNER| CROSS] JOIN | {LEFT|RIGHT} [OUTER] JOIN}
表联结
MySQL在SELECT语句、多表更新、多表删除语句中支持JOIN操作。
这里的联结指的是连接各个操作表
语法结构:
table_reference
{[INNER | CROSS] JOIN | {LEFT |RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr
ON后面跟着的是连接的条件
注意:
使用多表联结时要指定正确的限定条件,否在会出现笛卡儿积(第一张表中每一行的数据会与第二张表中的每一行数据相匹配)。
内部联结(相当于取并集)
INNER JOIN…ON… 或者 WHERE
使用ON关键字来设定连接条件,也可以使用WHERE来代替,通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果搜集记录的过滤。
join
语法:select 查询字段 from 表1 inner join 表2 on 条件
where
语法:select 查询字段 from 表1,表2 where 条件
外部联结
许多联结将⼀个表中的⾏与另⼀个表中的⾏相关联。但有时候会需要包含没有关联⾏的那些⾏。
左外联结
A LEFT JOIN B join_condition
数据表B的结果依赖数据表A,数据表A的结果集根据左连接条件依赖所有数据表(B除外),左连接条件决定如何检索数据表B(在没有指定WHERE条件的情况下)。如果数据表A的某条记录符合WHERE条件,但是在数据表B不存在符合连接条件的记录,将生成一个所有列为空的额外的B行
右外连接
与左连接查询相反
自联结
在一个SQL中,当前表联结自身进行关联操作。
语法:select 查询字段 from 表 as b1,表 as b2 where 限定条件
组合查询 UNION
MySQL也允许执⾏多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。
UNION规则
UNION必须由两条或两条以上的SELECT语句组成,语句之间⽤关键字UNION分隔(因此,
如果组合4条SELECT语句,将要使⽤3个UNION关键字)。UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的⽇期类型)。UNION从查询结果集中⾃动去除了重复的⾏,如果不想去除重复行,可使用UNION ALL关键字。
对组合查询结果排序
SELECT语句的输出⽤ORDER BY⼦句排序。在⽤UNION组合查询时,只能使⽤⼀条ORDER BY⼦句,它必须出现在最后⼀条SELECT语句之后。
事务
事务的语法
- start transaction;/ begin;
- commit; 使得当前的修改确认
- rollback; 使得当前的修改被放弃
事务四大特征(ACID)
- 原子性(A):事务是最小单位,不可再分
- 一致性©:事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
- 隔离性(I):事务A和事务B之间具有隔离性
- 持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)
事物与数据库底层数据
在事物进行过程中,未结束之前,DML语句是不会更改底层数据,只是将历史操作记录一下,在内存中完成记录。只有在事物结束的时候,而且是成功的结束的时候,才会修改底层硬盘文件中的数据。
事务提交与回滚
在MySQL中,默认情况下,事务是自动提交的,也就是说,只要执行一条DML语句就开启了事物,并且提交了事务