2019-04-25-day040-数据库的查询
内容回顾
- 数据的增删改查
- 插入数据
- insert into 表 values (值1,值2...)
- insert into 表(指定字段名1,字段名2) values (值1,值2...)
- 删除数据
- delete from 表名 where 条件
- 更新数据
- update 表名 set 字段=新的值 where 条件
- 查询数据
- select * from 表
- where 条件
- group by 分组 having 过滤条件(可以使用聚合函数)
- order by 排序(默认是升序asc,降序desc)
- limit m,n (默认m=0,从m+1开始,取n个)
- limit n offset m(与上面的写法完全一致)
- select * from 表
多表查询
- 连表查询
- 表和表是怎么连在一起的
- 通过笛卡尔积得到一个全量拼接的大表
- 内连接(inner join) 双方能够互相匹配的项才会被显示出来
- select * from 表1 inner join 表2 on 条件
- select * from employee inner join department
- on employee.dep_id = department.id
- 给表重命名
- select t1.name,t2.name from employee as t1 inner join department as t2
- on t1.dep_id = t2.id
- 外连接
- 左外连接(left join) 只完整的显示左表中的所有内容,以及右表中与左表匹配的项
- select * from 表1 left join 表2 on 条件
- select * from employee left join department
- on employee.dep_id = department.id
- 右外连接(right join) 只完整的显示右表中的所有内容,以及左表中与右表匹配的项
- select * from 表1 right join 表2 on 条件
- select * from employee right join department
- on employee.dep_id = department.id
- 全外连接 永远显示左表和右表中所有的项
- select * from employee left join department
- on employee.dep_id = department.id
- union
- select * from employee right join department
- on employee.dep_id = department.id
- 左外连接(left join) 只完整的显示左表中的所有内容,以及右表中与左表匹配的项
- 表和表是怎么连在一起的
- 子查询
- 总是在一个select中 套着另一个select语句
- 嵌套着的这个select语句就是一个子查询语句
- 查"技术"部的所有员工的名字
- 查询技术部的id
- select id from department where name = '技术'
- select name from employee where dep_id = (select id from department where name = '技术');
- 如果一个需求 子查询和连表查询都能实现,选择连表or子查询?
- 选连表查询
- 查"技术"和"销售"部的所有员工的名字
- select id from department where name in ('技术','销售');
- select name from employee where dep_id in (select id from department where name in ('技术','销售'));
- 总是在一个select中 套着另一个select语句
练习
- 连表查询
- 1.找出年龄大于25岁的员工以及员工所在的部门
- select e.name,d.name from employee e inner join department d
- on e.dep_id = d.id where e.age>25
- 2.以内连接的方式查询employee和department表,并且以age字段的升序方式显示
- select * from employee e inner join department d
- on e.dep_id = d.id order by e.age
- 子查询
- 查询平均年龄在25岁以上的部门名
- select dep_id from employee group by dep_id having avg(age)>25
- select name from department where id in (select dep_id from employee group by dep_id having avg(age)>25);
- 查看技术部员工姓名
- select name from employee where dep_id = (select id from department where name = '技术');
- 查看不足1人的部门名(子查询得到的是有人的部门id)
- 在员工表中不存在的一个部门id,在department表里
- 在department表里的id字段中找到一个在员工表的dep_id中不存在的项
- select name from department where id not in (select dep_id from employee group by dep_id);
- 把员工表里所有的人所在的dep_id都查出来
- 带比较运算的子查询
- 1.查询大于所有人平均年龄的员工名与年龄
- select avg(age) from employee;
- select name,age from employee where age > (select avg(age) from employee);
- 2.查询大于部门内平均年龄的员工名、年龄
- select dep_id,avg(age) from employee group by dep_id;
- select * from employee inner join (select dep_id,avg(age) as avg_age from employee group by dep_id) as t2
- on employee.dep_id = t2.dep_id where employee.age > t2.avg_age;
练习
查询每个部门最新入职的那位员工
- 入职时间最大的员工
- 每个部门最新入职员工的时间
- select post,max(hire_date) from emp group by post;
- select emp.name,emp.hire_date from emp inner join (select post,max(hire_date) latest_date from emp group by post) as t
- on emp.post = t.post where emp.hire_date = t.latest_date;
select
(select t2.name from emp as t2 where t2.post=t1.post order by hire_date desc limit 1)
from emp as t1 group by post;
索引原理
读还是写操作多
- 博客园
- 百度
- 豆瓣
- 知乎
###读操作更多 - 读写 :10:1
###IO一次 写更浪费时间 - 数据库的瓶颈 : 读取数据的时间
- 磁盘的读效率
- 上百万条数据
- 如何存储
- 如何读取
alex 50 alex@oldboy.com
wusir 30 wusir@oldboy.com
jin 70 jin@oldboy.com
baoyuan 45 baoyuan@oldboy.com
ning 91 ning@oldboy.com
xiaohei 53 xiaohei@oldboy.com
lihua 21 lihua@oldboy.com
1
2
3
存储
- 树型结构里
- balance tree 平衡树
- 平衡树能够提高读的速度,但是降低了写的速度
- 存储行数据和树中数字的关系
- 树中的数字指向数据的具体地址
- 树中的数字节点内直接存储行内容
- 如果在非叶子节点 存储数值和表中的具体行,那么会导致每个节点能够存储的数据量降低
- 无形中增加了树的高度
- 查找数据的效率不稳定
- 一种新的存储数据的办法
alex 50 alex@oldboy.com
wusir 30 wusir@oldboy.com
jin 70 jin@oldboy.com
baoyuan 45 baoyuan@oldboy.com
ning 91 ning@oldboy.com
xiaohei 53 xiaohei@oldboy.com
lihua 21 lihua@oldboy.com
- 所有的数据都存储在叶子节点上而不是存储在根节点或者分支中
- select * from 表 where age between 20 and 70
- 在叶子节点之间添加了双向链表,让范围查询变得更加容易
树型结构里
- balance tree 平衡树
- 平衡树能够提高读的速度,但是降低了写的速度
- 存储行数据和树中数字的关系
- 叶子节点中的数字指向数据的具体地址
- 叶子节点内直接存储行内容
- 所有的数据都存储在叶子节点上而不是存储在根节点或者分支中
- 为了降低树的高度
- 让每一个数据被找到的时间变得稳定
- 在叶子节点之间添加了双向链表,为了能够更加快速的进行范围查询
b+树
- 影响查找速度的最根本的原因是什么
- IO次数 - 树的高度
- 为了降低树的高度
- 1.增加数据与数据之间的区分度
- 2.降低目录列的数据的长度
- 索引 : 实际上就是一个搜索表时使用的目录
- 聚集索引 : 叶子节点内直接存储行内容
- 只有innodb存储引擎才有聚集索引
- 主键
- 辅助索引 : 叶子节点中的数字指向数据的具体地址
- innodb中和myisam中都可以存在
# innodb 对应2个文件 表结构 数据 + 索引
# myisam 对应3个文件 表结构 纯数据 辅助索引
- innodb中和myisam中都可以存在
- 聚集索引 : 叶子节点内直接存储行内容
2019-04-25-day040-数据库的查询的更多相关文章
- Work 4(通知类) (2019.04.25)
- [2019.03.25]Linux中的查找
TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...
- ORACLE数据库常用查询二
ORACLE数据库常用查询 1.查看表空间对应数据文件情况: SQL MB,AUTOEXTENSIBLE FROM DBA_DATA_FILES; TABLESPACE_NAME FILE_NAME ...
- 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- MS数据库优化查询最常见的几种方法
1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大 ...
- 优化SQLServer数据库加快查询速度
查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...
- SQL Server数据库 优化查询速度
查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...
- 转载:30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- 【MySQL笔记】数据库的查询
数据库的查询 注:文中 [ ...] 代表该部分可以去掉. 理论基础:对表对象的一组关系运算,即选择(selection).投影(projection)和连接(join) 1.select语句 子语句 ...
- MYSQL通过索引优化数据库的查询
#转载请联系 索引是什么? 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的位置信息. 更通俗的说,数据库索引好比是一本书前面的目录,能加快数据 ...
随机推荐
- D - Dice Game (BFS)
A dice is a small cube, with each side having a different number of spots on it, ranging from 1 to 6 ...
- linux环境下安装使用selenium Chrome
安装驱动 http://chromedriver.storage.googleapis.com/index.html 下载对应chrome浏览器版本的驱动程序 chmod +x chromedrive ...
- 【转】SQL数据库日志文件收缩
USE [master] GO ALTER DATABASE MDM_OperationBase SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE ...
- JSP页面传值出现中文乱码的问题
在接收值的jsp页面代码的body里添加: <%request.setCharacterEncoding("utf-8"); %> //这里是设置utf-8为jsp页 ...
- 【Monkey】Monkey基础概念
1.什么是Monkey? 发送伪随机用户事件的命令 2.Monkey在哪? 在手机系统里 3.什么是ADB? 4.MonkeyScript 一组可以被Monkey识别的命令集合,可以完成重复固定的操作 ...
- Angular2+URL中的 # 引发的思考
1.先分析 # 的作用 1.1. # 的涵义 #代表网页中的位置.其右面的字符就是该位置的标识符.比如,http://www.example.com/index.html#print就代表网页inde ...
- Jsoup解析获取品花社图片
Jsoup解析获取品花社图片 emmmm,闲着没事,想起了之前一个学长做的品花社的APP,刚好之前有了解Jsoup这个Java解析HTML的库,便花了三四个小时写了这个东西,把网站上大大小小的MM的图 ...
- SoapUI之cookie设置
一.测试背景: 1)接口测试需要完成注册-->登录-->充值,使用soapui构建好测试用例.设置断言后,运行结果如下: 2)recharge接口运行失败,继续查看该接口具体发送的请求及返 ...
- springboot解决文件上传大小限制
(1)在配置文件(application.properties)加入如下代码 springboot2.0以下配置为: spring.http.multipart.maxFileSize = 10Mb ...
- Cronolog日志分割、定时清理
阿里云发送短信提示服务器磁盘占用到80%警报短信 经过排查发现tomcat日志文件达到10个多G,手动删除过久的日志文件后恢复到50% 但是catalina.out文件还有6个G 解决方法 一.安装C ...