第二十天:mysql查询:DML、DDL、DQL
一、DML 语句
DML: INSERT, DELETE, UPDATE
1、INSERT 语句
功能:一次插入一行或多行数据
语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [ IGNORE ] [ INTO ] tbl_name [(col_name,...)] { VALUES | VALUE} ({expr | DEFAULT },...),(...),... [ ON DUPLICATE KEY UPDATE #如果重复更新之 col_name=expr [, col_name=expr] ... ] INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [ IGNORE ] [ INTO ] tbl_name SET col_name={expr | DEFAULT }, ... [ ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... ] INSERT [LOW_PRIORITY | HIGH_PRIORITY] [ IGNORE ] [ INTO ] tbl_name [(col_name,...)] SELECT ... [ ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... ] |
2、UPDATE 语句
语法:
1 2 3 4 5 | UPDATE [LOW_PRIORITY] [ IGNORE ] table_reference SET col_name1={expr1| DEFAULT } [, col_name2={expr2| DEFAULT }] ... [ WHERE where_condition] [ ORDER BY ...] [LIMIT row_count] |
3、DELETE 语句
删除表中数据,但不会自动缩减数据文件的大小。
语法:
1 2 3 4 5 | DELETE [LOW_PRIORITY] [QUICK] [ IGNORE ] FROM tbl_name [ WHERE where_condition] [ ORDER BY ...] [LIMIT row_count] #可先排序再指定删除的行数 |
如果想清空表,保留表结构,也可以使用下面语句,此语句会自动缩减数据文件的大小。
1 | RUNCATE TABLE tbl_name; |
缩减表大小
1 | OPTIMIZE TABLE tb_name |
二、DQL 语句
1、单表操作
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT [ ALL | DISTINCT | DISTINCTROW ] [SQL_CACHE | SQL_NO_CACHE] select_expr [, select_expr ...] [ FROM table_references [ WHERE where_condition] [ GROUP BY {col_name | expr | position} [ ASC | DESC ], ... [ WITH ROLLUP ]] [ HAVING where_condition] [ ORDER BY {col_name | expr | position} [ ASC | DESC ], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [ FOR UPDATE | LOCK IN SHARE MODE] |
字段显示可以使用别名:
col1 AS alias1, col2 AS alias2, ...
WHERE子句:指明过滤条件以实现"选择"的功能:
过滤条件:布尔型表达式
算术操作符:+, -, *, /, %
比较操作符:=,<=>(相等或都为空), <>, !=(非标准SQL), >, >=, <, <=
范例查询: BETWEEN min_num AND max_num
不连续的查询: IN (element1, element2, ...)
空查询: IS NULL, IS NOT NULL
DISTINCT 去除重复行,范例:SELECT DISTINCT gender FROM students;
模糊查询: LIKE 使用 % 表示任意长度的任意字符 _ 表示任意单个字符
RLIKE:正则表达式,索引失效,不建议使用
REGEXP:匹配字符串可用正则表达式书写模式,同上
逻辑操作符:NOT,AND,OR,XOR
GROUP BY:根据指定的条件把查询结果进行"分组"以用于做"聚合"运算
常见聚合函数: count(), sum(), max(), min(), avg(),注意:聚合函数不对null统计
HAVING: 对分组聚合运算后的结果指定过滤条件
一旦分组 group by ,select语句后只跟分组的字段,聚合函数
ORDER BY: 根据指定的字段对查询结果进行排序
升序:ASC
降序:DESC
LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制,跳过offset,显示row_count行,offset默为值为0
对查询结果中的数据请求施加"锁"
FOR UPDATE: 写锁,独占或排它锁,只有一个读和写操作
LOCK IN SHARE MODE: 读锁,共享锁,同时多个读操作
2、多表查询
子查询:在SQL语句嵌套着查询语句,性能较差,基于某语句的查询结果再次进行的查询
(1)用于比较表达式中的子查询;子查询仅能返回单个值
(2)用于IN中的子查询:子查询应该单独查询并返回一个或多个值重新构成列表
(3)用于EXISTS 和 Not EXISTS
(4)用于FROM子句中的子查询
联合查询:UNION
SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;
交叉连接:笛卡尔乘积 CROSS JOIN
内连接:inner join 内连接取多个表的交集
等值连接:让表之间的字段以"等值"建立连接关系
不等值连接:
自然连接:去掉重复列的等值连接 , 语法: FROM table1 NATURAL JOIN table2;
当源表和目标表共享相同名称的列时,就可以在它们之间执行自然连接,而无需指定连接列。
在使用纯自然连接时,如没有相同的列时,会产生交叉连接(笛卡尔乘积)
语法:(SQL:1999)SELECT table1.column, table2.column FROM table1 NATURAL JOINtable2;
外连接:
左外连接:以左表为主根据条件查询右表数据﹐如果根据条件查询右表数据不存在使用null值填充
FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
右外连接:以右表为主根据条件查询左表数据﹐如果根据条件查询左表数据不存在使用null值填充
FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
完全外连接: FROM tb1 FULL OUTER JOIN tb2 ON tb1.col=tb2.col 注意:MySQL 不支持此SQL语法
自连接:本表和本表进行连接查询
3、SELECT 语句处理的顺序
查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎
SELECT语句的执行流程:
1 2 | FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause -->SELECT --> ORDER BY --> LIMIT |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步