第二十天:mysql查询:DML、DDL、DQL

一、DML 语句

DML: INSERT, DELETE, UPDATE

1、INSERT 语句

功能:一次插入一行或多行数据
语法
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 语句

语法:
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 语句

删除表中数据,但不会自动缩减数据文件的大小。

语法:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]
#可先排序再指定删除的行数
如果想清空表,保留表结构,也可以使用下面语句,此语句会自动缩减数据文件的大小。
RUNCATE TABLE tbl_name;
缩减表大小
OPTIMIZE TABLE tb_name

二、DQL 语句

1、单表操作
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语句的执行流程:
FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause -->SELECT --> ORDER 
BY --> LIMIT

 

posted @ 2024-02-12 12:37  djyhello  阅读(15)  评论(0编辑  收藏  举报