mysql规格值查询_mysql数据查询(重点)

mysql数据查询

一:简单的查询语句(DQL)

语法格式:select 字段名1,字段名2,字段名3... from 表名;

提示:

1.任何一条sql语句以“;”结尾的。

2.sql语句不区分大小写。

3.sql语句中想要出现中文,必须把中文单引号括起来。

4.想要把修改后的数据重命名,则不用逗号,而是用as

举例:

select ename,sal*12 from emp;/select ename,empno fromemp;

重命名:select ename,sal*12 as '年薪' from emp;

二:条件查询:

语法格式:select 字段,字段。。。 from 表明 where 条件 and/or 条件;//and交,or并。优先级直接用括号表示

举例:

查询对应工资的员工:select ename from emp where sal >= 5000;

查询对应员工的工资:select sal from emp where ename = 'zhangsan';

注意:

1.当需要查询含有null的数据的时候,需要用is来判断是不是null

select sal from emp where sal is null;

2.特殊查询字句:in;(查询多个的时候,等同于or)

select enamel,job from emp where job in('salesman','manger');

三:模糊查询:eg:找出名字中含有某字符或字符串时候用

注意:%:代表任意多个字符,_代表任意一个字符

select ename from emp where ename like '%o%';//找出含有o的名字select ename from emp where ename like '_A%';//找出第二个字符是A的名字select ename from emp where ename like '%\_%'//使用转义字符,将_无意义

四:数据排序:(升序和降序)

语法格式:select 字符段,字符段 from 表名 order by 需要排序的数据列

默认为升序,asc表示升序,desc表示降序。:

按照工资升序/降序,找出员工名和薪资

select ename,sal from order by sal asc;//升序排列select ename,sal from order by sal desc;//降序排列

按照工资降序排列,当工资相同的时候再按照名字的升序排列(按照顺序判断排序相关性的重要性)

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

综上所述:执行顺序:select from where order by

五:分组函数:count计数,sum求和,avg平均值,max最大值。min最小值,ifnull判断是否为null的一个函数,先分组,再取最大值

select sum(sal) from emp;//工资总和select max(sal) from emp;//最高工资select min(sal) from emp;//最低工资select avg(sal) from emp;//平均工资select count(*) from emp;//找出总人数select count(sal) from emp;//找出总人数select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;//如果是null的话,将其看成是0,然后再相加,否则含有null的式子全部看成是nullselect xx from emp group by job;//要求查询到每一组的最高或者最低,先通过group 不用先分组,再查询最高和最低。注意:where在group by执行前就执行完成,之后再分组

分组函数的过滤顺序:

1.select ,2.from,3.where,4.group by,5.having,6.order by

子查询:select嵌套语句:

select ename,sal from emp where sal>(select avg(sal) from emp);

找出每个工作岗位的最高薪资:

select ename,max(sal),job from emp group by job;

找出每个部门不同工作岗位的最高薪资:(去寻找有几个变量,这里面有两个)

select deptno,job,max(sal) from emp group by deptno,job;

注意:当一条语句中有group by的话,select后面只能跟分组函数和参加分组的字段

六:having的使用:(处理使用情况:分完组后算出来的数据)

eg:找出每个部门的最高薪资,要求显示大于2900的数据

select max(sal),depno from emp group by deptno having max(sal)>2900;//效率低下select max(sal),depno from emp where sal>2900 group by deptno;效率高,能使用where就是用where,不能用再使用having

eg:找出每个部门的平均薪资,要求显示薪资大于2000的数据

select deptno,avg(sal) from emp group by depno having avg(sal)>2900

七:去除查询重复记录:distinct必须出现在最前方,表示后面字段联合去重。

查询工作岗位(不出现重复的工作岗位)

select distinct job from emp;

八:连接查询:

在实际开发中,一个业务对应多张表,比如:学生和班级,起码两张表

分类:

内连接:

1.等值连接:(等量关系)

查询每个员工的部门名称,要求显示员工名和部门名(当然也可以用92语法简单式子,但是用join和on把连接条件单独分割开来)

select字段,字段fromA表joinB表on链接相等的条件where筛选条件

2.非等值连接:(不是等量关系)

找出每个员工的薪资等级,显示员工名,工资,工资等级

selecte.ename,e.sal,s.gradefromemp ejoinsalgrade sone.salbetween s.losal and s.hisal;

3.自连接(一张表看成两张表,自己连接自己)可用等值和非等值连接

找出每个员工的上级领导,要求显示员工名和对应的领导。(员工的领导表=领导表的员工编号)

selecta.ename,b.enamefromemp ainner joinemp bona.mgr=b.empno;

外连接:

定义:内连接的两张表时平等的,外连接的两张表分主表和副表。主要查询主表,捎带查询副表,如果副表上面没有匹配主表,则生成NULL与之匹配

特点:主表的数据无条件的全部查询出来

左外连接(左连接):左边的表时主表

selecta.ename'员工',b.ename'领导'

fromemp bleft join//left outer joinemp aona.mgr=b.empno;

右外连接(右连接):右边的表时主表

