DML语句

DML:

DML:针对数据行增删查改的语言,由于查询的SQL语句较多,所以查询语句又分出来叫做DQL。

 
 

主键:

每张表有且只有一个主键
 
主键:主键上的数据不能重复且不能为null,主键上的数据相当于该数据行的唯一标识。
 
PRIMARY KEY -----> 主键

auto_increment ----> 自动增长

# 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)
)

 
 

添加数据:

# 方式一
INSERT INTO student VALUES(1,'小明','男',23,10000,'Java');

 

# 方式二
INSERT INTO student VALUES(1,'小明','男',23,10000,'Java'),(2,'小黑','男',20,12000,'Java');

 

# 方式三
INSERT INTO student(name,sex,age,salary,course) VALUES('小明','男',23,10000,'Java');

 

 

删除数据:

清空表数据 :

#方式一:清空数据后,再次添加,id会从1开始。
TRUNCATE student;

 

#方式二:清空数据后,再次添加,id会继续递增。
DELETE FROM student;

注意:清空数据推荐使用第二种方式,因为删除的数据如果恢复后,id不会冲突。

 

单条件删除:

DELETE FROM student WHERE id=5;
DELETE FROM student WHERE salary<=5000;

 

多条件删除:

OR ---->或

AND ---->与

DELETE FROM student WHERE sex='女' OR course='Python';

 

DELETE FROM student WHERE sex='女' AND course='Java';

 

DELETE FROM student WHERE course IN('Python','HTML');

 
 

修改数据:

修改所有数据:

# 修改所有数据
UPDATE student SET salary=10000;

 
 

单条件修改:

# 单条件修改
UPDATE student SET salary = 20000 WHERE id=3;

 

# 修改多个数据
UPDATE student SET age=21,salary=50000 WHERE id=3;

 
 

多条件修改:

# 多条件修改
UPDATE student SET salary=30000 WHERE sex='女' OR course='Python';

 

UPDATE student SET salary=40000 WHERE sex='女' AND course='Java';

 

UPDATE student SET salary=10000 WHERE course IN('Python','HTML');

 

查询数据(DQL):

# 查询所有字段
SELECT * FROM student;

 

查询指定字段:

# 查询指定字段
SELECT name,sex,age FROM student;

 

# 查询指定字段 + 别名
SELECT name AS '姓名',sex AS '性别',age AS '年龄' FROM student;

 
 

去重查询:

# 去重查询
# 查询学科
SELECT DISTINCT course FROM student;

 
 

单条件查询:

# 单条件查询
SELECT * FROM student WHERE id=3;

 

多条件查询:

# 多条件查询
SELECT * FROM student WHERE sex='女' OR course='Python';

 

SELECT * FROM student WHERE sex='女' AND course='Java';

 

SELECT * FROM student WHERE course IN('Java','Python');

 

模糊查询:

%表示没有或多个字符。

_ 代表一位字符。

# 需求1:查询出姓名中带'华'字的数据
SELECT * FROM student WHERE name LIKE '%华%';

 

# 需求2:查询出姓名中第四个带'华'字的数据
SELECT * FROM student WHERE name LIKE '___华';

 

排序:

ORDER BY表示排序。

ASC表示升序,DESC表示降序

 

单字段排序:
# 需求1:按照年龄排序 - 升序
SELECT * FROM student ORDER BY age ASC;

 

# 需求2:按照工资排序 - 降序
SELECT * FROM student ORDER BY salary DESC;

 

多字段排序:
# 需求:按照年龄排升序,年龄一致按照工资排降序
SELECT * FROM student ORDER BY age ASC,salary DESC;

 

限制查询:

# 需求:查询出工资最高的学生信息
SELECT * FROM student ORDER BY salary DESC LIMIT 1;

 

分页查询:

# 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 平均值
# 需求1:获取学生的总工资
SELECT SUM(salary) FROM student;

 

# 需求2:获取学生的平均工资(保留2位小数)
SELECT FORMAT(AVG(salary),2) FROM student;

 

