SQL中的DQL(数据查询)语言

2023-11-17

SQL语句分类

通常分为五类:

DDL(数据定义语言):create、alter、drop等
DQL(数据查询语言):select等
DML(数据操纵语言):insert、delete、update等
TCL(事务操纵语言):commit、rollback等
DCL(数据控制语言):grant、revoke等

本篇文章重点讲述DQL(数据查询语言的语法格式),如有错误请指正~

DQL(数据查询语言)

数据查询语言需要重点掌握!!!

  • 格式:select 字段信息 from 表名;
  • 举例:
    • select name from person;
    • select name,age from person;
    • select * from person;
    • select * from person where age=50;
    • select age from person where name=’悟空’;

条件查询(where)

1、查询员工表中所有不同的工作

select distinct job from emp;

2、查询员工表中出现了哪几个不同的部门id?

select distinct dept_id from emp;

3、查询有领导的员工姓名和领导id

select name,manager from emp where manager is not null;

4、查询没有领导的员工姓名;

select name from emp where manager is null;

多条件查询 (and 和 or)

1、查询1号部门工资高于2000的员工信息

select * from emp where dept_id=1 and sal>2000;

2、查询3号部门或工资等于5000的员工信息

select * from emp where dept_id=3 or sal=5000;

3、查询出孙悟空和猪八戒的员工信息

select * from emp where name=”孙悟空” or name=”猪八戒”;

between x and y 两者之间

1、查询工资在2000到3000之间的员工信息

select * from emp where sal=>2000 and sal<= 3000;

select * from emp where sal between 2000 and 3000;

select * from emp where sal not between 2000 and 3000;

in 关键字

1、查询工资等于5000,1500,3000的员工信息

select * from emp where sal in(5000,1500,3000);

select * from emp where sal=5000 or sal=1500 or sal=3000;

select * from emp where sal not in(5000,1500,3000);

模糊查询like

  • %:代表0或多个未知字符
  • _:代表1个未知字符
  • 举例:
    • 以x开头 x%
    • 以x结尾 %x
    • 包含 %x%
    • 第二个字符是x _x%
    • 以x开头以y结尾 x%y
    • 第二个是x,倒数第三个是y x%y _

1、查询名字姓孙的员工信息

select * from emp where name like “孙%”;

2、查询名字以精结尾的员工姓名

select name from emp where name like “%精”;

3、查询工作第二个字是售的员工姓名和工作

select name,job from emp where job like “_售”;

4、查询名字中包含僧并且工资大于2000的员工姓名和工资

select name,sal from emp where name like “%僧%” and sal > 2000;

比较运算符 >< ≥ ≤ = ≠ 和<>

1、查询工资大于等于3000的员工信息

select * from emp where sal>=3000;

2、查询工作不是程序员的员工信息(两种写法)

select * from emp where job!=”程序员”;

排序查询order by

  • 格式:order by 字段名 asc(升序,默认Ascending)/desc(降序Descending)

    1、查询所有员工姓名和工资,并按照工资升序排序

    select name,sal from emp order by sal;

    select name,sal from emp order by sal asc;

    2、查询所有员工姓名和工资,并按照工资降序排序

    select name,sal from emp order by sal desc;

    3、查询所有员工姓名,工资和部门id并且按照部门id升序排序,如果部门id一致则按照工资降序排序

    select name,sal,dept_id from emp order by dept_id,sal desc;

分页查询

  • 格式:limit 跳过的条数,请求的条数(每页的条数)

  • 跳过的条数=(请求的页数-1)*请求的条数(每页条数)

  • 举例:

    • 查询1-5条数据 limit 0,5 第一页
    • 查询6-10条数据 limit 5,5 第二页
    • 请求第一页的10条数据 limit 0,10
    • 请求第三页的10条数据 limit 20,10
    • 请求第八页的10条数据 limit 70,10
    • 请求第六页的8条数据 limit 40,8

    1、查询工资最低的3个员工信息(排序和分页结合一起)

    select * from emp order by sal limit 0,3;

    2、按照入职日期(hiredate)升序排序 查询第三页的3条数据

    select * from emp order by hiredate limit 6,3;

    3、查询工资最高的员工信息

    select * from emp order by sal desc limit 1;

    4、查询按照工资降序第二页的5条数据

    select * from emp order by sal desc limit 5,5;

