mysql连接查询、自查询
sql的写法:
找表
找查询的列
找查询条件
拼接语句
聚合函数
count()、sum()、avg()、min()、max()
对一组值执行计算 结合group by 使用 可结合having 对分组之后筛选
不可用于WHERE语句中,因为WHERE是对逐条的行记录进行筛选。
sql语句的顺序
编写顺序:SELECT ——》FROM ——》 WHERE ——》 GROUP BY ——》HAVING ——》ORDER BY ——》LIMIT
执行顺序: FROM ——》 WHERE——》 GROUP BY——》HAVING ——》SELECT——》 ORDER BY ——》LIMIT
多表查询
表连接不止两张表,可以是多张表
内连接:符合连接条件
SELECT * FROM emp e JOIN dept d ON e.deptno = d.deptno; #标准写法 SELECT * FROM emp e, dept d WHERE e.deptno = d.deptno; #非标准写法
外连接:符合连接条件+不符合其中某张表的条件
左外连接 A LEFT OUTER JOIN B
左边表的数据全部显示 主表为左表
右外连接 A RIGHT OUTER JOIN B
右边表的数据全部显示 主表为右表
自连接 一张表连接查询多次
#查询员工的姓名和对应领导的姓名 -- 自连接(内连接) SELECT e.ename as '员工',e2.ename as '领导' from emp e JOIN emp e2 on e2.empno = e.mgr; #要全部员工都出来 外连接 SELECT e.ename as '员工',e2.ename as '领导' from emp e left JOIN emp e2 on e2.empno = e.mgr;
表连接查询
#根据员工编号查询员工的姓名,薪水,岗位,部门名称,薪水等级
#n张表的连接 n-1个连接条件
-- 表:emp dept grade 2个连接条件
SELECT
e.ename,e.sal,e.job,d.dname,g.grade
FROM
emp e
JOIN dept d ON e.deptno = d.deptno
JOIN grade g ON e.sal BETWEEN g.lower AND g.higher
WHERE
e.empno = 7788;
子查询
子查询出现的位置 :
where后,作为条件的一部分;
from后,作为被查询的一条表;
select之后,作为被查询的一列。
子查询的结果:
结果 | 作为 |
---|---|
单行单列 | 条件 |
多行多列 | 表 |
单行多列 | 表、条件 |
多行单列 | 作为条件 |
比较运算符 < > = <= >= <>只能与单个值比较
=
—— IN
<> !=
—— NOT IN
< >
—— ANY 、 ALL
-- 查询员工信息 他的岗位与薪水与MARTIN 一样
SELECT * FROM emp WHERE job = (SELECT job from emp where ename = 'MARTIN') AND sal = (SELECT sal from emp where ename = 'MARTIN') AND ename <> 'MARTIN';
#最终简化版 使用多列in 多列作为整体,必须用括号引起
#子查询的结果与列的个数与in前面的列的个数一样,顺序一样
SELECT * FROM emp WHERE (job,sal) in (SELECT job,sal FROM emp WHERE ename = 'MARTIN' ) and ename <> 'MARTIN';
-- 查询工资高于部门30的所有人的员工信息
SELECT * from emp WHERE sal > ALL(SELECT sal FROM emp WHERE deptno =30);
-- 工资比部门30的任何一个人低
SELECT * from emp WHERE sal < ANY(SELECT sal FROM emp WHERE deptno =30);
#小于部门30的工资最大值
SELECT * from emp where sal < (SELECT max(sal) FROM emp WHERE deptno =30);# 小于任意一个 <最大值 大于任意一个 >最小值
例1
行列转换
方法1 使用聚合函数
SELECT `name` ,sum(IF(course='hibernate',score,0))AS'hibernate' ,sum(IF(course='spring',score,0))AS'spring' ,sum(IF(course='struts',score,0))AS'struts'FROM tb_course GROUP BY `name`;
方法2 表连接查询
select DISTINCT t1.name,
(SELECT t2.score from tb_course t2 where t2.course = 'hibernate' AND t2.name = t1.name) hi,
(SELECT t3.score from tb_course t3 where t3.course = 'spring' AND t3.name = t1.name) sp,
(SELECT t4.score from tb_course t4 where t4.course = 'struts' AND t4.name = t1.name) st
from tb_course t1;
例2
与例1方法1同样写法
SELECT `year` ,sum(IF(month='1',amount,0))AS'm1' ,sum(IF(month='2',amount,0))AS'm2' ,sum(IF(month='3',amount,0))AS'm3',sum(IF(month='4',amount,0))AS'm4' FROM test4 GROUP BY `year`;
例3
-- 17.查询出 king 所在部门的部门号\部门名称\部门人数
#找出king的部门号
SELECT deptno from emp WHERE ename = 'KING';
#通过部门号找名字
SELECT e.deptno,d.dname from emp e left join dept d on d.deptno = e.deptno where e.deptno = (SELECT deptno from emp WHERE ename = 'KING');
#通过部门号找人数
SELECT deptno,count(1) num from emp where deptno = (SELECT deptno from emp WHERE ename = 'KING') GROUP BY deptno
#奇怪的多余写法
SELECT t.deptno,d.dname,num from dept d left join ( SELECT deptno,count(1) num from emp where deptno = (SELECT deptno from emp WHERE ename = 'KING') GROUP BY deptno)t on t.deptno = d.deptno WHERE t.deptno = d.deptno;#正确写法 表连接嵌套查询
select t.countno,d.dname,d.loc from dept d,(
select count(*) countno,deptno from emp where deptno in(
select deptno from emp where ename='KING') group by deptno )t where d.deptno=t.deptno;
例4
-- 13.查找出工资等级不为 4 级的员工的员工名字,部门名字,部门位置
#1.先找等级为4的界限
SELECT LOWER,higher FROM grade WHERE grade = 4;
#找出工资等级不为4的员工名字
SELECT ename from emp WHERE sal NOT BETWEEN (SELECT LOWER FROM grade WHERE grade = 4) AND (SELECT higher FROM grade WHERE grade = 4)
#结合部门名字,部门位置
SELECT e.ename,d.dname,d.loc FROM emp e JOIN dept d on d.deptno = e.deptno and e.sal NOT BETWEEN (SELECT LOWER FROM grade WHERE grade = 4) AND (SELECT higher FROM grade WHERE grade = 4);
例5
-- 10.分部门得到平均工资等级为 3 级(等级表)的部门编号
--
SELECT
deptno,
avg_sal,
g.grade
FROM
( SELECT deptno, AVG( sal ) avg_sal FROM emp GROUP BY deptno) t
JOIN grade g ON t.avg_sal BETWEEN g.lower
AND g.higher
WHERE
g.grade = 3;
例6
-- 25. 列出薪金高于公司平均薪金的所有员工信息emp,所在部门名称dept,上级领导emp,工资等级grade
SELECT e1.*, d.dname,e2.*,g.grade
FROM emp e1
LEFT JOIN dept d ON e1.deptno = d.deptno
LEFT JOIN emp e2 ON e1.mgr = e2.empno
JOIN grade g ON e1.sal BETWEEN g.lower AND g.higher
WHERE e1.sal > (
SELECT AVG(sal) FROM emp
);e2找出领导的信息 d找出部门信息
mysql连接查询、自查询相关推荐
- mysql 连接 选库 查询
mysql_fetch_row 从结果集中取出一行作为枚举数组 <?php $db_conn=mysql_connect('127.0.0.1','root','123456') or die ...
- mysql连接与嵌套查询_数据库之嵌套查询与连接查询
嵌套查询 单值嵌套查询 值返回结果是一个值的嵌套查询称为单值嵌套查询 对Sales数据库,列出市场部的所有员工的编号 USE Sale GO SELECT employee_id FROM emplo ...
- mysql连接代替子查询_MySQL优化之使用连接(join)代替子查询
使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询.这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询 ...
- mysql连接与嵌套查询_数据库的连接查询和嵌套查询怎么做啊?
4. select 订货单号,进货量 from 商品表,订货表 where 商品表.商品编号=订货表.商品编号 and 商品名称='螺母' 5. select 订货单号,进货价格 from 商品表,订 ...
- python连接MySQL并进行数据查询
python连接MySQL并进行数据查询 #建立数据库的连接 mydb = mysql.connector.connect(host="0.0.0.0",user="ro ...
- mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引
一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...
- mysql 连接查询两个条件_MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习...
一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建一个数据库,那数据库里面是不是存了好多张表啊,不可能把所有的数据都放到一张表里面,肯定要分表来存数据,这样节 ...
- MySQL外键关联(一对多)MySQL连接查询
MySQL外键关联(一对多) 外键说明 什么是外键? 1)表A中有字段(如身份证号)做了主键,表B中也有这个字段(身份证号),这里的身份证号一定来自表A同样字段里的内容,但再B表中身份证号对应id可以 ...
- mysql数据库入门教程(5):多表操作(连接查询,子查询,分页查询,联合查询)
前文介绍了单表查询:mysql数据库入门教程(4):查询讲解大全 今天介绍下多表查询 一.连接查询 含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询 先送上下面所讲用到的sql脚本 h ...
- MySql连接查询与联合查询
PS:相关环境 测试表: DROP TABLE IF EXISTS `boys`; CREATE TABLE `boys` (`id` int(11) NOT NULL AUTO_INCREMENT, ...
最新文章
- Paddle 网络中的Tensor 数据结构
- 循环录(输)入 java 课的学生成绩(5个学生),统计分数大于等于 80 分的学生
- 【转】【分享】5G核心网基础知识
- ThinkPHP之add、save无法添加、修改的解决方案
- 27muduo_net库源码分析(三)
- [转]写一个块设备驱动(第一章)
- [已失效]坦白说(查看好友)抓包教程+解密工具
- android 模拟器传文件夹里,夜神安卓模拟器和电脑互传文件的操作流程
- LATTICE FPGA 工具介绍之ACTIVE-HDL 建立工程及仿真步步来(2)
- 各厂家端口MTU计算及应用
- 端游开发用什么技术可以让用户更短时间内体验游戏?端游分发...
- 彻底弄透Java处理GMT/UTC日期时间
- 为什么要采用技术外包
- ARM芯片、内核、架构、指令集的联系与区别
- C语言程序设计:猜数游戏
- 苹果应用中含有第三方支付怎么办?
- 经验分享 | 搭建帮助中心的最强攻略
- 普元 AppServer在window2019中无法启动server,也没有报错信息
- STM32中事件标志位与中断标志位
- InfluxDB CQ时间偏移