# 需求3:获取学生的最高工资
SELECT MAX(salary) FROM student;

 

# 需求4:获取学生的最低工资
SELECT MIN(salary) FROM student;

 

# 需求5:获取学生个数
#id是主键,不为空。count()不能统计为空(null)的行。
SELECT COUNT(id) FROM student;

count(*):是表示所有的行。

count(1):计算一共有多少符合条件的行,不会忽略null值。

count(列名):查询列名那一列的,字段为null不统计。

 

子查询:

# 需求:查询出工资最高的学生信息
SELECT * FROM student WHERE salary = (SELECT MAX(salary) FROM student);

 

分组查询:

# 需求1:查询出各个学科的平均工资
SELECT course,AVG(salary) FROM student GROUP BY course;

 

# 需求2:查询出平均工资大于10000的学科
SELECT course,AVG(salary) FROM student GROUP BY course HAVING AVG(salary)>10000;

 

多表联合查询:

多表查询分为:

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

 

一对多:

创建场景:
# 创建老师表,并插入数据
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('多老师');

 

# 创建学生表,并插入数据
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('小蓝');

 

内链接 :

内连接,也被称为自然连接,只有两个表相匹配的行才能在结果集中出现。返回的结果集选取了两个表中所有相匹配的数据,舍弃了不匹配的数据

# 方式一
SELECT s.name,t.name FROM student s,teacher t WHERE s.t_id=t.id;

 

# 方式二
SELECT s.name AS '学生姓名',t.name AS '老师姓名' FROM student s INNER JOIN teacher t ON s.t_id=t.id;

 

外连接:

外连接不仅包含符合连接条件的行,还包含左表(左连接时)、右表(右连接时)或两个边接表(全外连接)中的所有数据行

 

左连接:

左连接:针对于左边表去查询,会展示左边表中的所有数据。

LEFT JOIN

SELECT s.name,t.name FROM student s LEFT JOIN teacher t ON s.t_id=t.id;

 

右链接:

右链接:针对于右边表去查询,会展示右边表中的所有数据。

RIGHT JOIN

SELECT s.name,t.name FROM student s RIGHT JOIN teacher t ON s.t_id=t.id;

 

全连接:

全连接:多张表联合查询,多张表没有联系的数据都查询出来。

注意:MySQL没有全连接的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;

 

# 合并查询结果 + 去重
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;

 

多对多:

创建学生表,并插入数据。

# 创建学生表,并插入数据
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('小红');

 

创建学科表,并插入数据

# 创建学科表,并插入数据
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('英语');

 

创建成绩表,并插入数据

# 创建成绩表,并插入数据
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:查询学生对应的学科成绩(学生姓名,学科名,成绩)。

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:查询出每个学生的平均成绩(学生姓名,平均分)。

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:查询出每个学生的最好成绩的学科(学生姓名,学科目,成绩)。

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;

相关推荐

  1. DDLDML语句

    2024-06-11 14:04:02       4 阅读
  2. 03--DMLDQL语句

    2024-06-11 14:04:02       22 阅读
  3. 数据库(SQL语句DML&&DQL

    2024-06-11 14:04:02       27 阅读
  4. MySQL:DDLDML语句

    2024-06-11 14:04:02       17 阅读
  5. DML语句

    2024-06-11 14:04:02       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-11 14:04:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-11 14:04:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-11 14:04:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-11 14:04:02       20 阅读

热门阅读

  1. CPASSOC代码详解

    2024-06-11 14:04:02       11 阅读
  2. nltk下载报错

    2024-06-11 14:04:02       9 阅读
  3. 拼多多销量清零吗?销量排行榜哪里看?

    2024-06-11 14:04:02       9 阅读
  4. 【AI赋能消费电子——COMPUTEX 2024专题】

    2024-06-11 14:04:02       12 阅读
  5. Qt_显示VTK和PCL

    2024-06-11 14:04:02       7 阅读