查询的别名

select name as “姓名” from emp;

select name “姓名” from emp;

select name 姓名 from emp;

聚合函数

  • 通过聚合函数可以对查询的多条数据进行统计查询,统计查询的方式包括:求平均值, 求最大值,求最小值,求和,计数

1、平均值avg(字段名)

  • 查询1号部门的平均工资

    select avg(sal) from emp where dept_id=1;

  • 查询销售的平均工资

    select avg(sal) from emp where job=”销售”;

2、最大值max(字段名) 最小值min(字段名)

  • 查询程序员的最高工资

    select max(sal) from emp where job = “程序员”;

  • 查询3号部门的最低工资

    select min(sal) from emp where dept_id = 3;

3、求和sum(字段名)

  • 查询2号部门的工资总和

    select sum(sal) from emp where dept_id = 2;

5、计数count(*或字段名) null不能统计

  • 查询程序员的数量

    select count(*) from emp where job = “程序员”;

数值计算(+ - * / %)

1、查询每个员工的姓名,工资和年终奖(年终奖=5个月工资)

select name,sal,sal * 5 as 年终奖 from emp;

2、给3号部门的员工每人涨薪5块钱

update emp set sal= sal + 5 where dept_id = 3;

分组查询Group by

  • 格式:group by 分组的字段名

  • 举例:

    1、查询每个部门的平均工资

    select dept_id,avg(sal) from emp group by dept_id;

    2、查询每个部门的最高工资

    select dept_id,max(sal) from emp group by dept_id;

    3、查询每种工作的最高工资

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

    4、查询每种工作的人数

    select job,count(*) from emp group by job;

    5、查询每个部门工资高于2000的人数

    select dept_id,count(*) from emp where sal > 2000 group by dept_id;

    6、查询每个部门有领导的员工的人数

    select dept_id,count(*) from emp where manager is not null group by dept_id;

having关键字

  • where 后面只能写普通字段的条件,不能包含聚合函数

  • having后面可以包含聚合函数的条件,且having需要和group by 结合使用,写在group by的后面

  • 举例:

    1、查询每个部门的平均工资,要求平均工资高于2000

    select dept_id,avg(sal) from emp group by dept_id having avg(sal) > 2000;

    2、查询每种工作的人数,只查询人数大于1的

    select job,count() from emp group by job having count() > 1;

    select job,count(*) from emp group by job having c > 1;

    3、查询每个部门的工资总和,只查询有领导的员工,并且要求工资总和大于5400;

    select dept_id,sum(sal) from emp where manager is not null group by dept_id having sum(sal) > 5400;

    4、查询每个部门的平均工资,只查询工资在1000到3000之间的,并且过滤掉平均工资低于2000的

    select dept_id,avg(sal) from emp where sal between 1000 and 3000 group by dept_id having avg(sal) >= 2000;

各个关键字的书写顺序

select 查询的字段信息 from 表名 where 普通字段条件 group by 分组字段名 having 聚合函数条件 order by 排序字段名 limit 跳过条数,请求条数

子查询(嵌套查询)

\qquad 1. 查询工资大于2号部门平均工资的员工信息

\qquad select * from emp where sal > (select avg(sal) from emp where dept_id = 2);

\qquad 2. 查询工资高于程序员最高工资的员工信息

\qquad select * from emp where sal > (select avg(sal) from emp where job = “程序员”);

\qquad 3. 查询工资最高的员工信息

\qquad select * from emp where sal = (select max(sal) from emp);

\qquad 4. 查询和孙悟空相同工作的员工信息

\qquad select job from emp where name=“孙悟空”;

\qquad select * from emp where job=(select job from emp where name=“孙悟空”) and name!=”孙悟空";

\qquad 5. 查询拿最低工资员工的同事们的信息(同事指同一部门)

\qquad select * from emp where dept_id = (select dept_id from emp \qquad where sal = (select min(sal) from emp)) and name != (select \qquad name from emp where sal = (select min(sal) from emp));

