自学内容网 自学内容网

mysql(2)

目录

一. DQL

1. 条件查询

1.1 比较条件

1.2 逻辑运算条件

1.3 模糊查询

1.4 between and 条件

1.5 in 条件 

1.6 is null 或 is not null 条件

2. 查询合并

2.1 union和union all

3. 排序

3.1 order by

4. 数量限制

5.分组查询

5.1 having 条件

二. 多表设计

1. 数据库设计范式

2. 外键

3. 添加外键约束

3.1 通过修改表结构添加外键约束

3.2 在创建表时添加外键约束

三. 关联查询

3.1 内连接

3.2 左外连接

3.3 右外连接

3.4 自连接

四. 子查询

1. 标量子查询

2. 列子查询

3. 表子查询


一. DQL

1. 条件查询

条件查询:使用where将不满足条件的行过滤掉,where一般紧跟在from子句后面

语法: select <结果> from <表名> where <条件>

1.1 比较条件

(1) 等于 =

从学生表中查询学号等于1的学生信息

-- 从学生表中查询学号为1的学生信息
SELECT * FROM student WHERE num = 1

(2) 不等于 != 或 <>

从学生表中查询,性别不等于男的学生信息

-- 从学生表中查询,性别不等于男的学生信息
SELECT * FROM student WHERE gender != '男'
SELECT * FROM student WHERE gender <> '男'

(3) 大于 >

从学生表中查询身高大于1.70的学生信息

-- 从学生表中查询身高大于1.70的学生信息
SELECT * FROM student WHERE height > 1.70

(4) 小于 <

 从学生表中查询身高小于1.70的学生信息

-- 从学生表中查询身高大于1.70的学生信息
SELECT * FROM student WHERE height < 1.70

(5) 大于等于 >=

从学生表中查询身高大于等于1.80的学生信息

-- 从学生表中查询身高大于等于1.80的学生信息
SELECT * FROM student WHERE height >=1.80

(6) 小于等于 <=

 从学生表中查询身高大于等于1.80的学生信息

-- 从学生表中查询身高大于等于1.80的学生信息
SELECT * FROM student WHERE height <=1.80

1.2 逻辑运算条件

(1) 与 and (所有条件都需要满足)

从学生表中查询性别为男,并且身高大于1.80的学生信息

-- 从学生表中查询性别为男,并且身高大于1.80的学生信息
SELECT * FROM student WHERE gender = '男' AND height>=1.80

(2) 或 or (只需满足一个条件即可)

从学生表中查询性别为男或者身高大于等于1.70

-- 从学生表中查询性别为男或者身高大于等于1.70
SELECT * FROM student WHERE gender = '男' OR height>=1.70

(3)非 not (取反)

从学生表中查询身高不在1.75,1.85,1.95之间的学生信息

注意:IN()查询只包含括号里的数据

-- 从学生表中查询身高不在1.75,1.85,1.95之间的学生信息
SELECT * FROM student WHERE height NOT IN(1.75,1.85,1.95)

1.3 模糊查询

模糊查询:通过like  %字符%  来查询数据,%是通配符

-- 查询名字以张开头的学生信息
SELECT * FROM student WHERE NAME LIKE '张%'

-- 查询名字中包含三的学生信息
SELECT * FROM student WHERE NAME LIKE '%三%'

1.4 between and 条件

between and就相当于大于等于和小于等于的关系(值1 <= 数据 <= 值2),包含临界值

查询身高在1.70和2.0之间的学生信息

-- BETWEEN 1.70 AND 2.0 == height>=1.70 AND height<=2.0
SELECT * FROM student WHERE height BETWEEN 1.70 AND 2.0

1.5 in 条件 

in:判断某字段的值是否是in列表中的某一项(相当于or)

查询身高在1.75,1.85,1.95之间的学生信息

-- 查询身高 1.75 1.85 1.95
SELECT * FROM student WHERE height=1.75 OR height=1.85 OR height = 1.95

SELECT * FROM student WHERE height IN(1.75,1.85,1.95)

查询身高不在1.75,1.85,1.95之间的的学生信息

-- 查询身高不在1.75,1.85,1.95之间的的学生信息
SELECT * FROM student WHERE height NOT IN(1.75,1.85,1.95)

1.6 is null 或 is not null 条件

查询地址为空的学生信息

-- 查询地址为空的学生信息
SELECT * FROM student WHERE address IS NULL

查询地址不为空的学生信息

-- 查询地址不为空的学生信息
SELECT * FROM student WHERE address IS NOT NULL

2. 查询合并

2.1 union和union all

union用于将多条SQL语句的结果表合并为一张表,要求多个SQL语句的结果表的列是相同的

union all和union的用法相同,但两者有区别

区别: 

union会将两张表中都出现的学生信息去重

union all不会去重,只合并

-- 将性别为男和性别为女的学生信息合并
SELECT num,NAME,gender FROM student WHERE gender = '男'
 UNION  
SELECT num,NAME,gender FROM student WHERE gender = '女'

