MySQL复习day03:DQL数据查询语言完结

sql99 连接查询语法

select 查询列表
from 表1 别名
【连接类型】join 表2 别名
on 连接条件
【连接类型】join 表3 别名
on 连接条件
...
【where 筛选条件】
【group by 分组】
having 筛选条件
order by 排序列表
连接类型:
1.内连接:inner
2.外连接

  • 左外连接:left [outer]
  • 右外连接:right [outer]
  • 全外连接:full [outer]—mysql不支持
    交叉连接:cross

外连接

用于查询一个表中有的,而另一个表中没有的数据,结果相当于A和B的差集以及A和B的交集。
特点:

  1. 外连接的查询结果为主表中的所有记录。如果从表中有和其匹配的结果,则显示匹配项,没有则显示null.
  2. 外连接的查询结果= 内连接结果+主表中有而从表中没有的记录。
  3. 左外连接中,left左边的是主表 ; 右外连接中,right右边的是主表;左外和右外交换两个表的顺序可以实现同样的效果。

交叉连接

相当于笛卡尔乘积形式。

子查询

出现在其他语句中内部的select语句,称为子查询或内查询。
外部语句可以是insert, update,delete,select等,但是select作为外部语句较多。外面如果为select语句,则此语句称为外查询或主查询

  • select 后面:仅支持标量子查询(又称单行子查询)
  • from后面:支持表子查询
  • where或having后面:标量子查询,列子查询,行子查询
  • exists后面:表子查询

特点:

①子查询放在小括号内,括号内不用加分号;
②子查询一般放在条件的右侧;
③标量子查询,一般搭配单行操作符使用,常见的单行操作符有:>, < , >=, <=, <>
列子查询,一般搭配多行操作符使用,如in ,any/some, all
④子查询的执行次序优先于主查询

(一) 标量子查询

select *
from family.zhutong
where budget>(  #子查询语句
	select budget
	from family.zhutong
	where name = 'frog' 
)
 and   bonus is not null
 and variety>'a';

(二)列子查询
返回多行,常使用in / not in 操作符,偶尔使用any (some) 和 all。

select boys.rank,a.avg
from boys
inner join (
	select round(avg(budget),2) as 'avg'
	from zhutong
	group by variety
) as a
on a.avg between boys.low and boys.high;

或如下
select boys.rank,a.avg
from (
	select round(avg(budget),2) as 'avg'
	from zhutong
	group by variety
) as a #必须取别名
inner join boys
on a.avg between boys.low and boys.high;

(三)exists 后面
也称为相关子查询,返回值为bool类型,一般exists 都能够被in代替

#exists
select boys.* 
from boys 
where  not exists(
     select zhutong.match_id 
     from family.zhutong
     where boys.id = family.zhutong.match_id
);

#in
select boys.* 
from boys 
where boys.id not in(
     select family.zhutong.match_id 
     from family.zhutong
);

分页查询

  • 应用场景:当要显示的数据一页显示不全,需要分页提交SQL请求。
  • 语法:
    select 查询列表
    from 表
    【join type表2
    on 连接条件
    where 筛选条件
    group by 分组条件
    having 分组后筛选
    order by 排序字段 】
    limit offset, size
    offset 表示要显示条目的起始索引(默认从0开始),size 表示要显示的条目个数
    特点:
  1. limit 语句放在查询语句的最后
  2. 公式
  要显示的页数 page,每页的条目数size
  select 查询列表
  from 表
  limit (page-1)*size,size
SELECT 
    emp.*
FROM
    emp
ORDER BY EMPNO DESC
LIMIT 5; #倒数5

联合查询

  • 关键字:union [all]
  • 作用:将多条查询语句的结果合并为一个查询结果(求并集),在同一个表时相当于or。如果要查询的结果来自于多个表,且多个表没有直接的连接关系,但是查询的信息一致时(列数一致)。
  • 特点:
    ①要求多条查询语句的查询列数一致;
    ②要求多条查询语句的查询每一列的类型和顺序最好一致。
    ③union默认去重,如果不想去重,则使用union all
select * 
from emp
where year(emp.HIREDATE) > 1980
or emp.COMM is not null;

#等价于

select * 
from emp
where year(emp.HIREDATE) > 1980
union 
select *  from emp 
where emp.COMM is not null;
DQL
基础语句
排序查询
条件查询
常见函数
分组查询
连接查询
子查询
分页查询
联合查询

执行顺序
在这里插入图片描述

DQL完结

MySQL学习列表