selecta.ename'员工',b.ename'领导'

fromemp bleft join//left outer joinemp aona.mgr=b.empno;

eg:查询不是null的所有员工的工资的员工所有信息

selectd.*

fromemp eright joindept done.deptno=d.deptnowheree.emptnois not null;

全连接:不常用

笛卡尔乘积现象:如果两张表连接查询的时候,没有限制要求,则会出现相乘个数据。

select ename,dname from emp,dept;

避免笛卡尔积现象:加条件避免

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

给表起一个别名,来区分字段在哪个表里面

select e.ename,d.dname from emp e,dept d;

九:三张以上表连接查询

语法:

selectxxxxxfromAjoinBjoinC

A与B表连接的结果再与C连接

eg:找出每一个员工的部门名称,工资等级

selecte.ename,d.dname,s.gradefromemp ejoindept done.deptno=d.deptnojoinsalgrade sone.salbetween s.losal and s.hisal;

eg:找出每一个员工的部门名称,工资等级,以及上级领导

selecte.ename,d.dname,s.grade,e1.ename'领导'

fromemp ejoindept done.deptno=d.deptnojoinsalgrade sone.salbetween s.losal ands.hisalleft join//重点

emp e1one.mgr=e1.empno;

十:子查询:

select语句嵌套select语句

select...(select)from...(select)where...(select)

where后面嵌套:

找出高于平均薪资的员工信息select * from emp where sal>(select avg(sal) from emp);

from后面嵌套

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

第一步:

找出每个部门平均薪水,按部门编号分组select deptno,avg(sal) as avgsal from emp group bydeptno;

第二步:

将以上的查询结果当做临时表t,让t表和salgrade s表连接selectt.*,s.gradefrom(select deptno,avg(sal) as avgsal from emp group by deptno) astjoinsalgrade sont.avfsalbetween s.losal and s.hisal;//这个条件意思是在字段之间(最低薪资和最高薪资之间

select后面嵌套

找出每个员工所在的部门名称,要求显示员工名 和部门名selecte.ename,

(select d.dname from dept d where e.deptno=d.deptno) asdnamefromemp e;

十一:union(可以将查询结果集相加,一般应用于两张不相干的表拼接在一起)

案例:找出工作岗位是salesman和manager的员工

第一种:select ename,job from emp where job='manager' or job='salesman';

第二种:select ename,job from emp where job in('manager' ,'salesman');

第三种:union

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

union

select ename,job from emp where job='salesman';

十二:limit(重点中的重点,分页查询就是它)

特点:

lmit是mysql特有的

limit 取结果集中的部分数据,这是他的作用

语法机制:

limit startIndex,length

startIndex表示起始位置,从0开始,0表示第一条数据

length表示取几个

案例:去除工资排名前五的员工

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

select所有环节

select...from...where...group by...having...order by...

limit

...

十三:通用的标准分页sql(百度搜索每页显示10条记录)

每页显示3条记录:

第一页:0,3

第二页:3,3

第三页:6,3

第四页:9,3

第五页:12,3

每页显示pageSize(每页显示多少记录)条记录:

第pageNo页:(pageNo-1)*pageSize,pageSize

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
create table sailors( sid char(10) primary key, sname char(20), rating int, age int); create table boats( bid char(10) primary key, bname char(20), color char(10)); create table reserves( sid char(10) , bid char(10) , rdate date, primary key(sid,bid,rdate), foreign key (sid) references sailors(sid) on delete cascade, foreign key (bid) references boats(bid) on delete cascade); insert into sailors(sid,sname,rating,age) values("22","dustin",7,45) ("29","brustus",1,33), ("31","lubber",8,56), ("32","andy",8,26), ("58","rusty",10,35), ("64","horatio",7,35), ("71","zorba",10,35), ("74","horatio",9,35), ("85","art",3,26), ("86","john",1,17), ("95","bob",3,64), ("96","frodo",3,26), ("98","tom",3,17); insert into boats(bid,bname,color) values("101","A","red"), ("102","B","green"), ("103","C","blue"), ("104","D","white") ("105","E","red"), ("106","F","blue"), ("107","G","green"); insert into reserves(sid,bid,rdata) values("22","101","2010-01-08"), ("22","102","2010-01-09"), ("29","103","2010-01-09"), ("31","102","2010-02-11"), ("22","104","2010-03-08"), ("22","103","2010-03-10"), ("32","105","2010-03-11"), ("32","106","2010-03-18"), ("32","102","2010-03-19"), ("58","104","2010-03-20"), ("64","105","2010-03-20"), ("95","101","2010-04-02"), ("85","102","2010-04-05"), ("22","101","2010-04-07"), ("22","105","2010-05-01"), ("22","106","2010-06-18"), ("22","107","2010-07-09"), ("31","106","2010-08-06"), ("32","105","2010-08-06"), ("29","104","2010-08-07"), ("64","103","2010-09-05"), ("58","102","2010-09-09"), ("64","104","2010-11-03"), ("64","105","2010-11-04"), ("31","106","2010-12-0

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值