关联关系

  • 指创建的表和表之间存在的业务关系

  • 有哪几种关系

    • 一对一:有AB两张表,A表中的一条数据对应B表中的一条数据,B表中的一条数据也对应A表中的一条数据

    • 一对多:有AB两张表,A表中的一条数据对应B表中的多条数据, 同时B表中的一条数据对应A表中的一条数据

    • 多对多:有AB两张表,A表中的一条数据对应B表中的多条数据, 同时B表中的一条数据也对应A表中的多条数据

  • 表和表之间如何建立关系(通过外键字段建立关系,注意:外键不能添加多个值)

    • 一对一:在任意表中添加一个建立关系的字段指向另外一张表的主键
    • 一对多:在多的表中添加建立关系的字段(外键)指向另外一张表的主键
    • 多对多:需要建立单独的关系表,里面至少包含两个字段,分别指向另外两个表的主键

关联查询

  • 同时查询多张表数据的查询方式称为关联查询

  • 关联查询包含:等值连接,内连接和外连接

    关联查询之等值连接:

    • 格式:select * from A,B where 关联关系
    • 举例:
    1. 查询工资高于2000的员工的姓名和对应的部门名

      select e.name,d.name from emp e,dept d where e.dept_id = d.id and e.sal > 2000;

    关联查询之内连接

    • 格式:select * from A join B on 关联关系
    • 举例:
    1. 查询每个员工的姓名和对应的部门名

      select e.name,d.name,sal from emp e join dept d on e.dept_id=d.id;

    关联查询之外连接

    • 等值连接和内连接查询到的都是两张表的交集数据
    • 外连接查询的是一张表的全部和另外一张表的交集
    • 格式:select * from A left/right join B on 关联关系;left和right选一个,表示左边或右边的表为全部
    • 举例:
    1. 查询所有员工姓名和对应的部门名

      insert into emp(name,sal) values(“灭霸”,5);

      select e.name,d.name from emp e left join dept d on e.dept_id = d.id;

    2. 查询所有部门的名称,地点和对应的员工姓名和工资

      select d.name,d.loc,e.name,e.sal from dept d left join emp e on d.id=e.dept_id;

    关联查询总结

    1. 如果需要同时查询多张表的数据使用关联查询
    2. 关联查询包括:等值连接,内连接和外连接
    3. 等值连接和内连接查询的是两个表的交集数据,推荐使用内连接
    4. 如果需要查询一张表的全部和另外一张表的交集时,使用外连接,只需要掌握左外即可,因为表的位置可以交换

    如何查询多对多的数据(多张表连接)

    • 创建表:

      create table student(id int primary key auto_increment, name varchar(50))charset=utf8;

      create table teacher(id int primary key auto_increment, name varchar(50))charset=utf8;

      create table t_s(tid int, sid int);

    • 插入数据

      insert into teacher values(null,”苍老师”),(null,”传奇哥”);

      insert into student values(null,”小明”),(null,”小红”),(null,”小绿”),(null,”小狗”),(null,”小黄”);

      insert into t_s values(1,1),(1,5),(1,4),(2,2),(2,3),(2,1),(2,5);

    1. 查询每个老师对应的学生

      select t.name,s.name from teacher t join t_s ts on t.id=ts.tid join student s on s.id=ts.sid;

    2. 查询苍老师的学生都有谁

      select t.name,s.name from teacher t join t_s ts on t.id=ts.tid join student s on s.id=ts.sid where t.name= “苍老师”;

    3. 查询小明的老师是谁

      select t.name,s.name from teacher t join t_s ts on t.id=ts.tid join student s on s.id=ts.sid where s.name= “小明”;

总结:
DQL作为程序员最需要掌握的一类语言,其变化繁多,需要多敲多练。尤其需要注意的是:DQL语言中的所有语句都不会对数据本身进行修改!!!

