DML数据操作语言
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DML数据操作语言相关的知识,希望对你有一定的参考价值。
DML: 数据操作语言
INSERT, DELETE, UPDATE, SELECT 常用的语句,增、删、改、查;
INSERT:
一次插入一行或多行数据;
Syntax:
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] ... ]
mysql> INSERT tbl_name [(col1,...)] VALUES (val1,...), (val21,...)
例如: mysql> INSERT INTO student (name,sex,register_date) VALUES (‘Jinjiao‘,‘M‘,‘2019-01-29‘);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM student;
+----+----------+---------------+------+
| id | name | register_date | sex |
+----+----------+---------------+------+
| 1 | ZhanYang | 2018-06-20 | NULL |
| 4 | LiuJia | 2018-05-30 | NULL |
| 8 | JiaLiu | 2018-06-20 | NULL |
| 9 | JiaLiu | 2018-04-20 | NULL |
| 10 | gaoyf | 2018-04-20 | NULL |
| 11 | zhujh | 2018-04-20 | NULL |
| 12 | zhouha | 2018-04-20 | NULL |
| 13 | hanzb | 2018-04-21 | M |
| 16 | ZhanXing | 2018-05-21 | M |
| 17 | XingYan | 2018-05-21 | M |
| 18 | Jinjiao | 2019-01-29 | M |
+----+----------+---------------+------+
11 rows in set (0.00 sec)
Or:
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] ... ]
例如: mysql> INSERT INTO student SET name=‘Yinjiao‘,sex=‘F‘,register_date=‘2019-01-28‘;
Query OK, 1 row affected (0.01 sec)
Or:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
DELETE:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition] #如果不指where条件,该表会被清空
[ORDER BY ...]
[LIMIT row_count]
注意:一定要有限制条件,否则将清空表中的所有数据;
限制条件:
WHERE
LIMIT
UPDATE:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
mysql> UPDATE student SET age=100 WHERE id=19;
注意:一定要有限制条件,否则将修改所有行的指定字段;
限制条件:
WHERE
LIMIT
SELECT:
Query Cache #查询缓存,在查询结果确定时,才进行缓存。
mysql> SELECT NOW(); #显示当前系统时间。
查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎;
SELECT语句的执行流程:
FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause --> ORDER BY --> SELECT --> LIMIT
单表查询:
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]
DISTINCT: 数据去重;
mysql> SELECT DISTINCT sex FROM student;
+------+
| sex |
+------+
| NULL |
| M |
| F |
+------+
3 rows in set (0.00 sec)
SQL_CACHE: 显式指定存储查询结果于缓存之中;
SQL_NO_CACHE: 显式查询结果不予缓存;
命中个数:mysql> SHOW GLOBAL VARIABLES LIKE ‘query%‘;
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | OFF |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
+------------------------------+---------+
7 rows in set (0.00 sec)
query_cache_type的值为‘ON‘时,查询缓存功能打开;
SELECT的结果符合缓存条件即会缓存,否则,不予缓存;
显式指定SQL_NO_CACHE,不予缓存;
query_cache_type的值为‘DEMAND‘时,查询缓存功能按需进行;
显式指定SQL_CACHE的SELECT语句才会缓存;其它均不予缓存;
缓存命中率查询:mysql> SHOW GLOBAL STATUS LIKE ‘Qcache%‘;
+-------------------------+---------+
| Variable_name | Value |
+-------------------------+---------+
| Qcache_free_blocks | 1 |
| Qcache_free_memory | 1031352 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 63 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 1 |
+-------------------------+---------+
8 rows in set (0.00 sec)
mysql> SHOW GLOBAL STATUS LIKE ‘Com_se%‘;
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| Com_select | 75 |
| Com_set_option | 0 |
+----------------+-------+
2 rows in set (0.00 sec)
字段显示可以使用别名:
col1 AS alias1, col2 AS alias2, ...
WHERE子句:指明过滤条件以实现“选择”的功能:
过滤条件:布尔型表达式;
算术操作符:+, -, *, /, %
比较操作符:=, !=, <>, <=>, >, >=, <, <=
mysql> SELECT name,age,id FROM student WHERE age >10;
mysql> SELECT name,age,id FROM student WHERE age+10 >10;
BETWEEN min_num AND max_num #取值区间
IN (element1, element2, ...) #等值或条件表达式
mysql> SELECT name,age,id FROM student WHERE age IN (18,100);
IS NULL #表达式取值为空
mysql> SELECT name,age,sex FROM student WHERE sex IS NULL;
IS NOT NULL #表达式取值不为空
LIKE:
%: 任意长度的任意字符;
_:任意单个字符;
RLIKE:
REGEXP:匹配字符串可用正则表达式书写模式;
逻辑操作符:
NOT #|
AND #&&
OR #|| 或
XOR #亦或,二者不同则为真,相同则为假
GROUP:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算:
avg(), max(), min(), count(), sum()
mysql> SELECT * FROM student GROUP BY sex;
mysql> SELECT avg(age) FROM student GROUP BY sex;
HAVING: 对分组聚合运算后的结果指定过滤条件;
mysql> SELECT avg(age) as aage,sex FROM student GROUP BY sex HAVING aage>20;
#aage 定义的字段别名
mysql> SELECT count(id) AS NOS FROM student GROUP BY id;
mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id;
mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id HAVING NOS>2;
ORDER BY: 根据指定的字段对查询结果进行排序;
默认为升序
升序:ASC
降序:DESC
mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id HAVING NOS>2 ORDER BY NOS;
mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id HAVING NOS>2 ORDER BY age DESC;
LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制;
#offset 偏移量 #row_count 显示多少行
mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id LIMIT 10;
+-----+----+
| NOS | id |
+-----+----+
| 1 | 1 |
| 1 | 4 |
| 1 | 8 |
| 1 | 9 |
| 1 | 10 |
| 1 | 11 |
| 1 | 12 |
| 1 | 13 |
| 1 | 16 |
| 1 | 17 |
+-----+----+
10 rows in set (0.00 sec)
mysql> SELECT count(id) AS NOS,id FROM student GROUP BY id LIMIT 10,10;
+-----+----+
| NOS | id |
+-----+----+
| 1 | 18 |
| 1 | 19 |
| 1 | 20 |
+-----+----+
3 rows in set (0.00 sec)
对查询结果中的数据请求施加“锁”:
[FOR UPDATE | LOCK IN SHARE MODE]]
FOR UPDATE: 写锁,排他锁,独占锁;
LOCK IN SHARE MODE: 读锁,共享锁
多表查询:
交叉连接:笛卡尔乘积;
mysql> SELECT FROM student,study_record;
内连接:
等值连接:让表之间的字段以“等值”建立连接关系;
mysql> SELECT FROM students,teachers WHERE student,TeacherID=teachers.TID
不等值连接
自然连接
自连接
外连接:
左外连接:
FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
右外连接
FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
子查询:在查询语句嵌套着查询语句
基于某语句的查询结果再次进行的查询
用在WHERE子句中的子查询:
(1) 用于比较表达式中的子查询;子查询仅能返回单个值;
mysql> SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students);
mysql> SELECT avg(age) FROM student WHERE age>(SELECT avg(age) FROM student);
(2) 用于IN中的子查询:子查询应该单键查询并返回一个或多个值从构成列表;
mysql> SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
(3) 用于EXISTS;
用于FROM子句中的子查询;
使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;
示例:
mysql> SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;
联合查询:UNION
mysql> SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;
以上是关于DML数据操作语言的主要内容,如果未能解决你的问题,请参考以下文章