🗒️Python MySQL数据库5—必备SQL知识
00 分钟
2024-8-18
2024-8-22
type
status
date
slug
summary
tags
category
icon
password

本文概要

  • 必备8个针对数据的SQL语句
  • 表关系
  • 授权
 

1、必备SQL语句

 
 
notion image
 

(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 > 5age > 10 的记录。可以理解为它首先筛选 id > 5 的数据,然后在这个结果集中进一步筛选出 age > 10 的记录。
可以看成这样
 
 

(2)通配符

一般用于对数据库表中的数据进行搜索,一般用于模糊搜索
 
%
%代指n个字符的意思

_
一个_代表一个字符的意思,两个下划线就代表两个字符
注意:数据量少,可以用通配符搜索,数据量大的搜索不能使用这种方法
 

(3)指定列(映射)

 
注意:此方法效率很低
这条 SQL 语句的作用是从 info 表中选择一些数据,并通过子查询从 depart 表中获取与之相关的 title 字段。下面是对这条 SQL 语句的详细解释:

解释:

  1. id, name:
      • 直接从 info 表中选择 idname 列。
  1. (SELECT title FROM depart WHERE depart.id = 1) AS x1:
      • 这是一个子查询。它从 depart 表中选择 id1 的记录的 title 列。
      • 因为 depart.id = 1 是固定的,这个子查询在整个结果集中返回的 title 是相同的,并且赋值给别名 x1
      • 换句话说,这个子查询在每一行结果中都返回 depart 表中 id = 1title
  1. (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
  1. 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=1title,固定不变。
  • x2 的值将根据每一行的 depart_id 而变化,比如:
    • 对于 info 表中 depart_id=1 的行,x2 的值为 开发
    • 对于 info 表中 depart_id=2 的行,x2 的值为 运营

总结:

  • 这条 SQL 语句从 info 表中选择 idname,并通过两个子查询获取对应的 title
    • 一个是 depart.id = 1 的固定 title,赋值给 x1
    • 另一个是动态根据 info.depart_id 获取的 title,赋值给 x2

 

(4)case when(相当于 if… else…)

notion image
这段 SQL 代码使用了多个 CASE 表达式来根据不同的条件选择不同的值,并且为每个 CASE 结果都分配了别名 (v1, v2, v3, v4, v5, v6) 。这些 CASE 表达式用于根据 depart_idage 字段的值来返回不同的结果。以下是对代码的详细解释:

解释:

  1. id, name:
      • info 表中直接选择 idname 字段。
  1. CASE depart_id WHEN 1 THEN "第1部门" END v1:
      • 如果 depart_id1,返回 "第1部门",否则返回 NULL
      • 结果命名为 v1
  1. CASE depart_id WHEN 1 THEN "第1部门" ELSE "其他" END v2:
      • 如果 depart_id1,返回 "第1部门",否则返回 "其他"
      • 结果命名为 v2
  1. CASE depart_id WHEN 1 THEN "第1部门" WHEN 2 THEN "第2部门" ELSE "其他" END v3:
      • 如果 depart_id1,返回 "第1部门"
      • 如果 depart_id2,返回 "第2部门"
      • 否则返回 "其他"
      • 结果命名为 v3
  1. CASE WHEN age < 18 THEN "少年" END v4:
      • 如果 age 小于 18,返回 "少年",否则返回 NULL
      • 结果命名为 v4
  1. CASE WHEN age < 18 THEN "少年" ELSE "油腻男" END v5:
      • 如果 age 小于 18,返回 "少年",否则返回 "油腻男"
      • 结果命名为 v5
  1. CASE WHEN age < 18 THEN "少年" WHEN age < 30 THEN "青年" ELSE "油腻男" END v6:
      • 如果 age 小于 18,返回 "少年"
      • 如果 age1830 之间,返回 "青年"
      • 否则返回 "油腻男"
      • 结果命名为 v6

总结:

  • 这段 SQL 代码从 info 表中选择 idname,然后通过 CASE 表达式根据 depart_idage 字段的值生成不同的输出,并为这些输出赋予别名 (v1v6)。
  • 每个 CASE 表达式根据特定的条件返回不同的结果,以便在查询结果集中得到不同的字段值。

(5)排序

表格:

  1. depart
      • id: 部门的唯一标识符
      • title: 部门名称
  1. info
      • id: 人员的唯一标识符
      • name: 人员姓名
      • email: 电子邮件
      • age: 年龄
      • depart_id: 对应 depart 表中的部门ID

SQL查询:

  1. 按年龄降序排列:
    1. info 表中选择所有记录,并按 age 字段降序排列。
  1. 按年龄升序排列:
    1. info 表中选择所有记录,并按 age 字段升序排列。
  1. 按ID降序排列:
    1. info 表中选择所有记录,并按 id 字段降序排列。
  1. 按ID升序排列:
    1. info 表中选择所有记录,并按 id 字段升序排列。
  1. 先按年龄升序排列,再按ID降序排列:
    1. info 表中选择所有记录,先按 age 字段升序排列,如果年龄相同,则按 id 字段降序排列。
  1. 选择ID大于10的记录,按年龄升序并按ID降序排列:
    1. info 表中选择 id 大于10的记录,并按 age 字段升序排列,再按 id 字段降序排列。
  1. 选择ID大于6或名字包含‘y’的记录,按年龄升序并按ID降序排列:
    1. info 表中选择 id 大于6或者 name 字段中包含字母 'y' 的记录,并按 age 字段升序排列,再按 id 字段降序排列。
 
 

(6)取部分数据

表格描述
表 1: depart
  • id: 部门的唯一标识符。
  • title: 部门名称,如开发、运营、销售等。
表 2: info
  • id: 人员的唯一标识符。
  • name: 人员姓名。
  • email: 电子邮件地址。
  • age: 年龄。
  • depart_id: 对应 depart 表中的部门ID,用来表示该人员属于哪个部门。

SQL查询解释

  1. 获取前5条数据:
      • 解释: 从 info 表中选择所有字段的数据,限制返回的结果数量为前5条记录。
  1. 按ID降序排列后,获取前3条数据:
      • 解释: 从 info 表中选择所有字段的数据,首先按 id 字段降序排列,然后返回前3条记录。
  1. 获取ID大于10的数据,按ID降序排列,取前3条:
      • 解释: 从 info 表中选择所有字段的数据,条件是 id 必须大于10,然后按 id 字段降序排列,返回前3条记录。
  1. 跳过前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表的数据通过年龄进行分组
 
图片显示了两个表格 (departinfo) 以及与之相关的两条 SQL 查询。以下是对图片中 SQL 代码的解释:

表格描述

表 1: depart
  • id: 部门的唯一标识符。
  • title: 部门名称,如开发、运营、销售等。
表 2: info
  • id: 人员的唯一标识符。
  • name: 人员姓名。
  • email: 电子邮件地址。
  • age: 年龄。
  • depart_id: 对应 depart 表中的部门ID,用来表示该人员属于哪个部门。

SQL查询解释

  1. 按年龄分组,获取各年龄组的最大、最小、计数、总和、平均值:
      • 解释:
        • age: 显示分组的年龄。
        • max(id): 计算每个年龄组的最大 id
        • min(id): 计算每个年龄组的最小 id
        • count(id): 统计每个年龄组中的人数(id的数量)。
        • sum(id): 计算每个年龄组的 id 总和。
        • avg(id): 计算每个年龄组的 id 平均值。
        • group by age: 将结果按 age 进行分组。
notion image
 
  1. 按年龄分组,计算每个年龄组的人数:
      • 解释:
        • age: 显示分组的年龄。
        • count(*): 统计每个年龄组中的人数。
        • group by age: 将结果按 age 进行分组。
notion image
这些查询用来分析 info 表中数据,尤其是通过 age 字段对数据进行分组,并计算不同年龄段的统计信息。
 
  1. 按depart_id分组,计算每个部门的人数:
      • 解释:
        • depart_id : 显示分组的部门id。
        • count(id): 统计每个部门组中的人数。
        • group by depart_id: 将结果按 depart_id 进行分组。
 
 
  1. 按depart_id分组,筛选出人数大于2的部门:
      • 解释:
        • depart_id: 显示分组的部门id。
        • count(id): 统计每个部门组中的人数。
        • group by depart_id: 将结果按 depart_id 进行分组。
        • having count(id) > 2: 仅保留人数超过2的部门。
 

SQL执行顺序

notion image
 

(8)连表

 

左右连表

需求:展示所有用户信息+部门名称
notion image
 
语法:主表 left outer join 从表 on 表之间的对应关系(主表.什么=从表.什么)
 
notion image
 
语法:从表 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.idinfo.nameinfo.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

总结

  • 主表决定了查询结果中必须出现的记录,而从表的记录则取决于是否能与主表中的记录匹配。
 

内连接

notion image
 
 

上下连表

notion image
这张图片展示了**SQL中的UNION**操作以及两个表的数据结构。

表结构:

  • depart:
    • id: 部门编号。
    • title: 部门名称。
  • info:
    • id: 员工编号。
    • name: 员工姓名。
    • email: 员工电子邮箱。
    • age: 员工年龄。
    • depart_id: 员工所属部门的编号,参考depart表的id

SQL语句和解释:

  1. 联合查询UNION:
      • 解释:
        • 这段SQL代码从depart表中选择idtitle,以及从info表中选择idname,然后使用UNION将两者合并。UNION会自动去除重复的行。
        • 注意: UNION要求两次SELECT查询的列数相同,且相对应的列必须是兼容类型。
notion image
  1. 去重UNION:
      • 解释:
        • 这段SQL代码从departinfo两个表中分别选择id列,并通过UNION将结果合并成一个列表,同时自动去除重复的id值。
notion image
  1. 保留所有行的UNION ALL:
      • 解释:
        • 这段SQL代码与前一段的区别在于使用了UNION ALL,它会保留所有的行,包括重复的id值。
notion image

总结:

  • UNION: 合并多个查询结果,并去除重复的行。
  • UNION ALL: 合并多个查询结果,保留所有的行,包括重复的部分。
 
 
 
 

打赏

如果您觉得我的内容对你有所帮助,不要吝啬你的一键三连!如果你有能力的话也可以通过下面请我喝杯咖啡~金额您随意~如果对文章内容有任何疑问,欢迎加入群组联系我~
notion image
上一篇
Python MySQL数据库4—数据行操作(增删改查)
下一篇
Python MySQL数据库6—表关系