这是来自新手程序员的亿点点总结,正在努力搭建自己的知识体系,若文章有误,请多多指正,万分感谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL中的DQL(数据查询)语言 的相关文章

  • 自动删除主键序列中的间隙

    我正在创建一个网页 该网页根据用户操作将数据存储到 MySQL 数据库中 数据库有很多行 行的主键是列 rowID 它只是按顺序对行进行编号 例如 1 2 3 4 用户可以选择删除行 问题是当用户删除最后一行以外的行时 rowID 中有一个
  • 计算 mysql 数据库行数的最佳方法

    在遇到 mysql 查询加载时间慢的问题后 我现在正在寻找计算行数的最佳方法 我曾经愚蠢地使用过mysql num rows 函数来做到这一点 现在意识到这是最糟糕的方法 我实际上正在制作一个分页来用 PHP 制作页面 我找到了几种计算行数
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • SQL Server 2008 错误 233

    我正在使用以下 sql 脚本在 SQL Server 2008 中创建新登录名 CREATE LOGIN xyz WITH PASSWORD xyz DEFAULT DATABASE master DEFAULT LANGUAGE us e
  • “pdo_mysql”已禁用,我无法启用它。我在 iMac 7.1 OSX 10.6.8 上安装了 MAMP v. 3.0.4

    pdo mysql 已禁用 我无法启用它 我在 iMac 7 1 OSX 10 6 8 上安装了 MAMP v 3 0 4 在我的 phpinfo 页面上 我可以看到唯一启用的 PDO 是 sqlite 如果我查看 php 5 5 10 扩
  • 以编程方式插入行(父行和子行)

    我正在使用 Spring 和 JDBCTemplate 该场景是 CUSTOMER 表和 ORDERS 表的父子关系 我想做一个插入 例如 1 个客户和 5 个订单 但我不确定如何以编程方式在 CUSTOMER 表中插入一行 如何获取 Or
  • 需要 SQL 查询澄清[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个由以下列组成的表 billid patientid doctorid fees 如何显示治疗多名患者的医生 尝试了以下代码并得到了
  • 在一个后台为MYSQL的网站上集成搜索

    我有一个位置搜索website http www jammulinks com对于一个城市 我们首先收集该城市所有可能类别的数据 如学校 学院 百货商店等 并将其信息存储在单独的表中 因为每个条目除了名称 地址和电话号码外都有不同的详细信息
  • PHP使用auto_increment生成短唯一ID?

    我想生成一个简短的 唯一的 ID 而不必检查冲突 我目前正在做类似的事情 但是我当前生成的 ID 是随机的 并且在循环中检查冲突很烦人 并且如果记录数量显着增加 将会变得昂贵 通常担心冲突不是问题 但我想要生成的唯一 ID 是一个由 5 8
  • MySQL Python 关于重复键更新值

    我正在研究使用 python 将 JSON 数据上传到 MySQL 我需要在插入语句中包含 ON DUPLICATE KEY UPDATE VALUES 但在 Python 中遇到了问题 如果我运行以下代码 一切正常 import json
  • 获取在任何日期创建的表的列表?

    我遇到了这样的情况 我想查找我在 2012 年 9 月 14 日 2012 年 9 月 14 日 在 sql server 上创建的表 是否有任何查询会列出在此日期创建的这些表 SELECT FROM sys tables WHERE cr
  • 猪的组连接等效吗?

    试图在 Pig 上完成这个任务 寻找 MySQL 的 group concat 等效项 例如 在我的表中 我有以下内容 3fields userid clickcount pagenumber 155 2 12 155 3 133 155
  • MySQL 数据库无法在 XAMPP for Mac 上启动

    突然我在 mac 上遇到了这个问题 我无法启动我的 MySQL 数据库 我只能启动 ProFTPD 和 Apache Web Server 这是应用程序日志 Starting all servers Starting MySQL Datab
  • 时间序列数据的自连接

    我需要一些帮助来完成我认为应该是相当简单的自连接查询 只需要将两条记录中匹配的开始时间和结束时间合并为一条记录 假设我的表中有以下内容 Time Event 08 00 Start 09 00 Stop 10 30 Start 10 45
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • Oracle:按月分区表

    我的解决方案 德语几个月 PARTITION BY LIST to char GEBURTSDATUM Month PARTITION p1 VALUES JANUAR PARTITION p2 VALUES Februar PARTITI
  • 在Oracle中使用IW和MM

    我使用 IW 表示每周结果 使用 MM 表示每月结果 但我总是收到错误 ORA 00979 not a GROUP BY expression 00979 00000 not a GROUP BY expression 我的疑问是这些 We

随机推荐