说明
这个只是本人自己学习时做的笔记,比较基础,希望大佬不喜勿喷。
有需要的小伙伴可以参考一下,只是很基础的笔记。谢谢大家!
基础的介绍
语法代码:
---------------------------------------------------------------
-- 子查询
概念:子查询是一种常用的计算机语言select-sql语言中嵌套查询下层的程序模块。
当一个查询是另一个查询条件是,称之为子查询。
子查询:指在一条select语句中,嵌入了另外一条select语句,那么被嵌入的select
语句称之为子查询语句
主查询概念:
主查询:主要的查询对象,第一条select语句,确定的用户所有获取的数据目标(数据源)
已经要具体得到的字段信息。
-- 子查询和主查询的关系
1.子查询是嵌入到主查询中的;
2.子查询是辅助主查询的:要么作为条件,要么作为数据源
3.子查询是可以独立存在的一条完整的select语句。
-- 子查询分类
按功能分
--标量子查询:子查询返回的结果是一个数据(一行一列)
--列子查询:返回的结果是一列(一列多行)
--行子查询:返回的结果是一行(一行多列)
--表子查询:返回的结果是多行多列
--exists子查询:返回的结果1或0(类似布尔)
按位置分
where子查询:子查询出现的位置在where条件中
from子查询:子查询出现的位置在from数据源中(做数据源)
-----------------------------------------------------------------------
-- 标量子查询
--标量子查询:子查询返回的结果是一个数据(一行一列)
基本语法:select * from 数据源 where 条件判断 =(select * from 数据源
where 条件判断);//子查询只有一个值
--知道一个学生的名字:小白,想知道他在哪个班级(班级名字)
--1.通过学生表获取他所在班级的ID
--2.通过班级id获取班级名字
--select class from my_student where name='小白白';
--select name from my_class where class =(select class from my_student where name ='小白白');
-- 列子查询
概念:返回的结果是一列(一列多行)
基本语法:主查询 where 条件 in (列子查询)
--查看学生表中班级有学生的班级名称。
1.在学生表所有的班级id。
2.在班级表中查找对应的名称。
select name from my_class where class in (select distinct class from my_student);
-- 行子查询
概念:返回结果是一行多列
行元素:字段元素是指一个字段对应的值,行元素对应的就是多个字段;多个字段
作为一个元素参与运算,把这种情况称之为行元素。
基本语法:主查询 where 条件 【(构造一个行元素)=(行子查询)】;
--需求:获取班级上年龄最大,且身高最高的学生
--1.求出班级年龄最大的的值
--2.求出班级身高最高值
--3.求出对应的学生
select * from my_student where age=age(stu_age) and height=max(height);//出现聚合函数
--使用行元素
select * from my_student where (age,height)=(select max(age),max(height) from my_student);
--1.having 是在group by之后:使用having代表着前面的group by执行了一次。
--2.group by 一旦执行:结果就是只返回一行记录:第一行
select * from my_student having age=max(age) and height=max(height);
总结:标量子查询,列子查询,行子查询都属于where查询
-- 表子查询
表子查询:子查询返回的结果是多行多列,表子查询与子查询非常相似,只是行
子查询需要产生行元素,而表子查询没有。
行子查询使用与where条件判断;where子查询
表子查询是用于from数据源:from子查询
基本语法:
select 字段 from (表子查询)as 别名 [where] [group by] [having] [order by] [limit];
--获取每个班上最高身高的学生(一个)
1.将每个班最高的学生排在最前面。order by
2.再针对结果进行group by:保留每组第一个
select * from (select * from my_student order by height desc) as tmp group by class;
-- exists子查询
概念:exists子查询,查询返回的结果只有0和1,1代表成立,0代表不成立
语法:where exists(查询语句);查询语句由结果就返回1,没有就返回0
--求出有学生在的所有班级
select * from my_class c where exists(select * from my_student s where s.class=c.class);
查询所有来自my_class表 当存在(学生表中学生的班级id=班级表的id);