DML语句
DML:
DML:针对数据行增删查改的语言,由于查询的SQL语句较多,所以查询语句又分出来叫做DQL。
主键:
每张表有且只有一个主键 。
主键:主键上的数据不能重复且不能为null ,主键上的数据相当于该数据行的唯一标识。
PRIMARY KEY -----> 主键
auto_increment ----> 自动增长
sql
# PRIMARY KEY - 主键
# auto_increment - 自动增长
CREATE TABLE student(
id INT(3) PRIMARY KEY auto_increment,
name VARCHAR(32),
sex VARCHAR(32),
age INT(3),
salary FLOAT(8,2),
course VARCHAR(32)
)
添加数据:
sql
# 方式一
INSERT INTO student VALUES(1,'小明','男',23,10000,'Java');
sql
# 方式二
INSERT INTO student VALUES(1,'小明','男',23,10000,'Java'),(2,'小黑','男',20,12000,'Java');
sql
# 方式三
INSERT INTO student(name,sex,age,salary,course) VALUES('小明','男',23,10000,'Java');
删除数据:
清空表数据 :
sql
#方式一:清空数据后,再次添加,id会从1开始。
TRUNCATE student;
sql
#方式二:清空数据后,再次添加,id会继续递增。
DELETE FROM student;
注意:清空数据推荐使用第二种方式,因为删除的数据如果恢复后,id不会冲突。
单条件删除:
sql
DELETE FROM student WHERE id=5;
DELETE FROM student WHERE salary<=5000;
多条件删除:
OR ---->或
AND ---->与
sql
DELETE FROM student WHERE sex='女' OR course='Python';
sql
DELETE FROM student WHERE sex='女' AND course='Java';
sql
DELETE FROM student WHERE course IN('Python','HTML');
修改数据:
修改所有数据:
sql
# 修改所有数据
UPDATE student SET salary=10000;
单条件修改:
sql
# 单条件修改
UPDATE student SET salary = 20000 WHERE id=3;
sql
# 修改多个数据
UPDATE student SET age=21,salary=50000 WHERE id=3;
多条件修改:
sql
# 多条件修改
UPDATE student SET salary=30000 WHERE sex='女' OR course='Python';
sql
UPDATE student SET salary=40000 WHERE sex='女' AND course='Java';
sql
UPDATE student SET salary=10000 WHERE course IN('Python','HTML');
查询数据(DQL):
sql
# 查询所有字段
SELECT * FROM student;
查询指定字段:
sql
# 查询指定字段
SELECT name,sex,age FROM student;
sql
# 查询指定字段 + 别名
SELECT name AS '姓名',sex AS '性别',age AS '年龄' FROM student;
去重查询:
sql
# 去重查询
# 查询学科
SELECT DISTINCT course FROM student;
单条件查询:
sql
# 单条件查询
SELECT * FROM student WHERE id=3;
多条件查询:
sql
# 多条件查询
SELECT * FROM student WHERE sex='女' OR course='Python';
sql
SELECT * FROM student WHERE sex='女' AND course='Java';
sql
SELECT * FROM student WHERE course IN('Java','Python');
模糊查询:
%表示没有或多个字符。
_ 代表一位字符。
sql
# 需求1:查询出姓名中带'华'字的数据
SELECT * FROM student WHERE name LIKE '%华%';
sql
# 需求2:查询出姓名中第四个带'华'字的数据
SELECT * FROM student WHERE name LIKE '___华';
排序:
ORDER BY表示排序。
ASC表示升序,DESC表示降序。
单字段排序:
sql
# 需求1:按照年龄排序 - 升序
SELECT * FROM student ORDER BY age ASC;
sql
# 需求2:按照工资排序 - 降序
SELECT * FROM student ORDER BY salary DESC;
多字段排序:
sql
# 需求:按照年龄排升序,年龄一致按照工资排降序
SELECT * FROM student ORDER BY age ASC,salary DESC;
限制查询:
sql
# 需求:查询出工资最高的学生信息
SELECT * FROM student ORDER BY salary DESC LIMIT 1;
分页查询:
sql
# SELECT * FROM student LIMIT 偏移量,数据条数;
SELECT * FROM student LIMIT 0,5;# 第1页
SELECT * FROM student LIMIT 5,5;# 第2页
SELECT * FROM student LIMIT 10,5;# 第3页
分页公式:SELECT * FROM student LIMIT (当前页-1)*数据条数,数据条数;
聚合查询:
函数 | 作用 |
---|---|
sum | 求和 |
count | 统计总数 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sql
# 需求1:获取学生的总工资
SELECT SUM(salary) FROM student;
sql
# 需求2:获取学生的平均工资(保留2位小数)
SELECT FORMAT(AVG(salary),2) FROM student;
sql
# 需求3:获取学生的最高工资
SELECT MAX(salary) FROM student;
sql
# 需求4:获取学生的最低工资
SELECT MIN(salary) FROM student;
sql
# 需求5:获取学生个数
#id是主键,不为空。count()不能统计为空(null)的行。
SELECT COUNT(id) FROM student;
count(*):是表示所有的行。
count(1):计算一共有多少符合条件的行,不会忽略null值。
count(列名):查询列名那一列的,字段为null不统计。
子查询:
sql
# 需求:查询出工资最高的学生信息
SELECT * FROM student WHERE salary = (SELECT MAX(salary) FROM student);
分组查询:
sql
# 需求1:查询出各个学科的平均工资
SELECT course,AVG(salary) FROM student GROUP BY course;
sql
# 需求2:查询出平均工资大于10000的学科
SELECT course,AVG(salary) FROM student GROUP BY course HAVING AVG(salary)>10000;
多表联合查询:
多表查询分为:
- 一对一
- 一对多
- 多对多
一对多:
创建场景:
sql
# 创建老师表,并插入数据
CREATE TABLE teacher(
id INT(3) PRIMARY KEY auto_increment,
name VARCHAR(32)
)
INSERT INTO teacher(name) VALUES('何老师');
INSERT INTO teacher(name) VALUES('苍老师');
INSERT INTO teacher(name) VALUES('多老师');
sql
# 创建学生表,并插入数据
CREATE TABLE student(
id INT(3) PRIMARY KEY auto_increment,
name VARCHAR(32),
t_id INT(3)
)
INSERT INTO student(name,t_id) VALUES('小明',1);
INSERT INTO student(name,t_id) VALUES('小黑',1);
INSERT INTO student(name,t_id) VALUES('小白',1);
INSERT INTO student(name,t_id) VALUES('小林',2);
INSERT INTO student(name,t_id) VALUES('小灰',2);
INSERT INTO student(name) VALUES('小蓝');
内链接 :
内连接,也被称为自然连接 ,只有两个表相匹配的行才能在结果集中出现。返回的结果集选取了两个表中所有相匹配的数据,舍弃了不匹配的数据。
sql
# 方式一
SELECT s.name,t.name FROM student s,teacher t WHERE s.t_id=t.id;
sql
# 方式二
SELECT s.name AS '学生姓名',t.name AS '老师姓名' FROM student s INNER JOIN teacher t ON s.t_id=t.id;
外连接:
外连接不仅包含符合连接条件的行,还包含左表(左连接时)、右表(右连接时)或两个边接表(全外连接)中的所有数据行。
左连接:
左连接:针对于左边表去查询,会展示左边表中的所有数据。
LEFT JOIN
sql
SELECT s.name,t.name FROM student s LEFT JOIN teacher t ON s.t_id=t.id;
右链接:
右链接:针对于右边表去查询,会展示右边表中的所有数据。
RIGHT JOIN
sql
SELECT s.name,t.name FROM student s RIGHT JOIN teacher t ON s.t_id=t.id;
全连接:
全连接:多张表联合查询,多张表没有联系的数据都查询出来。
注意:MySQL没有全连接的SQL语句,实现全连接的思想就是合并查询结果 + 去重。
sql
# 合并查询结果
SELECT s.name,t.name FROM student s LEFT JOIN teacher t ON s.t_id=t.id
UNION ALL
SELECT s.name,t.name FROM student s RIGHT JOIN teacher t ON s.t_id=t.id;
sql
# 合并查询结果 + 去重
SELECT s.name,t.name FROM student s LEFT JOIN teacher t ON s.t_id=t.id
UNION
SELECT s.name,t.name FROM student s RIGHT JOIN teacher t ON s.t_id=t.id;
多对多:
创建学生表,并插入数据。
sql
# 创建学生表,并插入数据
CREATE TABLE student(
id INT(3) PRIMARY KEY auto_increment,
name VARCHAR(32)
)
INSERT INTO student(name) VALUES('小明');
INSERT INTO student(name) VALUES('小黑');
INSERT INTO student(name) VALUES('小红');
创建学科表,并插入数据
sql
# 创建学科表,并插入数据
CREATE TABLE course(
id INT(3) PRIMARY KEY auto_increment,
name VARCHAR(32)
)
INSERT INTO course(name) VALUES('语文');
INSERT INTO course(name) VALUES('数学');
INSERT INTO course(name) VALUES('英语');
创建成绩表,并插入数据
sql
# 创建成绩表,并插入数据
CREATE TABLE scores(
id INT(3) PRIMARY KEY auto_increment,
s_id INT(3),
c_id INT(3),
score FLOAT(4,1)
)
INSERT INTO scores(s_id,c_id,score) VALUES(1,1,90);
INSERT INTO scores(s_id,c_id,score) VALUES(1,2,91);
INSERT INTO scores(s_id,c_id,score) VALUES(1,3,92);
INSERT INTO scores(s_id,c_id,score) VALUES(2,1,93);
INSERT INTO scores(s_id,c_id,score) VALUES(2,2,94);
INSERT INTO scores(s_id,c_id,score) VALUES(2,3,95);
INSERT INTO scores(s_id,c_id,score) VALUES(3,1,85);
INSERT INTO scores(s_id,c_id,score) VALUES(3,2,87);
INSERT INTO scores(s_id,c_id,score) VALUES(3,3,86);
需求1:查询学生对应的学科成绩(学生姓名,学科名,成绩)。
sql
SELECT stu.name,cou.name,sco.score FROM student stu INNER JOIN course cou INNER JOIN scores sco WHERE sco.s_id=stu.id AND sco.c_id=cou.id;
需求2:查询出每个学生的平均成绩(学生姓名,平均分)。
sql
SELECT stu.name,AVG(sco.score) FROM scores sco INNER JOIN student stu ON sco.s_id=stu.id GROUP BY sco.s_id;
需求3:查询出每个学生的最好成绩的学科(学生姓名,学科目,成绩)。
sql
SELECT stu.name,cou.name,sco.score FROM scores sco INNER JOIN
(SELECT sco.s_id,max(sco.score) AS 'maxScore' FROM scores sco GROUP BY sco.s_id)
xx INNER JOIN student stu INNER JOIN course cou ON sco.score =xx.maxScore AND sco.s_id=xx.s_id AND sco.s_id=stu.id AND sco.c_id = cou.id;