sql的写法:

  1. 找表

  2. 找查询的列

  3. 找查询条件

  4. 拼接语句

聚合函数

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连接查询、自查询相关推荐

  1. mysql 连接 选库 查询

    mysql_fetch_row  从结果集中取出一行作为枚举数组 <?php $db_conn=mysql_connect('127.0.0.1','root','123456') or die ...

  2. mysql连接与嵌套查询_数据库之嵌套查询与连接查询

    嵌套查询 单值嵌套查询 值返回结果是一个值的嵌套查询称为单值嵌套查询 对Sales数据库,列出市场部的所有员工的编号 USE Sale GO SELECT employee_id FROM emplo ...

  3. mysql连接代替子查询_MySQL优化之使用连接(join)代替子查询

    使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询.这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询 ...

  4. mysql连接与嵌套查询_数据库的连接查询和嵌套查询怎么做啊?

    4. select 订货单号,进货量 from 商品表,订货表 where 商品表.商品编号=订货表.商品编号 and 商品名称='螺母' 5. select 订货单号,进货价格 from 商品表,订 ...

  5. python连接MySQL并进行数据查询

    python连接MySQL并进行数据查询 #建立数据库的连接 mydb = mysql.connector.connect(host="0.0.0.0",user="ro ...

  6. mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引

    一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...

  7. mysql 连接查询两个条件_MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习...

    一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建一个数据库,那数据库里面是不是存了好多张表啊,不可能把所有的数据都放到一张表里面,肯定要分表来存数据,这样节 ...

  8. MySQL外键关联(一对多)MySQL连接查询

    MySQL外键关联(一对多) 外键说明 什么是外键? 1)表A中有字段(如身份证号)做了主键,表B中也有这个字段(身份证号),这里的身份证号一定来自表A同样字段里的内容,但再B表中身份证号对应id可以 ...

  9. mysql数据库入门教程(5):多表操作(连接查询,子查询,分页查询,联合查询)

    前文介绍了单表查询:mysql数据库入门教程(4):查询讲解大全 今天介绍下多表查询 一.连接查询 含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询 先送上下面所讲用到的sql脚本 h ...

  10. MySql连接查询与联合查询

    PS:相关环境 测试表: DROP TABLE IF EXISTS `boys`; CREATE TABLE `boys` (`id` int(11) NOT NULL AUTO_INCREMENT, ...

最新文章

  1. Paddle 网络中的Tensor 数据结构
  2. 循环录(输)入 java 课的学生成绩(5个学生),统计分数大于等于 80 分的学生
  3. 【转】【分享】5G核心网基础知识
  4. ThinkPHP之add、save无法添加、修改的解决方案
  5. 27muduo_net库源码分析(三)
  6. [转]写一个块设备驱动(第一章)
  7. [已失效]坦白说(查看好友)抓包教程+解密工具
  8. android 模拟器传文件夹里,夜神安卓模拟器和电脑互传文件的操作流程
  9. LATTICE FPGA 工具介绍之ACTIVE-HDL 建立工程及仿真步步来(2)
  10. 各厂家端口MTU计算及应用
  11. 端游开发用什么技术可以让用户更短时间内体验游戏?端游分发...
  12. 彻底弄透Java处理GMT/UTC日期时间
  13. 为什么要采用技术外包
  14. ARM芯片、内核、架构、指令集的联系与区别
  15. C语言程序设计:猜数游戏
  16. 苹果应用中含有第三方支付怎么办?
  17. 经验分享 | 搭建帮助中心的最强攻略
  18. 普元 AppServer在window2019中无法启动server,也没有报错信息
  19. STM32中事件标志位与中断标志位
  20. InfluxDB CQ时间偏移

热门文章

  1. freetype用法
  2. 当电脑出现的验证码老是提示输入错误怎么办?
  3. 计算机教育杂志有核心期刊吗,计算机教育杂志是核心期刊吗?
  4. Java中如何定义一个数组呢?
  5. Mac版本的夜神模拟器
  6. 有关AE2020中文版改为英文版的方法
  7. categories与set_categories
  8. 花花世界的flowers in December
  9. Spring之面向切面编程AOP(八)
  10. 人才外包公司成本大揭露——一个外包人员的分析