-- 将性别为男和性别为女的学生信息合并
SELECT num,NAME,gender FROM student WHERE gender = '男'
 UNION  ALL
SELECT num,NAME,gender FROM student WHERE gender = '女'

-- 将性别为男和身高等于1.65的学生信息合并
SELECT num,NAME,gender FROM student WHERE gender = '男'
 UNION  
SELECT num,NAME,gender FROM student WHERE  height = 1.65



-- nuion all 合并多个查询结果  只是合并,不去重
-- 将性别为男,身高为1.65和1.75的学生信息合并
SELECT num,NAME,gender FROM student WHERE gender = '男'
 UNION  ALL
SELECT num,NAME,gender FROM student WHERE  height = 1.65
  UNION ALL
SELECT num,NAME,gender FROM student WHERE  height = 1.75

3. 排序

3.1 order by

在MySQL中可以利用order by来对查询的结果进行排序,默认是升序,也可以指定升序(ASC)和降序(DESC)

(1) 按身高进行排序(升序)

-- 按身高进行排序,默认是升序
SELECT * FROM student ORDER BY height
-- 也可以用ASC指定升序
SELECT * FROM student ORDER BY birthday ASC

(2) 按身高进行排序(降序)

-- 利用DESC实现降序排序
SELECT * FROM student ORDER BY height DESC

(3)对身高1.80以上的人,先按生日升序排列,生日相同按身高降序排列(多条件排序)

-- 对身高1.80以上的人,先按生日升序排列,生日相同按身高降序排列
SELECT * FROM student WHERE height>1.80 ORDER BY  birthday ASC,height DESC

注意:

什么排序方式都没有,默认按主键升序排列

4. 数量限制

在MySQL中可以利用limit来对查询的结果进行数量限制(一次只看部分查询结果),limit一般跟在SQL的末尾

使用方法:limit 0,2从结果的第0条数据开始看,看两条数据

一般可以利用limit实现分页操作,如下

-- 数量限制  limit 开始位置(开始位置为0),查询的数量
-- 实际使用场景, 数据分页显示   一次只查询一部分数据, 提高查询效率
SELECT * FROM  student LIMIT 0,2   -- 1   当前页码 n
SELECT * FROM  student LIMIT 2,2   -- 2
SELECT * FROM  student LIMIT 4,2   -- 3
-- limit (n-1)*2,2

5.分组查询

分组查询:

将某类数据分到一个组中进行处理,就是利用group by对表进行分组,查询出自己想要的结果,还可对结果继续处理,在分组查询中还可以利用分组函数

语法:

select 分组函数,列(必须出现在 group by后面)

from 表名

[where 筛选条件]

group by分组列表

[having 分组后的筛选]

[order by 子句]

(1) 统计男生女生人数

-- 统计男生女生人数
SELECT gender,COUNT(*) FROM student GROUP BY gender

(2) 分别计算男女的身高总和,平均身高,身高的最大值

--分别计算男女的身高总和,平均身高,身高的最大值

--身高总和
SELECT gender,SUM(height) FROM student GROUP BY gender

-- 身高平均值
SELECT gender,AVG(height) FROM student GROUP BY gender

-- 身高最大值
SELECT gender,MAX(height),gender FROM student GROUP BY gender

(3) 统计每年出生人数,并按照年份从小到大输出

-- 统计每年出生人数,并按照年份从小到大输出
SELECT YEAR(birthday) ,COUNT(*)FROM student GROUP BY YEAR(birthday) ORDER BY YEAR(birthday)

5.1 having 条件

having用于对分组后的表进行条件筛选,注意和where区分

where:对原始表进行条件限制,筛选出符合条件的信息

having:对分组后的表进行条件限制,筛选出符合条件的信息

二. 多表设计

1. 数据库设计范式

设计好的数据库事半功倍,所以数据库的设计一般遵循以下三个范式

第一范式:表中的每一列都不可再分(原子性)

第二范式:每个表中都要有主键

第三范式:当两张表或多张表之间有关系时,应该将一个表的主键设置到另一张表中,而其他信息不用添加,以免重复

2. 外键

外键:就是在一个表中设置一列用来存储另一个表中的主键信息(两表相关联),就称该列为外键

注意:

(1)一个表中的外键必须存储的是另一个表中的主键,也就是外键必须与主键相关联,且数据类型一致

(2)有了外键就不需要在该表中存储另一张表的其他信息,因为可以通过外键找到另一张表的信息

3. 添加外键约束

为什么要添加外键约束,这是因为,我们有了外键,就表示两张表之间有了关系,那么就不能随意的对表中的信息进行删除.比如

有学生表和专业表且两者之间有关联,很多学生都选了这个专业,那我们就不能直接将该专业删除掉,不然那些学生就不能通过外键找到与之对应的专业了,要想删除专业,必须确保该专业没有人选,才能删除

综上,我们添加外键约束的原因,主要是为了保持数据的完整性,避免随意删除数据

3.1 通过修改表结构添加外键约束

ALTER TABLE student ADD CONSTRAINT fk_student_major_on_majorid FOREIGN KEY(majorid) REFERENCES major(id)

