type
status
date
slug
summary
tags
category
icon
password
本文概要
- 必备8个针对数据的SQL语句
- 表关系
- 授权
1、必备SQL语句
(1)条件查询
查询年龄大于30的员工信息
查询id在2到4之间
查询id是1 4 6的
查询id不是1 4 6的
找出depart表中id参数(这个只能有一个参数) 在info表中寻找
如果depart表中存在id=5 就把info表全部内容调出()
如果depart表中不存在id=5 就把info表全部内容调出()
从
info
表中筛选出所有 id > 5
且 age > 10
的记录。可以理解为它首先筛选 id > 5
的数据,然后在这个结果集中进一步筛选出 age > 10
的记录。可以看成这样
(2)通配符
一般用于对数据库表中的数据进行搜索,一般用于模糊搜索
%
%代指n个字符的意思
_
一个_代表一个字符的意思,两个下划线就代表两个字符
注意:数据量少,可以用通配符搜索,数据量大的搜索不能使用这种方法
(3)指定列(映射)
注意:此方法效率很低
这条 SQL 语句的作用是从
info
表中选择一些数据,并通过子查询从 depart
表中获取与之相关的 title
字段。下面是对这条 SQL 语句的详细解释:解释:
id, name
:- 直接从
info
表中选择id
和name
列。
(SELECT title FROM depart WHERE depart.id = 1) AS x1
:- 这是一个子查询。它从
depart
表中选择id
为1
的记录的title
列。 - 因为
depart.id = 1
是固定的,这个子查询在整个结果集中返回的title
是相同的,并且赋值给别名x1
。 - 换句话说,这个子查询在每一行结果中都返回
depart
表中id = 1
的title
。
(SELECT title FROM depart WHERE depart.id = info.depart_id) AS x2
:- 这个子查询也是从
depart
表中选择title
,但是它的WHERE
条件是动态的:depart.id
必须等于info.depart_id
。 - 这里的
info.depart_id
是指当前行info
表中的depart_id
值。 - 每一行结果都会根据
info
表中的depart_id
值,找到对应的depart
表中的title
并将其赋值给别名x2
。
FROM info
:- 这部分表示查询的基表是
info
,即所有的记录都会从info
表中提取。
示例:
假设
info
表中有以下数据:- id: 1, name: Wu, depart_id: 1
- id: 2, name: Yu, depart_id: 2
- id: 3, name: Alex, depart_id: 1
depart
表中有以下数据:- id: 1, title: 开发
- id: 2, title: 运营
在查询结果中:
x1
的值将始终是开发
,因为它是depart
表中id=1
的title
,固定不变。
x2
的值将根据每一行的depart_id
而变化,比如:- 对于
info
表中depart_id=1
的行,x2
的值为开发
。 - 对于
info
表中depart_id=2
的行,x2
的值为运营
。
总结:
- 这条 SQL 语句从
info
表中选择id
和name
,并通过两个子查询获取对应的title
: - 一个是
depart.id = 1
的固定title
,赋值给x1
。 - 另一个是动态根据
info.depart_id
获取的title
,赋值给x2
。
(4)case when(相当于 if… else…)
这段 SQL 代码使用了多个
CASE
表达式来根据不同的条件选择不同的值,并且为每个 CASE
结果都分配了别名 (v1
, v2
, v3
, v4
, v5
, v6
) 。这些 CASE
表达式用于根据 depart_id
和 age
字段的值来返回不同的结果。以下是对代码的详细解释:解释:
id, name
:- 从
info
表中直接选择id
和name
字段。
CASE depart_id WHEN 1 THEN "第1部门" END v1
:- 如果
depart_id
为1
,返回"第1部门"
,否则返回NULL
。 - 结果命名为
v1
。
CASE depart_id WHEN 1 THEN "第1部门" ELSE "其他" END v2
:- 如果
depart_id
为1
,返回"第1部门"
,否则返回"其他"
。 - 结果命名为
v2
。
CASE depart_id WHEN 1 THEN "第1部门" WHEN 2 THEN "第2部门" ELSE "其他" END v3
:- 如果
depart_id
为1
,返回"第1部门"
; - 如果
depart_id
为2
,返回"第2部门"
; - 否则返回
"其他"
。 - 结果命名为
v3
。
CASE WHEN age < 18 THEN "少年" END v4
:- 如果
age
小于18
,返回"少年"
,否则返回NULL
。 - 结果命名为
v4
。
CASE WHEN age < 18 THEN "少年" ELSE "油腻男" END v5
:- 如果
age
小于18
,返回"少年"
,否则返回"油腻男"
。 - 结果命名为
v5
。
CASE WHEN age < 18 THEN "少年" WHEN age < 30 THEN "青年" ELSE "油腻男" END v6
:- 如果
age
小于18
,返回"少年"
; - 如果
age
在18
到30
之间,返回"青年"
; - 否则返回
"油腻男"
。 - 结果命名为
v6
。
总结:
- 这段 SQL 代码从
info
表中选择id
和name
,然后通过CASE
表达式根据depart_id
和age
字段的值生成不同的输出,并为这些输出赋予别名 (v1
到v6
)。
- 每个
CASE
表达式根据特定的条件返回不同的结果,以便在查询结果集中得到不同的字段值。
(5)排序
表格:
- 表
depart
: id
: 部门的唯一标识符title
: 部门名称
- 表
info
: id
: 人员的唯一标识符name
: 人员姓名email
: 电子邮件age
: 年龄depart_id
: 对应depart
表中的部门ID
SQL查询:
- 按年龄降序排列:
从
info
表中选择所有记录,并按 age
字段降序排列。- 按年龄升序排列:
从
info
表中选择所有记录,并按 age
字段升序排列。- 按ID降序排列:
从
info
表中选择所有记录,并按 id
字段降序排列。- 按ID升序排列:
从
info
表中选择所有记录,并按 id
字段升序排列。- 先按年龄升序排列,再按ID降序排列:
从
info
表中选择所有记录,先按 age
字段升序排列,如果年龄相同,则按 id
字段降序排列。- 选择ID大于10的记录,按年龄升序并按ID降序排列:
从
info
表中选择 id
大于10的记录,并按 age
字段升序排列,再按 id
字段降序排列。- 选择ID大于6或名字包含‘y’的记录,按年龄升序并按ID降序排列:
从
info
表中选择 id
大于6或者 name
字段中包含字母 'y' 的记录,并按 age
字段升序排列,再按 id
字段降序排列。(6)取部分数据
表格描述
表 1: depart
id
: 部门的唯一标识符。
title
: 部门名称,如开发、运营、销售等。
表 2: info
id
: 人员的唯一标识符。
name
: 人员姓名。
email
: 电子邮件地址。
age
: 年龄。
depart_id
: 对应depart
表中的部门ID,用来表示该人员属于哪个部门。
SQL查询解释
- 获取前5条数据:
- 解释: 从
info
表中选择所有字段的数据,限制返回的结果数量为前5条记录。
- 按ID降序排列后,获取前3条数据:
- 解释: 从
info
表中选择所有字段的数据,首先按id
字段降序排列,然后返回前3条记录。
- 获取ID大于10的数据,按ID降序排列,取前3条:
- 解释: 从
info
表中选择所有字段的数据,条件是id
必须大于10,然后按id
字段降序排列,返回前3条记录。
- 跳过前2条数据,从第3条开始获取3条数据:
- 解释: 从
info
表中选择所有字段的数据,跳过前2条记录,从第3条记录开始返回3条数据。
可以用作网页翻页数据,假设一页十条数据
第一页:
select * from info limit 10 offset 0;
第二页:
select * from info limit 10 offset 10;
第三页:
select * from info limit 10 offset 20;
(7)分组
需求:对info表的数据通过年龄进行分组
图片显示了两个表格 (
depart
和 info
) 以及与之相关的两条 SQL 查询。以下是对图片中 SQL 代码的解释:表格描述
表 1: depart
id
: 部门的唯一标识符。
title
: 部门名称,如开发、运营、销售等。
表 2: info
id
: 人员的唯一标识符。
name
: 人员姓名。
email
: 电子邮件地址。
age
: 年龄。
depart_id
: 对应depart
表中的部门ID,用来表示该人员属于哪个部门。
SQL查询解释
- 按年龄分组,获取各年龄组的最大、最小、计数、总和、平均值:
- 解释:
age
: 显示分组的年龄。max(id)
: 计算每个年龄组的最大id
。min(id)
: 计算每个年龄组的最小id
。count(id)
: 统计每个年龄组中的人数(id
的数量)。sum(id)
: 计算每个年龄组的id
总和。avg(id)
: 计算每个年龄组的id
平均值。- group by age: 将结果按
age
进行分组。
- 按年龄分组,计算每个年龄组的人数:
- 解释:
age
: 显示分组的年龄。count(*)
: 统计每个年龄组中的人数。- group by age: 将结果按
age
进行分组。
这些查询用来分析
info
表中数据,尤其是通过 age
字段对数据进行分组,并计算不同年龄段的统计信息。- 按depart_id分组,计算每个部门的人数:
- 解释:
depart_id
: 显示分组的部门id。count(id)
: 统计每个部门组中的人数。- group by depart_id: 将结果按
depart_id
进行分组。
- 按depart_id分组,筛选出人数大于2的部门:
- 解释:
depart_id
: 显示分组的部门id。count(id)
: 统计每个部门组中的人数。- group by depart_id: 将结果按
depart_id
进行分组。 - having count(id) > 2: 仅保留人数超过2的部门。
SQL执行顺序
(8)连表
左右连表
需求:展示所有用户信息+部门名称
语法:主表 left outer join 从表 on 表之间的对应关系(主表.什么=从表.什么)
语法:从表 right outer join 主表 on 表之间的对应关系(主表.什么=从表.什么)
1. 使用 info
表为主表,depart
为辅表
- 解释:
- LEFT OUTER JOIN: 获取
info
表中所有记录,并将其与depart
表中的记录匹配。 - 如果
depart
表中没有与info.depart_id
对应的记录,那么depart.title
的值将为NULL
。 - 这是以
info
表为主表(即以info
为基础,获取所有相关记录),而depart
为辅表(可能为空值)。
2. 使用 depart
表为主表,info
为辅表
- 解释:
- RIGHT OUTER JOIN: 获取
depart
表中所有记录,并将其与info
表中的记录匹配。 - 如果
info
表中没有与depart.id
对应的记录,那么info.id
、info.name
和info.email
的值将为NULL
。 - 这是以
depart
表为主表(即以depart
为基础,获取所有相关记录),而info
为辅表(可能为空值)。
两种连接方式的主要区别在于哪个表是“主表”,以及在没有匹配时会保留哪个表的所有数据。
主表从表解释
在数据库查询中,**“主表”和“从表”**的概念主要是用来描述两个表在连接(
JOIN
)操作中的关系。1. 主表
- 定义: 在连接操作中,主表是我们希望始终保留其所有记录的表。即使没有与另一个表的匹配记录,它的所有记录仍然会出现在查询结果中。
- 表现:
- 在
LEFT JOIN
中,左边的表是主表。 - 在
RIGHT JOIN
中,右边的表是主表。
2. 从表
- 定义: 从表是指在连接操作中,只保留与主表有匹配记录的表。若主表的某些记录在从表中找不到对应的记录,从表的相关字段会显示为
NULL
。
- 表现:
- 在
LEFT JOIN
中,右边的表是从表。 - 在
RIGHT JOIN
中,左边的表是从表。
示例
- 主表为
info
表的情况(LEFT JOIN
) - 解释: 无论
depart
表中是否存在与info.depart_id
匹配的记录,info
表中的所有记录都会显示在结果中。即使没有匹配,depart.title
会是NULL
。
- 主表为
depart
表的情况(RIGHT JOIN
) - 解释: 无论
info
表中是否存在与depart.id
匹配的记录,depart
表中的所有记录都会显示在结果中。即使没有匹配,info
的字段会是NULL
。
总结
- 主表决定了查询结果中必须出现的记录,而从表的记录则取决于是否能与主表中的记录匹配。
内连接
上下连表
这张图片展示了**SQL中的
UNION
**操作以及两个表的数据结构。表结构:
- 表
depart
: id
: 部门编号。title
: 部门名称。
- 表
info
: id
: 员工编号。name
: 员工姓名。email
: 员工电子邮箱。age
: 员工年龄。depart_id
: 员工所属部门的编号,参考depart
表的id
。
SQL语句和解释:
- 联合查询
UNION
: - 解释:
- 这段SQL代码从
depart
表中选择id
和title
,以及从info
表中选择id
和name
,然后使用UNION
将两者合并。UNION
会自动去除重复的行。 - 注意:
UNION
要求两次SELECT
查询的列数相同,且相对应的列必须是兼容类型。
- 去重
UNION
: - 解释:
- 这段SQL代码从
depart
和info
两个表中分别选择id
列,并通过UNION
将结果合并成一个列表,同时自动去除重复的id
值。
- 保留所有行的
UNION ALL
: - 解释:
- 这段SQL代码与前一段的区别在于使用了
UNION ALL
,它会保留所有的行,包括重复的id
值。
总结:
UNION
: 合并多个查询结果,并去除重复的行。
UNION ALL
: 合并多个查询结果,保留所有的行,包括重复的部分。
打赏
如果您觉得我的内容对你有所帮助,不要吝啬你的一键三连!如果你有能力的话也可以通过下面请我喝杯咖啡~金额您随意~如果对文章内容有任何疑问,欢迎加入群组联系我~
- 作者:Don Mark
- 链接:null/article/4ee22f15-e9d4-4fd1-a66c-70baf2c1605c
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。