单表查询,多表查询,子查询---day37
1.单表查询
# ### part1 单表查询
# sql 查询语句的完整语法
'''select..from..where..group by..having..order by..limit..''' #一.where 条件的使用
'''功能:对表中的数据进行筛选和过滤'''
'''
语法:
1.判断的符号
= > >= < <= != <> 不等于
2.拼接条件的关键字
and or not
3.查询的区间范围值 between
between 小值 and 大值 [小值,大值]查询两者之间这个范围内所有数据
4.查询具体某个值的范围 in
in(1,2,3) 指定范围
5.模糊查询 like "%" "_" 通配符
like "%a" 匹配以a结尾的任意长度的字符串
like "a%" 匹配以a开头的任意长度的字符串
like "%a%"匹配含有a字母的任意长度的字符串
like "_a" 个数一共2个字符,必须以a结尾,前面的字符随意
like "a__"个数一共3个字符,必须以a开头,后面的字符随意
''' #(1) 单条件的查询
#查询部分是sale的所有员工姓名
select emp_name from employee where post = "sale"; #(2)多条件的查询
#部分是teacher,收入大于10000的所有数据
select * from employee where post = "teacher" and salary >10000; #(3)关键字 between..and..
#收入在1万到2万之间的所有员工姓名和收入
select emp_name,salary from employee where salary between 10000 and 20000;
#收入不在1万到2万之间的所有员工姓名和收入
select emp_name,salary from employee where salary not between 10000 and 20000; #(4) null 关键字 在查询的时候,要用is进行判定,不要用=
#查询post_comment 是空的所有数据
select * from employee where post_comment is null;
select * from employee where post_comment is not null; #(5)关键字 in 在..之中查询
#查询收入是3000,4000,5000,8300所有员工的姓名和收入
select emp_name,salary from employee where salary in(3000,4000,5000,8300);
#不在 not in
select emp_name,salary from employee where salary not in (3000,4000,5000,8300); #(6)模糊查询 like "%" '_'通配符
#(1)"%"通配符 以on结尾的员工名搜一下
select emp_name,age,post from employee where emp_name like '%on';
#(2) "_"通配符 可以限定具体的长度
select emp_name,age,post from employee where emp_name like "a_e_"; #(7) concat( as 起别名)
select concat("姓名:",emp_name,"工资:",salary) as aa from employee;
#concat_ws(拼接的符号,参数1,参数2,参数3,...)
select concat_ws(":",emp_name,salary) as bb from employee;
#计算年薪 可以在mysql中使用四则运算符(+ - * /)
select concat_ws(":",emp_name,salary*12) as cc from employee; #二.group by 子句 分组分类
'''group by 字段 对数据进行分类,by后面接什么字段,select就搜索什么字段'''
select sex from employee group by sex;
select post from employee group by post;
#group_concat 按照分类的形式进行字段的拼接
select group_concat(emp_name),post from employee where id >5 group by post; #配合聚合函数使用
#count 统计总数 * 所有
select count(*) from employee;
#max 统计最大值
select max(salary) from employee;
#min 统计最小值
select min(salary) from employee;
#avg 统计平均值
select avg(salary) from employee;
#sum 统计总和
select sum(salary) from employee; #一般情况下 分组 + 聚合函数 配合使用
#1。查询部分名以及各部分的平均薪资
select post,avg(salary) from employee group by post;
#2.查询部分名以及个部分的最高薪资
select post,max(salary) from employee group by post;
#3.查询部门名以及个部分的最低薪资
select post,min(salary) from employee group by post;
#4.查询公司内男员工和女员工的个数
select sex,count(*) from employee group by sex;
#5.查询部分名以及部门包含的所有员工名字
select group_concat(emp_name) from employee group by post;
#可以group by 两个字段,即可搜索两个字段
select emp_name,post from employee group by post,emp_name; #三.having 数据在分类分组之后,进行二次数据过滤,一般是配合group by使用,分组之后再过滤
#找出各部门平均薪资,并且大于10000以上的所有部门
select post,avg(salary) from employee group by post having avg(salary) > 10000; #1.查询各岗位内包含的员工个数小于2的岗位名、查询岗位内包含员工名字、个数
select post,group_concat(emp_name),count(*) from employee group by having count(*) < 2;
#2.查询各岗位平均薪资小于10000的岗位名、平均工资
select post,avg(salary) from employee group by post having avg(salary) <10000;
#3.查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资
select post,avg(salary) from employee group by post having avg(salary) between 10000 and 20000; #四.order by 排序,按照什么字段进行排序
#asc 升序:从小到大(默认)
#desc 降序:从大到小
select * from employee order by age;(asc 可以不写)
select * from employee order by age desc; #1.查询所欲员工信息,先按照age升序排序如果age相同则按照hire_date降序排序
select emp_name,age,hire_date,post from employee order by age,hire_date desc;
#2.查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资升序排列
select post,avg(salary) from employee group by post having avg(salary) > 10000 order by avg(salary) asc;
#3.查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资降序排列
select post,avg(salary) from employee group by post having avg(salary) > 10000 order by avg(salary) desc; #五.limit 限制查询条数(数据分页)
'''limit m,n m代表从第几条数据查询,n代表查询几条,m=0 代表的是第一条'''
select * from employee limit 0,5; #从第一条数据开始搜,搜5条
select * from employee limit 5,5; #从第六条数据开始搜,搜5条
#只查询一条数据
select * from employee limit 1;
#找数据库当中最后一条数据
select * from employee order by id limit 1;
#找数据库当中最后三条数据
select * from employee order by id limit 3; #六(了解) 可以使用正则表达式查询数据(不推荐使用,效率不高)
select * from employee where emp_name regexp ".*?on$"; #.*?不识别
select * from employee where employee regexp "^程";
select * from employee where employee regexp "^程.*金";
2.多表查询
# ### part2 多表查询
#内连接:(内联查询 inner join) -> 两表或者多表满足条件的所有数据查询出来(两表之间共有的数据)
'''
#两表查询
select 字段 from 表1 inner join 表2 on 必要的关联条件
#多表查询
select 字段 from 表1 inner join 表2 on 必要的关联条件1 inner join 表3 on 必要的关联条件2...
'''
#基本语法 inner join on .. on 后面接必要的关联条件
select * from employee inner join department on employee.dep_id = department.id;
#用as 起别名(推荐)
select * from employee as e inner join department as d on e.dep_id = d.id;
#as 可以省略掉
select * from employee e inner join department d on e.dep_id = d.id; #where 默认实现的就是内联查询的效果
select * from employee,department where employee.dep_id = department.id;
select * from employee as e,department as d where e.dep_id = d.id; #外连接
#(1)左连接(左联查询left join)以左表为主,右表为辅,完整查询左表所有数据,右表没有的数据补null
select * from employee left join department on employee.dep_id = department.id;
#(2)右连接(右联查询right join)以右表为主,左表为辅,完整查询右表所有数据,左表没有的数据补null
select * from employee right join department on employee.dep_id = department.id;
#(3)全连接(全连接union) 所有的数据都合并起来
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;
3.子查询
# ###part3 子查询
'''
子查询:嵌套查询
(1)sql语句当中有嵌套了另外一条sql语句,用括号()包起来,表达一个整体
(2)一般应用在from子句后面表达一张表,where子句后面表达一个条件
(3)查询速度从快到慢:单表查询 -> 联表查询 -> 子查询
''' #一.找出平均年龄大于25岁以上的部分
#(1)普通where写法
select d.id,d.name from employee as e,department as d
where e.dep_id = d.id group by d.id,d.name having avg(e.age) > 25;
#(2) inner join
select d.id,d.name from employee as e inner join department as d
on e.dep_id = d.id group by d.id,d.name having avg(e.age) > 25;
#(3)子查询
#1.先选出平均年龄大于25的部分id
select dep_id from employee group by dep_id having avg(age) > 25;
#2.通过部门id,找部门的名字
select name from department where id in(201,202);
#3.综合拼接
select id,name from department where id in (select name from department where id in(201,202)) #二。查看技术部门员工姓名
#(1) 普通where 查询
select e.name,d.name from department as d,employee as e
where d.id = e.dep_id and d.name = '技术';
#(2) inner join 写法
select e.name,d.name from department as d inner join employee as e
on d.id = e.dep_id where d.name = "技术";
#(3)子查询
#1.找技术部门对应id
select id from department where name = "技术";
#2.通过id找员工姓名
select name from employee where dep_id = 200;
#3.综合拼接
select name,dep_id from employee where dep_id = (select id from department where name = "技术"); #三.查看哪个部门没有员工
#联表写法(把null的数据露出来,员工的部门dep_id 为null,代表这个部门没人)
select d.id,d.name from department as d left join employee as e
on d.id = e.dep_id where e.dep_id is null;
#子查询
#1.先查询,员工在哪些部门(所有员工的分类分别是200 201 202 204)
select dep_id from employee group by dep_id
#2.把不在部门的数据找出来
select id from department where id not in(200,201,202,204);
#综合拼接
select id,name from department where id not in(select id from department where id not in(200,201,202,204)); #四.查询大于平均年龄的员工名与年龄
#假设平均年龄20岁
select name,age from employee where age >20
#找平均年龄
select avg(age) from employee;
#综合拼接
select name,age from employee where age>(select avg(age) from employee); #五。把大于其本部门平均年龄的员工名和姓名查出来
#1.先计算各部门平均年龄是多少
select dep_id,avg(age) from employee group by dep_id;
#2.把查询的各部门的平均年龄和过去的employee联表,变成更大的表,方便做一次单查询
select * from employee as t1 inner join (1号查询到的数据) as t2 on t1.dep_id = t2.dep_id;
#3.综合拼接
select * from employee as t1 inner join
(select dep_id,avg(age) as avg_age from employee group by dep_id) as t2 on t1.dep_id = t2.dep_id;
#4.做最后的数据筛选age >平均年龄
select * from employee as t1 inner join (select dep_id,avg(age) as avg_age from employee group by dep_id) as t2
on t1.dep_id = t2.dep_id where t1.age > t2.avg_age; # 六.查询每个部门最新入职的那位员工 # 利用上一套数据表进行查询;
#1.找每个部门最大的入职时间
select post,max(hire_date) as max_data from employee group by post;
#2.把子查询搜出来的数据和employee联合成一张更大的表,做一次单标查询
select t1.emp_name,t1.hire_date from employee t1 inner join
(1号查出来的数据) as t2 on t1.post = t2.post where t1.hire_date = t2.max_data;
#3.综合拼接
select t1.emp_name,t1.hire_date from employee t1 inner join
(select post,max(hire_date) as max_data from employee group by post) as t2 on t1.post = t2.post where t1.hire_date = t2.max_data; #七.dai EXISTS关键字的子查询
'''
exists 关键字,表达存在
如果内层sql 能够查到数据,返回True,外层sql执行查询语句
如果内层sql不能查到数据,返回False,外层sql不执行查询语句
'''
select * from employee where exists(select * from employee where id = 1);#能
select * from employee where exists(select * from employee where id = 100);#不能 '''
子查询总结:
子查询可以单独作为一个临时数据,临时的表,临时的字段
一般用在from where select 子句后面
可以通过查询出来的临时数据和另外的表联合,变成一张更大的表,在做单表查询查到想要的数据
'''
4.补充
# ### 补充
#关于约束的添加和删除
#1.添加/删除 约束 not null
#alter table t1 modify id int not null;
alter table t1 modify id int; #2.添加/删除 unique 唯一索引
#alter table 表名 add unique(id)
alter table t1 add unique(id)
alter table t1 drop index id #3.添加/删除 primary key
#alter table 表名 add primary key(id);
alter table t1 add primary key(id);
alter table t1 add primary key; #4.添加/删除 foreign key 外键(先通过desc 表 找到外键名字,然后再删)
alter table student1 drop foreign key student1_ibfk_1; #删除
alter table student1 add foreign key(classid) references class1(id);#添加
单表查询,多表查询,子查询---day37的更多相关文章
- mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长
一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select name fr ...
- oracle之复杂查询(下):子查询
复杂查询(下):子查询 8. 1 非关联子查询:返回的值可以被外部查询使用.子查询可以独立执行的(且仅执行一次). 8.1.1 单行单列子查询,子查询仅返回一个值,也称为标量子查询,采用单行比较运算符 ...
- mysql加强(6)~子查询简单介绍、子查询分类
一.子查询简单介绍 1.什么是子查询? 一个查询之中嵌套了其他的若干查询. 在使用select 语句查询时,有时候where的查询条件中的限制条件不是一个确定的值,而是一个来自于另一个查询的结果. 子 ...
- Entity Framework查询生成大量的子查询,如何避免?求救
最近使用Entity Framework做一个中型的项目,一张表含有千万条数据,并没有使用很复杂的查询,只是程序上使用了DTO进行帅选数据,且使用了分页,效果很不理想.经过跟踪sql,我发现很多简单的 ...
- SQL基础教程(第2版)第5章 复杂查询:5-3 关联子查询
第5章 复杂查询:5-3 关联子查询 ● 关联子查询会在细分的组内进行比较时使用.● 关联子查询和GROUP BY子句一样,也可以对表中的数据进行切分.● 关联子查询的结合条件如果未出现在子查询之中就 ...
- MySQL 嵌套子查询 with子句 from子查询 in子查询 join组合
一.适用场景和方法 (1)适用场景 考虑查询过程中是否存在以下情况: 查询某些数据时需要分组才能得到,某些数据不需要分组就能得到或者分组条件不同: 查询某些数据时需要where条件,某些列不需要whe ...
- Mysql 多表数据拼接插入及子查询结果集随机取一条
最近遇到一个测试数据的需求,需要往一个表中插入4个来源的数据. 往orders 表中插入 来自 sql_person cm_user_car_model cm_sp_product_new 部分固定数 ...
- sql数据库查询相关操作,SQL的应用——SQL多表连查、子查询、多行子查询
? 1 **SQL多表连查** ? 1 2 3 4 5 6 7 8 --查询员工和部门信息 select * from emp e,dept d where e.deptno=d.deptno --查 ...
- MySQL 子查询(四)子查询的优化、将子查询重写为连接
MySQL 5.7 ref ——13.2.10.10优化子查询 十.子查询的优化 开发正在进行中,因此从长远来看,没有什么优化建议是可靠的.以下列表提供了一些您可能想要使用的有趣技巧.See also ...
- SQL疑难杂症【4 】大量数据查询的时候避免子查询
前几天发现系统变得很慢,在Profiler里面发现有的SQL执行了几十秒才返回结果,当时的SQL如下: 可以看得出来,在652行用了子查询,恰巧目标表(QS_WIP)中的记录数为100000000+, ...
随机推荐
- [转帖]服务器稳定性测试-LTP压力测试方法及工具下载
简介 LTP(LinuxTest Project)是SGI.IBM.OSDL和Bull合作的项目,目的是为开源社区提供一个测试套件,用来验证Linux系统可靠性.健壮性和稳定性.LTP测试套件是测试L ...
- 一个简单的监控java进程获取日志的办法
公司里面一个长时间运行的环境会出现问题, 这边简单写了一个脚本自动获取日志信息 脚本如下 注意 我的path 其实就是复用的 我们应用里面的jdk 剩下的就非常简单了. 每个日志都自动打包 并且移除 ...
- 记windows自定义bat脚本自启动
自定义 Windows 启动脚本简化版 在本指南中,我们将使用一个简化的批处理文件(.bat)来演示如何创建自定义的 Windows 启动脚本.以下是一个基本的模板,您只需根据需要在 :begin 部 ...
- 如何处理开发环境没有问题,线上环境有问题这个bug
解决思路 首先确认开发环境有没有这个问题: 如果没有这个问题: 将你的地址切换为线上的环境,看看线上环境有没有这个问题: 如果切换为线上环境有这个问题,就可以调试了: 如果切换为线上环境没有这个问题, ...
- electron-builder
electron-builder打包工具 首先,确保你的项目中已经安装了 electron-builder.可以在项目根目录下运行以下命令来安装它: npm install electron-buil ...
- 在ECS中安装Docker在内部访问RDS数据库
Navicat连接阿里云RDS数据库入门 https://blog.csdn.net/fenxunkao0106/article/details/106594276 https://www.cnblo ...
- SqlSugar联表查询
Join用法 语法糖1.2和3 在Where OrderBy GroupBy Select用法都一样的,他们区别就在JOIN的方式不一样,其它都一样 语法糖1 优点:好理解,5个表以内的联表非常爽,支 ...
- 【三】强化学习之PaddlePaddlle-Notebook、&pdb、ipdb 调试---及PARL框架
相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...
- Volatility 内存数字取证方法
计算机数字取证分为内存取证和磁盘取证,活取证与死取证,不管是那种取证方式,都应尽量避免破环犯罪现场,例如通过内存转储工具对内存进行快照,通过磁盘克隆工具对磁盘进行克隆,方便后期的分析工作,这里将研究内 ...
- Ubuntu ISO镜像文件下载(Ubuntu 22.04.2 LTS)
Ubuntu 22.04.2 LTS 链接:https://pan.baidu.com/s/1YuWSOBH9mTZMjJTW7HM91g 提取码:b8lf