一、什么是DML语句
DML语句是在日常工作中使用最多的语句,包含了insert、delete、update、select,也就是对每列字段中的数据进行增删改查。也有把select单独划为DQL的,因为它的使用最为复杂,会配合许多子句和函数一起使用。
二、MySQL的增删改语句
1、MySQL数据的插入——INSERT语句
# INSERT INTO table1 VALUES =值1,=值2,=值n ; #插入单行数据
# INSERT INTO table2 [(字段1,字段2,字段3)] values (值1,值2,值3),(值1,值2,值3) ; #插入多行数据,每行数据需用括号分隔
# INSERT INTO table4 VALUES (3,'Lee',18) #没有指定列名,需要把每列数据都填入
INSERT INTO table3 (id,name,age) VALUES (11,'tom',20),(15,'jerry',25) #指定了3列要插入的字段,所以要插入对应三列数据
INSERT INTO table_new SELECT * FROM table_old; #复制table_old表数据到table_new
INSERT INTO table1 (id,name,age) SELECT id,name,age from table2 [where age>20]; #将另外表的查询结果插入到表中,字段需要一致
INSERT INTO table2 VALUES(1,'tanglu',NOW()) #通过函数插入数据
INSERT INTO table2 VALUES(1,'tanglu',default) #如果字段设有默认值,可以直接插入默认值
2、MySQL数据的删除——DELETE语句。相比drop table和truncate两种物理清除方式,delete是逻辑方式的逐行删除,磁盘空间和自增的值不会立即释放
# DELETE FROM 表名称 WHERE 列=值;
DELETE FROM student WHERE age=10; #删除student表中age列值为10的数据
DELETE FROM student ;#删除student表中所有数据 ,危险操作
3、MySQL数据的更新——UPDATE语句。
#UPDATE table1 SET 字段1=值1,[字段2=值2] WHERE 条件判断
UPDATE student SET age=21 WHERE age=10; #where条件一定不能忘,不然就全表更新了
三、MySQL查询语句
1、SELECT单表查询语法示例
SELECT * FROM table1 #查询table1这张表中所有数据
SELECT * FROM table1 table2; #同时从2个表中进行查询,然后实现比较等操作
SELCET name,age FROM student; #从表中查询指定列的数据,可以按列名先后顺序实现排序
SELECT name,LENGTH(name) FROM student #显示name列以及LENGTH函数统计到的长度列
SELECT * FROM family WHERE name = 'tanglu'; #使用where实现条件查询
SELECT * FROM family WHERE name like '%lu%'; #使用like实现模糊查询
SELECT salary FROM employee WHERE salary in (4000,5000,6000) #使用in实现集合查询
SELECT salary FROM employee WHERE salary BETWEEN 5000 AND 10000; #使用between实现范围查询
SELECT distinct name FROM zhangsan; #搜索结果去重,类似系统的uniq命令,只对单字段查询有效
SELECT name,salary FROM employee ORDER BY salary; #对搜索结果进行升序,降序的话是order by desc
SELECT * FROM student limit 0,1000 #使用limit限制搜索条数
SELECT name,salary,salary*14 AS annual_salary FROM employee; #AS用于定义别名,让查询结果显示更易懂,as关键词可以省略不写,由于执行顺序的问题as定义的别名不能用于where过滤
SELECT * FROM student WHERE age>10 AND height > 100; #条件查询中的逻辑组合
SELECT name,sex,salary FROM employee WHERE salary=(select max(salary) from employee); #子查询,可以理解为子查询的结果是一个值
2、SELECT多表连接查询示例
当需要的数据来自于多张表中、单个表无法满足查询需求时就需要使用多表连接查询。使用多表查询的效果就是把多个表中的数据按需查询出来然后拼接成一个单表,然后再进行其他的过滤等操作。在MySQL中用join语句进行多表连接,join分为自然连接、内连接、外连接(又分左外连接、右外连接)三类。
· 自然连接(natural join):取多张表的交集
select * from student1 natural join student2 ; #查询结果为student1和student2两张表的交集
· 内连接(inner join) :使用最多的多表连接类型,可简写为join
# 示例:通过两张表查询出用户张三的地址
# 分解:首先将两张表中需要用到的字段找出来,然后用关键词on指定用来做连接的字段,两个表中该字段需要一致
SELECT table1.name,table2.address FROM table1 JOIN tableb ON table1.id=table2.id WHERE table1.name='zhangsan'
#三张表的多表连接,适用于A表和C表没有直接关系时,用B表做中间表
SELECT student.sname,course,cname FROM student JOIN sc ON student.sno = sc.sno JOIN course ON sc.cno = course.cno where student.sname='zhangsan'
· 左外连接(left join):列出左表的全部记录+右边表部分数据
select table1.name,table2.name,table1.age,table2.sex from table1 left join table2 on table1.name=table2.name
· 右外连接(right join):和左外连接同理
3、子查询
子查询就是嵌套进行多次查询的一个过程,主要解决AVG等聚合函数不能写在where条件中的问题。但是因为性能消耗问题,子查询能不用就尽量不用。
select age,height from studeng where age > ( select avg(age) from student);
#示例2
select NOW() 当前时间,
(select COUNT(*) from 部门表) 部门数量,
(select COUNT(*) from 员工表) 员工人数
from dual;
#示例3