DML语句

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;

多表联合查询:

多表查询分为:

  1. 一对一
  2. 一对多
  3. 多对多

一对多:

创建场景:
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;
相关推荐
憨子周36 分钟前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
FIN技术铺2 小时前
Redis集群模式之Redis Sentinel vs. Redis Cluster
数据库·redis·sentinel
霖雨2 小时前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
SRY122404192 小时前
javaSE面试题
java·开发语言·面试
Fiercezm3 小时前
JUC学习
java
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言
ZIM学编程3 小时前
Java基础Day-Sixteen
java·开发语言·windows
我不是星海3 小时前
1.集合体系补充(1)
java·数据结构
内核程序员kevin3 小时前
在Linux环境下使用Docker打包和发布.NET程序并配合MySQL部署
linux·mysql·docker·.net
P.H. Infinity3 小时前
【RabbitMQ】07-业务幂等处理
java·rabbitmq·java-rabbitmq