MySQL查询语句

简单查询

执行顺序

mysql执行sql的顺序从 From 开始,以下是执行的顺序流程

1、FROM  table1 left join table2 on 将table1和table2中的数据产生笛卡尔积,生成Temp1

2、JOIN table2  所以先是确定表,再确定关联条件

3、ON table1.column = table2.columu 确定表的绑定条件 由Temp1产生中间表Temp2

4、WHERE  对中间表Temp2产生的结果进行过滤  产生中间表Temp3

5、GROUP BY 对中间表Temp3进行分组,产生中间表Temp4

6、HAVING  对分组后的记录进行聚合 产生中间表Temp5

7、SELECT  对中间表Temp5进行列筛选,产生中间表 Temp6

8、DISTINCT 对中间表 Temp6进行去重,产生中间表 Temp7

9、ORDER BY 对Temp7中的数据进行排序,产生中间表Temp8

10、LIMIT 对中间表Temp8进行分页,产生中间表Temp9

语法格式

select 字段1,字段2,字段3.... from 表名;

注:

1、任何一条sql语句以“;”结尾

2、sql语句不区分大小写

3、字段可以参与数据运算

给查询结果重命名

select 字段1 as '重命名' from 表名;

注:

1、标准sql语句中要求字符串使用单引号括起来。【MySQL也支持双引号,但是代码不通用,建议使用单引号】

查询全部字段

select * from 表名;

注:

1、实际开发中不建议使用*,效率低。

条件查询

语法格式

select 字段 from 表 where 条件;

注:

1、不等号表达:<>或者!=

2、结果集的去重:distinct

distinct出现在最前方,是后面所有字段联合起来去重。

distinct出现在某个字段前而不是最前方,只对当前字段去重

范围表示

第一种方式:

select name from emp where sal>=1000 and sal<=3000;

第二种方式:

select name from emp where sal between 1000 and 3000;

注:

(1)between...and...是闭区间[1000,3000]

(2)除了使用在数字方面,还可以用在字符串方面,例如:

select name from emp where name between 'A' and 'B';// 左闭右开

is null

is null或者is not null

如:select name from emp where sal is not null;

and、or

1、and:且

2、or:或

3、联合使用:注意优先级【运算符优先级不确定,加小括号】

in

select name from emp where name in( 'A', 'B');

可以等同于or,表示在括号中的都满足

not in

1、除了在括号内的

模糊查询like

%:表示任意多个字符

_:表示任意一个字符

select name from emp where name like ‘%O%’

表示找出名字里包含字母O的记录

select name from emp where name like '_A%'

表示找出名字第二个字母是A

注:

(1)可以使用转义字符\,将_或%变成普通字符

排序order by(升序、降序)

单字段排序

select ename from emp order by sal;

注意:(1)默认是升序排列,asc表示升序,desc表示降序

指定降序排序:select ename from emp order by sal desc;

(2)order by后可以跟数字,表示根据第几列排序

如:select ename from emp order by 1;【表示根据第一列字段进行排序,不建议使用,健壮性较差】

多字段排序 

select ename from emp order by sal desc , ename asc;

注:(1)越靠前的字段越能起到主导作用,只有在前面的字段无法完成排序的时候,才会启用后面的字段。

单行处理函数

1、只要有NULL参与的运算结果一定是NULL。

ifnull

查询一年工资

select ename, (sal + ifnull(com,0))*12 from emp;

分组函数/聚合函数/多处理函数

1、所有分组函数都是对“某一组”数据进行操作的。

2、分组函数自动忽略NULL,不需要添加额外条件。

3、分组函数不可直接使用在where子句中。【因为group by子句是在where执行之后才能执行,而分组函数必须在分完组之后使用】

count

取得记录数

查询总人数:

select count(*) from emp;

注:(1)count(*)和count(某个字段),count(*)是统计总记录条数,与某个字段无关;count(某个字段)是统计某个字段中不为NULL的数据总数量。

sum

查询工资总和

select sum(sal) from emp;

avg

查询平均工资

select avg(sal) from emp;

max

查询最高工资

select max(sal) from emp;

min

查询最低工资

select min(sal) from emp;

group by 和 having

1、group by:按照某个字段或者某些字段进行分组。【分组函数一般都会和gruop by联合使用】

2、having:having是对分组之后的数据进行再次过滤。【能使用where尽量使用where,having效率低】

3、并且任何一个分组函数都在group by语句执行结束之后才执行的。

4、一条语句中有group by 的话,select后面只能跟分组函数参加分组的字段。

连接查询

1、大部分情况下,都不是从单表中查询,一般都是从多张表联合查询取出最终结果。

连接查询的分类

1、根据语法出现年代划分:

(1)SQL92(一些老的DBA可能还在使用这种语法,Database Administrator,数据库管理员)

(2)SQL99(比较新的语法)

2、根据表的连接方式划分:

(1)内连接:

①等值连接

最大特点:条件是等量关系

案例:查询每个员工的部门名称,要求显示员工名和部门名。

SQL92:

select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno;

SQL99(常用):

select e.ename,d.dname from emp e inner join dept d on e.deptno = d.deptno;

上述语句中inner可以省略

②非等值连接

最大特点:关系是非等量关系

案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级

代码:select e.name, e.sal, s.grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal;

③自连接

最大特点:一张表看做两张表,自己连接自己。

案例:找出每个员工的上级领导,要求显示员工名和对应的领导名

代码:select a.ename, b.ename from emp a inner join emp b on a.mgr = b.empno;

(2)外连接:【左、右连接可以互相转换】

若查询没有数据匹配,则自动填NULL

①左外连接(左连接)【左边的表是主表】

案例:找出每个员工的上级领导,要求显示员工名和对应的领导名

select a.name, b.name from emp a left outer join emp b on a.mgr = b.empno;

②右外连接(右连接)【右边的表是主表】

案例:找出每个员工的上级领导,要求显示员工名和对应的领导名

select a.name, b.name from emp b right outer join emp a on a.mgr = b.empno;

注:outer可以省略

(3)全连接(不常用)

三张表的连接查询

案例:找出每一个员工的部门名称以及工资等级

代码:select e.ename, d.dname, s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal


注意:

...

        A

join

        B

join

        C

on

        ...

表示:A表先和B表进行连接,连接之后A表再继续和C表连接。

子查询

子查询可以出现的位置:

select

        ..(select)..

from

        ..(select)..

where

        ..(select)..

from后嵌套子查询 

案例:找出每个部门平均薪水的薪资等级

代码:select t.*, s.grade

           from

                (select deptno, avg(sal) as avgsal from emp group by deptno) as t

           join

           salgrade s

           on

                t.avgsal between s.losal adn s.hisal;

select后嵌套子查询

 案例:找出每个员工所在的部门名称,要求显示员工名和部门名

代码:select e.ename,(select d.dname from dept where e.deptno = d.deptno) as dname from emp e;

union【将查询结果集相加】

案例:找出工作岗位是SALESMAN和MANAGER的员工

代码:select ename,job from emp where job = 'MANAGER'

           union

           select ename,job from emp where job = 'SALESMAN'

注:(1)可以用于两张互不相关的表的查询结果拼接

       (2)union拼接的查询结果必须要有相同的字段数

limit

1、是mysql中特有的,用于分页查询。

2、limit取结果集中的的部分数据

3、语法机制

limit startIndex, length

        startIndex表示起始位置,第一个位置是0,不写默认是0

        length表示取记录条数

案例:取出工资前5名的员工

代码:select ename, sal from emp order by sal desc limit 0,5;

4、limit是sql语句最后执行的一个环节 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值