having子句:having子句也是用来判断条件,与where子句基本一致。
区别
- where是对数据源的数据进行操作
- having是对临时数据(where操作完,group by操作之后)进行操作
对别名的使用:只有having能够使用,而where只能操作数据源中的原始字段
对合计函数的使用:只有having可以,having出现在group by之后,而where在group by之前
使用字段别名
order by子句:排序,对字段进行排序,使用校对集进行比较
语法:order by 字段 [排序方式],字段 [排序方式],… 默认的是升序排序
多字段排序
limit子句:限制获取的条数
限制获取数据的位置和数目
语法:limit offset,number
offset:起始位置,偏移量
number:限制的获取记录的数量
简单使用
复合使用
limit通常用于数据获取的数量控制以及位置控制。
limit用于分页。
联合查询
将表与表之间(或者表内不同的记录)进行纵向的合并
为什么要使用联合查询?
当大数据量存在的时候,一张表往往不够存储。
语法:select语句 union[union选项] select 语句
注意
- union的使用,要满足两个select语句得到的字段数必须一样
- union的使用,字段类型可以对应不上,所以数据显示的时候也会对应不上
原因:union是对两个select语句的结果进行合并,结果是临时数据(全部都是字符数据,没有数据类型),合并后的结果没有数据类型的概念,全部都是字符串数据。
union选项:与select选项一致,有all和distinct(默认),不管是all还是distinct都是对union之后的最终结果进行操作。
在union(联合查询中)如果需要使用order by对语句进行排序,必须使用括号将select语句进行括起来。
(select 语句 order by子句 )
union
(select 语句 order by子句 )
语法正常,却没有实现排序
如果在联合查询中想正常使用order by记性排序,必须配合使用limit,但是因为limit使用前不知道表中有多少记录,所以一般limit 后面跟最大值 999999
联合查询不仅限于同一张表,多表之间也可以联合,只要保证字段数量一致即可。
连接查询join
将多个表对应的数据进行拼接(在字段上横向进行拼接)。
因为表的存在不是独立的。通过外键进行连接操作。
连接查询:内连接,外连接,自然连接,交叉连接
内连接
记录在两张表都存在,才能够连接成功。
语法:[inner] join
左表 inner join 右表 on 条件
在join关键字左边的表称之为左表
在join关键字右边的表称之为右表
没有连接条件的内连接是一个笛卡尔积(交叉连接)
正确的内连接
内连接原理
正确的内连接语法
内连接的使用?
要求两张表组合出数据,要求数据必须要完整的情况下使用内连接。
外连接
跟内连接相似,外连接会将一张表中数据在另外一张表不存在时的记录也给保存下来。
语法:outer join
外连接分为两种:左外连接,右外连接,没有直接的外连接
左外连接:left [outer] join
右外连接:right [outer] join
左外与右外的唯一区别是:以谁为主表,左外连接以左表为主,右外连接以右表为主,但是数据的显示顺序,只跟左右表有关系,跟谁是主表没有任何关系。
外连接原理
什么时候使用外连接?
想要知道某个表的全部数据,同时还要将对应其他表的数据给显示出来,如果不存在则提示没有。
左右外连接的区别
左右区分
交叉连接
没有条件的连接,生成一个笛卡尔积
语法:左表 cross join 右表
自然连接
自然连接其实就是自动连接,不需要指定连接条件的连接。
语法:左表 natural [left/right/inner]join 右表
如果想使用自然内连接,那么不能使用关键字inner
正确使用:不使用inner
1.自然连接是自动判断条件,自动寻找两张表里名字相同的字段作为连接条件。
2.自然连接在连接之后,会将相同的字段进行合并。
自然外连接:左和右
语法:左表 natural left join 右表
语法:左表 natural right join 右表
注意:自然连接是主动判断两张表是否有同名字段,如果有多个同名字段,就会将多个字段组合起来进行比较。
如何使用内连接和外连接来模拟自然内外连接?
语法:using (字段名) 该字段名指的是在两张表名字相同的字段名
- 到连接的两张表找对应的字段
- 将第二张表的同名字段给隐藏了(合并)
证明自然连接是会用多个同名字段做连接条件
报表的时候特别多的应用了连接查询。
子查询
如果一条查询语句中包含另外一条查询语句,那么该被包含的查询语句就称之为子查询。
子查询根据在一条查询语句中出现的位置分为三种
from子查询
where子查询
exists子查询
子查询根据查询返回的结果分为四类:
标量子查询:子查询的结果是一个具体的值(字段的值)
列子查询:子查询的结果得到是某个字段全部或者部分值
行子查询:返回的结果是一张表,一般有多个字段,不管记录数多少,记录数>+1
表子查询:返回的结果是一张表,一般有多个字段,不管记录数多少,记录数>+1
表子查询和行子查询的区别:是两个子查询出现的位置不一样,表子查询出现在from后面,行子查询出现在where后面。
标量子查询
获取PHP1405班的所有学生
- 找到班级ID,select id from pro_class where name =‘PHP1405’;
- 通过班级ID找学生,select * from pro_student where c_id =‘’;
标量子查询
列子查询
获取所有有班级的学生(假设学生表与班级表没有外键约束)
有外键约束:select * from pro_student where c_id is not null
- 找出当前存在的班级,select id from pro_class where 1
- 找出在当前查询出来的班级ID里存在的所有学生
列子查询
any,some和all的使用
any:任意一个
some:任意一些
all:全部
正向使用,都采用肯定形势
负向使用,都采用否定形势
行子查询
找出班上年龄最大,且身高最高的同学
select * from pro_student order by age desc,height desc limit 1;
缺点是不能保证找出所有的满足条件的信息。
- 找出班级里最大的年龄和最高的身高:select max(age),max(height) from pro_student;
- 匹配学生的年龄和身高信息。只能通过行子查询
行子查询:通过构建行来进行行比较,如果子查询返回的结果是2个字段,那么就需要构建一个2个字段的行,使用()构建
语法:(字段1,字段2,…) = (行:子查询返回)
表子查询
要获取每个班的年龄最小的一个同学
- 如何获得每个班的第一个学生,使用按照班级分组
- 要在第一步分组之前,先将学生按照年龄升序排序
表子查询
exists子查询
判断子查询的结果是否为真
视图
视图就是一张虚拟表
视图是有结构但是没数据的表。
语法
create View 视图名字 as select语句
视图本身没有数据,数据的来源全依赖于select语句从各个数据表中获取。
上述语句执行之后发生了什么?
- 产生了一个结构文件
- 产生表
- 会在视图表中产生一条记录,在information_schema库里的VIEWS表里。
mysql的语句结束符以及含义
默认是分号:“;”一条语句结束
\g:与分号作用一致
\G:将结果记录按照一个字段一行显示
视图是为了查询数据
如何查看视图?语法:select * from 视图名字,与操作表一样
调用视图的原理:select * from student_class_v
- 找到视图定义的语句
- 找出其中的SQL查询语句
- 使用SQL语句进行查询操作
注意:视图的每次调用,都是去执行对应的SQL语句得到结果。
视图的维护
修改视图
语法:alter View 视图名字 as select语句
删除视图
语法:drop View 视图名字
以上语句做了哪些操作?
- 删除表(视图名)
- 删除视图结构文件
- 删除Views表里的记录
删除视图,并不会对原来的表有任何影响。
视图的数据操作
可以对视图的数据进行更新或者插入
对单表视图进行更新操作
对多表视图进行更新操作
对单表视图插入数据:视图的字段要么与原表字段一样,要么视图的字段之前的其他字段在对应的表的设计过程中有默认值或者可以为空。
对多表视图插入数据:不可以
视图的使用
- 可以节省SQL语句的工作量,不用每次都写复杂的SQL语句
- 数据安全性,可以将不想给外部看到的表字段给隐藏
- 友好性,用户感觉都在操作一张独立的表
以后可以方便的对视图进行权限控制。
视图算法
视图算法指的一个视图在于外部SQL语句组合使用的时候,服务器来处理整个SQL语句的过程中所使用的算法。
视图算法有三种:merge,temptable,undefined
merge:将外部SQL语句与视图的SQL语句进行合并之后,在执行
temptable:先执行视图的SQL语句得到一个临时表,外部SQL语句对该临时表进行操作
undefined:未定义,系统不知道使用哪种,系统会自动去判断使用哪种,这是系统默认的视图算法,通常基于效率考虑,会更多的使用merge来处理。
因为以上语句使用了merge算法,导致order by子句被放到了group by子句之后,从而导致数据错乱。
在定义视图的时候,指定算法为temptable。
语法:create view algorithm = temptable 视图名 as select
视图算法对比(merge和temptable)
本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/10373.html
如有侵犯您的合法权益请发邮件951076433@qq.com联系删除