SELECT语句学习笔记2

SELECT语句四种查询

注:这篇博客是博主通过学习B站这位UP主(https://space.bilibili.com/508641166/video?tid=0&page=1&keyword=&order=pubdate)18到22有关select语句的教程所得出的总结。

1.单表查询:

比较常见不过多介绍,博主的上一篇博客介绍的主要内容即为单表查询

2.连接查询

注:连接查询又可分为以下6种形式

(1)交叉连接(广义笛卡尔积)

  • 不带谓语的连接(很少使用,连接的表格信息不对等)
      eg1.SELECT A.* B.* FROM A,B
      从AB表中把AB列的所有数据连接起来,缺点为信息连接不对等
      eg2(其中FROM后面的逗号也可以更改为CROSS JOIN)
          SELECT A.* B.* FROM A CROSS JOIN B
    
    (2)等值连接:运算符为“=”的连接操作

a.格式:[表名1]<列名1>=[表名2]<列名2>

b.注:任何子句中引用表1和表2中同名属性时,都必须加表名前缀;引用唯一属性名时可以加也可以省略表名前缀。

 eg1.SELECT A.*,B.* FROM A,B WHERE A.C=B.C
 这里AB表中同时包含了C这个属性,所以必须加前缀。

(3)自身连接:一个表于其自己进行连接,称为表的自身连接

  • 注:由于所有属性都是同名属性,所有需要给表起别名以示区别

      eg1.SELECT a1.B,a2.B FROM A a1,A a2 WHERE a1.B=a2.B
      这里把A表分别命名为a1,a2以作区别
      eg2.SELECT a1.B,a2.C FROM A a1,A a2 WHERE a1.B=a2.C
    

(4)复合条件连接:WHERE子句中含多个连接条件时,称为复合条件连接

  • 复合条件连接类型又可分为:

a.两表按多个属性连接

b.自身按多个属性连接

c.多表连接

eg1.SELECT A.a,B,C FROM A,D,E WHERE A.a=B.a AND B.b=C.b
AB表中a属性相等和BC表中b属性相等

(5)内连接:相当于等值连接,只是表达方法不同(例子如下)

eg1.“,"变JOIN,WHERE变ON  
SELECT A.*,B.* FROM A,B WHERE A.a=B.a
SELECT A.*,B.* FROM A JOIN B ON A.a=B.a

(6)外连接

a.左连接(又称左外连接):返回左表中所有行,如果左表行在右表中没有匹配行则返回NULL
1

eg1.SELECT 表一.* ,表二.* FROM 表一 LEFT JOIN 表二 ON 表一.num = 表二.num
把表一与表二中num相等的连接起来

2.png

b.右连接(又称右外连接):返回右表中所有行,如果左右表行在左表中没有匹配行则返回NULL
1

eg2.SELECT 表一.* ,表二.* FROM 表一 RIGHT JOIN 表二 ON 表一.num = 表二.num
把表一与表二中num相等的连接起来

3.png

c.全连接:返回左表右表中所有行,当某行在另一表中没有匹配行,则另一表的列返回空值则返回NULL
1

eg1.SELECT 表一.* ,表二.* FROM 表一 FULL JOIN 表二 ON 表一.num = 表二.num
把表一与表二中num相等的连接起来

4.png

3.嵌套查询

  • 注:补充

(1)查询块:一个SELECT语句称为一个查询块

(2)嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件查询称为嵌套查询

(3)外层查询/父查询 与 内层查询/子查询

SELECT A FROM B WHERE A.c <外层查询/父查询> IN (SELECT C FROM D WHERE C.a=2)<内层查询/子查询>

a.不相关子查询:内层查询与外层查询不关联即可独立运行(有里到外逐层查询)

eg1.SELECT A FROM B WHERE A.c IN (SELECT C FROM D WHERE C.a=2)
这里的A在B中,C在D中,并且BD不相关联
先从IN里面开始从D中选出当C.a=2的C的列表,再判断外层从B里选择(A.c等同C.a=2的C的列表)的A列表
  • ps.内层返回的结果数>=2要用IN,如果用“=”会报错

b.相关子查询

  • ps.注:

(1)首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句的返回值为真,则取此元组放入结果表,然后再取外层表的下一个元组;重复这一过程,直到外层表全部检查完为止。(外往内)

(2)子查询的限制:

①不能使用ORDER BY 子句

②层层嵌套方式反应了SQL语言的结构化

③有些嵌套查询可以用连接运算代替

eg1.SELECT A FROM B WHERE EXISTS  (SELECT C FROM D WHERE C.a=2 AND C.b=A.b)
这里的A在B中,C在D中,并且BD不相关联
这里由于子查询中没有A.b这个值所以不能从子查询开始运行,应把从B表中取出的A的所有值分别带入子查询中,判断是否与子查询中得出的结果成立(即EXISTS得到的结果为TURE),如果成立则把那个A值放入结果集,重复这一过程,直到A中的值全部检查完为止。
注:这里的EXISTS谓语用法可以参考下面的介绍。

c.嵌套查询的谓语

(1)带有IN谓语的子查询:父查询与子查询用IN连接,子查询结果为集合。

这里的例子,博主还是用上面的例子,其中子查询的结果数大于等于2
eg1.SELECT A FROM B WHERE A.c IN (SELECT C FROM D WHERE C.a=2)
这里的A在B中,C在D中,并且BD不相关联
先从IN里面开始从D中选出当C.a=2的C的列表,再判断外层从B里选择(A.c等同C.a=2的C的列表)的A列表

(2)带有运算符的子查询:当子查询返回的结果集为一个时,可以使用比较运算符(=,>,<,>=,<=,!=或<>,!>,!<)与ALL或ANY谓语配合使用。

 eg1.SELECT A FROM B WHERE C>(SELECT AVG(C) FROM B)
 其中C与A同在B表里
计算B表中C的平均值,再选出A对应的C值大于C平均值的A
ps.子查询要跟在运算符后面
错误示范:SELECT A FROM B WHERE (SELECT AVG(C) FROM B)<C
正确示范如eg1

(3)带有ANY(任意一个值)或ALL(所有值)谓语的子查询

  • ps:需配合使用比较运算符

  • 格式:<比较运算符>ANY/ALL

      eg1.选择年段中成绩大于大于一班同学的所有同学名字
      SELECT 学生姓名 FROM 年段 WHERE 成绩 >ALL(SELECT 姓名 FROM 年段 WHERE 班级=一班)
      注:这里的学生姓名、年段、成绩、姓名、班级、一班是表名或列名
    

(4)带有EXISTS谓语的子查询(带有EXISTS谓语的子查询不返回任何实际数据它只生“ture”or“false”)

    eg1.查询选了语文这门课程的学生姓名
    SELECT 学生姓名 FROM 年段 WHERE EXTSTS (SELECT * FROM 年段 WHERE 课程=语文)
    注:例子中的文字为表名或列名

4.集合查询

(1)并操作:

  • 格式:<查询块>UNION<查询块>

  • ps.参加UNION操作的各结果表的列数必须相同,对应数据类型也必须相同

      eg.1选择学号是1和2的学生姓名
      SELECT 姓名 FROM 学生 WHERE 学号=1 UNION SELECT 姓名 FROM 学生 WHERE 学号=2
      这个例子其实可以运用比较运算符,博主为了举例故怎么使用。
    

(2)交操作:标准的SQL中并没有提供集合交操作,但可以用其他方式间接实现

eg1.查询1班与身高不超190cm的学生交集(即查询1班中身高不超190cm的学生)
SELECT * FROM 学生 WHERE 班级=1班 AND 身高<=190;
注:例子中的文字为表名或列名

(3)差操作:标准的SQL中并没有提供集合交操作,但可以用其他方式间接实现

eg1.查询1班与身高不超190cm的学生差集(即查询1班中身高超过190cm的学生)
SELECT * FROM 学生 WHERE 班级=1班 AND 身高>190;
注:例子中的文字为表名或列名

(4)对集合操作结果的排序

  • 注:

a.ORDER BY 子句只能对最终查询结果排序不能对中间结果排序

b.任何情况下,ORDER BY 子句只能出现在整个语句的最后

c.对于集合操作结果排序时,ORDER BY 子句中可以用数字指定排序属性(即列名),但尽量不用易产生歧义

eg1.查询1班中身高超过190cm的学生
SELECT * FROM 学生 WHERE 班级=1班 UNION SELECT * FROM 学生 WHERE  身高>190 ORDER BY 学号(或1);
注:例子中的文字为表名或列名,学号的列号为1
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2023 00hello00

请我喝杯咖啡吧~

支付宝
微信