热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQL(二)DQL查询总结

SQL(二)DQL查询总结简单查询查询一个字段select字段名from表名;查询多个字段selsct字段1,字段2from表名;查询所有字段法一(实际开发中不建议,效率低,可读性

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

分组查询

语法执行顺序:

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


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
author-avatar
Hcl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有