MySQL复习day01:数据库简介和 DQL数据查询语言
MySQL复习day02:DQL数据查询语言续
MySQL复习day03:DQL数据查询语言完结
MySQL复习day04:DML数据操作语言和DDL数据定义语言
MySQL复习day05:TCL事务控制语言和视图
MySQL复习day06:变量,存储过程
MySQL复习day07:函数
MySQL复习day08:流程控制结构
MySQL复习day09:逻辑架构和引擎,索引详解(explain)

致谢

感谢诸君观看,如果感觉有用的话,点个赞吧!🎉



SQL注入的原理 什么SQL注入 将SQL代码插入到应用程序的输入参数,之后,SQL代码被传递到数据库执行。从而达到对应用程序的攻击目的。 注入原理 常见攻击方法 检测是否可以注入【检测注入点】 示例:http://192.168.0.1/temp.aspx?id=a or 1=1-- 如果上面语句可以执行说明可以实现注入,则可以 利用系统过程、系统表注入数据库 示例【给系统添加一个用户,黑客可以实现远程登录控制服务器】:http://192.168.0.1/temp.aspx?id=1;exec xp_cmdshell 'net user admin 123456 /add' 绕过程序的限制 示例:程序往往限制单引号的数据,但是黑客传入单引号的ASCII码 跨站点注入 在Web页面挂某些恶意的HTML、JavaScript代码 防范SQL注入 限制错误信息的输出,避免错误信息的输出使得黑客知道网站的技术实现采用什么数据库,采用什么平台 示例:在Web.config文件设置 限制访问数据库账号的权限 在开发应用系统的时候就应该限制,给程序最小访问数据库的权限 使用参数命令传递参数 不要使用拼接字符串的方式构造SQL语句而采用参数命令 使用存储过程 存储过程在数据库 只能执行存储过程固定的代码 限制输入长度 防止黑客输入超大字符串,导致服务器瘫痪 防止黑客输入较长的恶意脚本等 实现方法:文本框的MaxLength属性 URL重写技术 示例: http://testWeb/news.aspx?id=111 重写成:http://testWeb/10101111.html 传递参数尽量不用字符串 http://testWeb/news.aspx?id=111 and 1=1【黑色部分给了SQL注入的机会】 SQL优化 为什么要优化 开发是对性能考虑不多【技术差、项目工期紧等原因没有考虑性能问题】 系统运行数据量扩大,访问量增多,蹩脚的SQL危害开始显露 低效SQL的危害 系统响应变慢,软件开发的8秒定律,当打开一个软件或网页超过8秒时间还没有显示,则响应太慢。 死锁,当不同用户都访问某些资源的时候SQL语句不当导致死锁 客户失去信心,软件失败 低效SQL低效在哪里?  性能低下的根源  硬件原因,数据库的配置不合理,数据库数据文件和日志文件没有分磁盘存放,会极大影响IO性能  没有建立索引,或者SQL没有走索引。在千万级数据的表上建索引是很有必要的。  SQL过于复杂,过长的SQL语句满足程序需求但是影响性能。子查询嵌套过多对性能有影响,查询关联的表特别多也影响性能  频繁访问数据等等 SQL如何被SQLServer执行的 SQL执行原理  解释:首先解释SQL语句【语法是否正确】  解析:检验语句的出现的对象是否有效【进行一个解析,要检查对象所有权的权限】  优化:【检查SQL语句是否能够使用索引,SQL语句如何执行效率高,制定一个执行计划】  编译:  执行SQL语句:【把编译过的查询要求提交并进行处理】 如何优化SQL 完善开发的管理 完善代码审核、测试机制,软件开发是艺术! 检测SQL查询的效率 语法【对IO和Time对SQL执行进行统计】: SET STATISTICS IO ON SET STATISTICS TIME ON ------------SQL代码--------- SET STATISTICS IO OFF SET STATISTICS TIME OFF 注意:在检测之前要清理缓存,因为当我们执行SQL语句的时候查出的数据会在数据库进行缓存,重新查询会返回缓存的信息。 DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE 经验:使用子查询嵌套不要过多,尽量使用连接查询代替子查询,因为表连接查询效率稍高一点。 SQL优化工具 使用报表服务 通过Reporting Service查找低效SQL 选择 性能 - 批处理执行统计信息和性能相关的几个报表服务: 性能 - 对象执行统计信息 性能 - 按平均CPU时间排在前面的查询 性能 - 按平均IO次数排在前面的查询 性能 - 按总CPU时间排在前面的查询 性能 - 按IO总次数排在前面的查询 操作示范: 1. 数据引擎上点击右键—报表—标准报表—关心的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值