解释:

(1)ALTER TABLE 表名 ADD CONSTRAINT

是固定格式,表示要修改某张表,为其添加约束

(2)fk_student_major_on_majorid

是外键约束名,需要程序员自己起

外键约束名一般要遵循命名规则,程序员默认命名规则

fk_foreignTable_primaryTable_on_foreignColumn

foreignTable是外键表的名字

primaryTable是主键表的名字

foreignColumn是外键名

(3)FOREIGN KEY(majorid) REFERENCES major(id)

原格式:FOREIGN KEY(外键)  REFERENCES Table(主键)

FOREIGN KEY(majorid)表示是给外键majorid添加的外键约束,REFERENCES major(id)表示外键约束和major表中的id关联

注意:

(1) 添加外键约束时,要保证外键和主键的数据类型一致

(2) 添加外键约束时,外键里的值必须在主键中都存在

不满足上面两点外键约束加不上去

3.2 在创建表时添加外键约束

我们通过一个学生选课案例来说明.现在有一个学生表,一个课程表,由于一个学生可以选择多个课程,多个课程也可以被不同学生选择,所以这是多对多的关系,我们不能通过上面那种简单的给学生信息表中加外键的方式解决(这种方式只能解决一对多或多对一的关系),而是要再专门创建一个学生课程表,存储学生id和课程id,因为学生id和课程id在学生表和课程表中都是主键,所以在学生课程表中就是外键,为了保持学生信息的完整性,给学生id和课程id添加外键约束

CREATE TABLE student_course(
id INT PRIMARY KEY AUTO_INCREMENT,
student_num INT,
course_id INT,
CONSTRAINT fk_student_course_student_on_student_num FOREIGN KEY(student_num)REFERENCES student(num),
CONSTRAINT fk_student_course_course_on_course_id FOREIGN KEY(course_id) REFERENCES course(id)
)

注意:在创建表时添加外键,只用写CONSTRAINT和后面的内容,不用写前面修改表结构的部分

三. 关联查询

关联查询:又称多表查询,当我们想要的数据来自多张表时,就要用到关联查询,否则会发生笛卡尔积的现象(表一有m行,表二有n行,结果=m*n行)

发生原因:没有有效的连接条件

如何解决:添加有效的连接条件

关联查询按功能分

1.自连接

2.内连接

3.外连接,外连接又分为左外连接和右外连接

3.1 内连接

内连接:只把满足条件的两张表的交集求出来,不满足条件的不输出

语法:select * from 表1 inner join 表2 on 表1.column1=表2.column2

-- 内连接,只把满足条件的筛选出来
-- 在学生表和专业表中查询学生id和专业id相等的学生信息,也就是哪个学生是哪个专业的

--写法一
SELECT * FROM student,major WHERE majorid=id

--写法二
SELECT
s.num,
s.name,
s.gender,
m.name 
FROM student s INNER JOIN major m ON s.majorid = m.id

3.2 左外连接

左外连接:把左边表中所有的数据查询出来,右边表中只会查询出满足条件的

语法:select * from 表1 left join 表2 on 表1.column1=表2.column2

-- 左外连接    把左边表中所有的数据查询出来, 右边表中只会查询出满足条件的
-- 在学生表和专业表中查询学生id和专业id相等的学生信息,也就是哪个学生是哪个专业的
-- 包含没选专业的学生
SELECT
s.num,
s.name,
s.gender,
m.name
FROM student s LEFT JOIN major m ON s.majorid=m.id

3.3 右外连接

右外连接:把右边表中所有的数据查询出来,左边表中只会查询出满足条件的

语法:select * from 表1 right join 表2 on 表1.column1=表2.column2

3.4 自连接

自连接就是这张表自己和自己用笛卡尔积的形式进行拼接,我们可以用条件筛选出我们想要的数据

-- 根据中国地域表,查询汉台区的市和省
SELECT a1.name,a2.name,a3.name FROM AREA a1 INNER JOIN AREA a2 ON a1.pid = a2.id
                      INNER JOIN AREA a3 ON a2.pid = a3.id
                      WHERE a1.name = '汉台区'

四. 子查询

子查询:在一个查询语句中又出现了查询语句

1. 标量子查询

标量子查询:结果集是一行一列的

查询身高最高的学生

SELECT * FROM student WHERE height=(SELECT MAX(height) FROM student)

2. 列子查询

列子查询:结果集是一列多行的

查询身高是1.75,1.85,1.95的学生信息

SELECT * FROM student WHERE height IN (SELECT height FROM student WHERE height = 1.75 OR height = 1.85 OR height = 1.95)

3. 表子查询

表子查询:结果集是多行多列的,是一张表

查询姓名重复的学生

SELECT * FROM (SELECT NAME,COUNT(*)AS c FROM student GROUP BY NAME)AS t WHERE t.c>1

一般where后面跟标量子查询和列子查询,from后跟表子查询


原文地址:https://blog.csdn.net/qq_64782704/article/details/140414175

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!