ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SQL(二)DQL查询总结

2022-05-07 16:33:04  阅读:227  来源: 互联网

标签:name money SQL 查询 表名 DQL where select


SQL(二)DQL查询总结

简单查询

  • 查询一个字段

    select 字段名 from 表名;
    
  • 查询多个字段

    selsct 字段1,字段2 from 表名;
    
  • 查询所有字段

    //法一(实际开发中不建议,效率低,可读性差)
    select * from 表名;
    //法二
    select 字段1,字段2,...... from 表名;
    
  • 起别名as(可省略)

    //查询两个字段,其中字段2显示为AAA
    select 字段1,字段2 as AAA from 表名;
    //省略as
    select 字段1,字段2 AAA from 表名;
    //别名是中文或含空格用""或''引起来,最好用''
    select 字段1,字段2 'A AA' from 表名;
    
  • 查询字段可以使用数学表达式

    //查询员工一年工资
    select money*12 from 表名;
    

条件查询

语法:

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

举例:

//查询员工工资为例
select id,name from 表名 where money=800;
select id,name from 表名 where money!=800;(select id,name from 表名 where money<>800;)
select id,name from 表名 where money<=800;
//使用between and 时必须左小右大(是闭区间)
select id,name from 表名 where money>=800 and money<=1000;(select id,name from 表名 where money between 800 and 1000;)
//判空用is null,不能用=null,null不是一个值
select id,name from 表名 where money is null;(is not null)
//查询名字叫二狗工资不超过800的员工
select id,name from 表名 where name='二狗' and money=800;
//查询工资800和工资1000的员工
select id,name from 表名 where money=800 or money=1000;
select id,name from 表名 where money in(800,1000);(not in)

and和or优先级

相当于C语言里&和||优先级,写条件时可以加括号

模糊查询

like

//查询名字中含有o的人
select name from 表名 where name like '%o%';
//查询名字以T结尾的人
select name from 表名 where name like '%T';
//查询名字以K开头的人
select name from 表名 where name like 'K%';
//查询名字第三个字母是A的人
select name from 表名 where name like '__A%';
//查询名字中有_的人,需要\转义
select name from 表名 where name like '%\_%';

排序

单个字段

//查询时按员工工资排序(默认升序)
select id,name from 表名 order by money;
//查询时按员工工资排序(指定升序)
select id,name from 表名 order by money asc;
//查询时按员工工资排序(指定降序)
select id,name from 表名 order by money desc;

多个字段

//查询时按工资升序排,工资相同时按名字字典序排
select id,name from 表名 order by money asc,name asc;
//按第二列排序,了解一下
select id,name from 表名 order by 2;

综合

顺序不能变
select
	id,name
from
	表名
where
	money between 800 and 1000
order by
	money asc;
//工资在800~1000的员工按工资升序排列
select id,name from 表名 where money between 800 and 1000 order by 2;

数据处理函数

单行处理函数

  • lower()转小写,upper()转大写

    select lower(name) from 表名;
    
  • substr()截取字符串,下标从1开始不是0

    //查询name从下标1开始截取1位
    select substr(name,1,1) from 表名;
    
  • concat()字符串拼接

    select concat(id,name) from 表名;
    
  • length()取字符串长度

    select length(name) from 表名;
    
  • trim()去除字符串空格

    select * from 表名 where name=trim('   xpx');
    
  • round()四舍五入

    select round(127.6598,0) from 表名;//128
    select round(127.6598,1) from 表名;//127.7
    select round(127.6598,2) from 表名;//127.66
    select round(127.6598,-1) from 表名;//130
    
  • rand()随机数

    select rand() from 表名;
    
  • ifnull()空处理函数,只要有null参与的数学运算,得到的结果都是null,2+null=null

    //当money为null,将null当作0处理
    select name,(money+ifnull(月补助,0))*12 from 表名;
    
  • case...when...then...when...then...else...end

    //当员工是Manager工资上调10%,是Salesman工资上调50%,其他人正常
    select
    	name,
    	job,
    	money as oldmoney,
    	(case job when 'Manager' then money*1.1 when 'Salesman' then money*1.5 else money end) as newmoney
    from
    	表名;
    

分组函数(多行处理函数)

  • count计数

    //统计name不为null的总行数
    select count(name) from 表名;
    //统计总行数
    select count(*) from 表名;
    
  • sum求和

    select sum(money) from 表名;
    
  • avg求平均

    select avg(money) from 表名;
    
  • max求最大

    select max(money) from 表名;
    
  • min求最小

    select min(money) from 表名;
    

注意:

分组函数自动忽略null,分组函数必须在分组后使用,以上默认整张表分为一组

错误例子(分组后才能用分组函数,下面执行where时还没执行group by):

select name from 表名 where money<max(money);

分组查询

语法执行顺序:

from
where
group by
having
select
order by
  • 按工作岗位job进行分组后求工资和

    //在MySql中可以执行但无意义,在Oracle中报错
    select name,job,sum(money) from 表名 group by job;
    //去掉无关字段
    select job,sum(money) from 表名 group by job;
    
  • 查询每个年龄,不同岗位最高工资

    //按多个字段分组
    select age,job,max(money) from 表名 group by age,job;
    
  • having筛选

    //查询每个岗位最高工资,显示最高工资大于3000的
    select job,max(money) from 表名 group by job having max(money)>3000;//效率低
    select job,max(money) from 表名 where money>3000 group by job;//效率高
    //优先选择where
    
  • distinct去重

    select distinct job from 表名;
    select distinct name,job from 表名;//name和job联合去重
    select count(distinct job) from 表名;//统计工作岗位数量
    

连接查询

内连接

举例:现有两张表,表1中有员工姓名(name)和岗位编号(jobid);表2中有岗位编号(jobid)和岗位名称(jobname)

  • 查询员工姓名和对应岗位名称(SQL92语法)

    //一
    select name,jobname from 表1,表2 where 表1.jobid=表2.jobid;
    //二(更好)
    select 表1.name,表2.jobname from 表1,表2 where 表1.jobid=表2.jobid;
    //三(起别名,很重要,效率)
    select A.name,B.jobname from 表1 A,表2 B where A.jobid=B.jobid;
    

内连接之等值连接:

  • 查询员工姓名和对应岗位名称

    //SQL92(表连接条件和筛选条件都在where里,比较杂)
    select A.name,B.jobname from 表1 A,表2 B where A.jobid=B.jobid;
    //SQL99(表连接和筛选条件分离,比较清晰)
    select A.name,B.jobname from 表1 A join 表2 B on A.jobid=B.jobid;
    
    //99语法更清晰(join前省略了inner)
    select
    	...
    from
    	...
    join
    	...
    on
    	...
    where
    	...
    

内连接之非等值连接:

  • 查询员工,工资,工资等级

    //表A有员工姓名name,工资money;
    //表B有工资等级grade,工资下限losal,工资上限hisal
    select A.name,A.money,B.grade from 表A A join 表B B on A.monry between B.losal and B.hisal;
    

内连接之自连接(一张表看成两张表):

image1


image2

外连接

右外连接(主要查右边的表,右边的表全输出):

  • 查询员工姓名,员工岗位,并且将不匹配的岗位表也全部输出
select A.name,B.jobname from 表1 A right join 表2 B on A.jobid=B.jobid;

左外连接:

同上,right换成left

全连接

同上,right换成full

多表连接

语法:

select
	...
from
	a
join
	b
on
	条件
join
	c
on
	条件
right join
	d
on
	条件;

查找员工名,薪资,工作名,薪资等级:

select 
	A.name,A.money,B.jobname,C.grade
from
	表1 A,
join
	表2 B,
on
	A.id=b.id
join
	表3 C
on
	A.money between C.min_money and C.max_money; 

子查询

语法:

//select的嵌套
select
	..(select)
from
	..(select)
where
	..(select)

查询比最低工资高的员工名和薪资:

select name,money from 表1 where money>(select min(money) from 表1);

查询按工资分组查询平均薪资的薪资等级:

select
	A.*,B.grade
from
	(select job,avg(money) average from 表1 group by jobname) A
join
	表2 B
on
	A.average between B.min_money and B.max_money;

注意:

子查询(嵌套查询)只能返回一条数据

Union合并查询

举例:

select name from 表1 where jobname='讲师' or jobname='教授';
//上面可以换做下面
select name from 表1 where jobname='讲师'
union
select name from 表1 where jobname='教授';
//union是相加,比笛卡尔积效率高

注意:

进行union时,两条查询的列数及数据类型应相同,只是列数相同也不行(mysql中不报错,oracle语法较为严格会报错)

limit

通常用在分页查询

按薪资降序排序,取出前五条记录:

select name,money from 表 order by money desc limit 5;

取出薪资排名3到5的员工:

select name,money from 表 order by money desc limit 2,3;

注意:

mysql中limit在order by后执行

limit 5:取前5

limit 0,5:从0开始取5条记录

limit分页查询

分页显示3条记录:

第一页:limit 0,3 [0,1,2]

第二页:limit 3,3 [3,4,5]

第三页:limit 6,3 [6,7,8]

第四页:limit 9,3 [9,10,11]

观察发现(页码-1)*3是起始下标

DQL总结

书写顺序:

select
from
where
group by
having
order by
limit

执行顺序:

from
where
group by
having
select
order by
limit

标签:name,money,SQL,查询,表名,DQL,where,select
来源: https://www.cnblogs.com/LoginX/p/Login_X39.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有