02 DML(DataManipulationLanguage)
1.插入记录
基本语法 :
INSERT INTO tbl_name (col_name ,col_name1,..,col_nameN) VALUES (val1,val2,…,valN) ;
对于可空字段/非空但用默认值字段/自增字段 可以不在insert后的字段列表中出现,对应的值分别为NULL/默认值/自增的下一个数字
批量插入:
INSERT INTO tbl_name (col_name1,col_name2,..,col_nameN)
VALUES (val1,val2,..,valN)
,(val1,val2,..,valN)
,(val1,val2,..,valN)
,(val1,val2,..,valN);
批量操作的好处是插入大量记录的时候,节省网络开销,大大提高插入效率。
2.更新记录
基础语法:
UPDATE tbl_name SET col_name1 = val1 ,..,col_nameN = valN [WHERE CONDITION];
拓展语法:
UPDATE t1,t2,..,tn SET t1.col_name1 = val1 ,tn.col_nameN = valN [WHERE CONDITION] ;
⚠️注意:多表更新的方式多用于根据一个表的字段动态更新另外一个表的字段 的场景。
3.删除记录
基础语法:
DELETE FROM tbl_name [WHERE CONDITION] ;
拓展语法:
DELETE FROM t1,t2,..,tn FROM t1,t2,..,tn [WHERE CONDITION] ;
4.查询记录
基础语法:
SELECT * FROM tbl_name [WHERE CONDITION] ;
查询不重复记录:
demo : SELECT DISTINCT deptno FROM emp ;
排序和限制:
SELECT * FROM tbl_name [WHERE CONDITION] [ORDER BY col_name1 [DESC|ASC] ,col_name2 [DESC|ASC] , .. ,col_nameN [DESC | ASC] [LIMIT offset_start , row_cnt] ;
⚠️注意:如果LIMIT后只有一个参数 表示 offset_start=0 ,而这个参数代表的是row_cnt
聚合(group by)
SELECT [col_name1,col_name2,..col_nameN] func_name
FROM tbl_name
[WHERE CONDITION]
[GROUP BY col_name1,col_name2,..,col_nameN]
[WITH ROLLUP]
[HAVING where_condition] ;
其中,func_name : 代表的是聚合函数,如SUM(),COUNT(),MAX(),MIN()等。
WITH ROLLUP : 表示是否要对分类聚合后对结果进行再汇总。
HAVING :表示对分类结果再进行条件过滤。
HAVING和WHERE等区别:
WHERE是先进行条件过滤,而HAVING是对结果进行再过滤。
如果逻辑上允许,首先考虑用WHERE,这样结果集变小对进行聚合操作的效率将大大提高。
5.表连接
分为内连接和外连接。区别是内连接只选出两个表中相互匹配的记录;而外链接会连同不匹配的记录一并选取出来。通常使用内连接。
a.内连接:
demo : SELECT * FROM t1 ,t2 where t1.id = t2.id ;
b.外连接:
分为左连接和右连接。
左连接:包含所有左表中的数据,不管是否在右表中是否匹配到相关数据。
右连接:包含所有右表中的数据,无论是否在左表中是否有匹配记录。
demo:
select col1,col2 from t1 LFET JOIN t2 ON t1.xx = t2.xx ;
6.子查询
关键字主要包括: in , not in , = , != , exists , not exists
demo :
SELECT * FROM emp where deptno in(SELECT eptno FROM dept) ;
当子查询记录数唯一,可用=代替in
某些时候子查询可以转化为表连接。
例如:
SELECT * FROM emp WHERE deptno IN(SELECT deptno FROM dept);
可以转化为
SELECT emp,* FROM emp,dept WHERE emp.deptno = dept.deptno ;
表连接在很多时候 用于优化子查询。
7.记录联合
关键字: union , union all
SELECT * FROM t1
UNION | UNION ALL
SELECT * FROM t2
UNION | UNION ALL
...
SELECT * FROM tn ;
UNION 和 UNION ALL 主要区别:
UNION ALL 是将结果集直接合并到一起,而UNION是将UNION ALL后到结果进行一次DISTINCT , 去除重复记录后的结果。
⚠️注意:做UNION / UNION ALL操作的两(多)张表,他们的字段名,字段类型以及要显示的字段个数/顺序都要保持一致 todo