MYSQL-SQL-03-DQL(Data Query Language,数据查询语言)(单表查询)

DQL(数据查询语言)

  1. DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。
    • 查询关键字: SELECT
  2. 在一个正常的业务系统中,查询操作的频次是要远高于增删改的,当我们去访问企业官网、电商网站,在这些网站中我们所看到的数据,实际都是需要从数据库中查询并展示的。而且在查询的过程中,可能还会涉及到条件、排序、分页等操作。
  3. 数据准备:
CREATE TABLE emp(id INT COMMENT '编号',workno VARCHAR(10) COMMENT '工号',NAME VARCHAR(10) COMMENT '姓名',gender CHAR(1) COMMENT '性别',age TINYINT UNSIGNED COMMENT '年龄',idcard CHAR(18) COMMENT '身份证号',workaddress VARCHAR(50) COMMENT '工作地址',entrydate DATE COMMENT '入职时间')COMMENT '员工表';
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (1, '00001', '柳岩666', '女', 20, '123456789012345678', '北京', '2000-01-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (2, '00002', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (3, '00003', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (4, '00004', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (5, '00005', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (6, '00006', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (7, '00007', '范瑶', '男', 40, '123456789212345670', '北京', '2005-05-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (8, '00008', '黛绮丝', '女', 38, '123456157123645670', '天津', '2015-05-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (9, '00009', '范凉凉', '女', 45, '123156789012345678', '北京', '2010-04-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (10, '00010', '陈友谅', '男', 53, '123456789012345670', '上海', '2011-01-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (11, '00011', '张士诚', '男', 55, '123567897123465670', '江苏', '2015-05-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (12, '00012', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (13, '00013', '张三丰', '男', 88, '123656789012345678', '江苏', '2020-11-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (14, '00014', '灭绝', '女', 65, '123456719012345670', '西安', '2019-05-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate) VALUES (15, '00015', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-01');
INSERT INTO emp (id, workno, NAME, gender, age, idcard, workaddress, entrydate)  VALUES (16, '00016', '周芷若', '女', 18, NULL, '北京', '2012-06-01');

一、基本语法

SELECT字段列表
FROM表名列表
WHERE条件列表
GROUP  BY分组字段列表
HAVING分组后条件列表
ORDER BY排序字段列表
LIMIT分页参数

1、基础查询(不带任何条件)—查询多个字段

-- 查询指定字段SELECT  字段1, 字段2, 字段3 ...  FROM   表名 ;-- 查询所有字段SELECT  *  FROM   表名 ;

注意 : * 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)

--  查询emp表的id字段
select id from emp;

在这里插入图片描述

--  查询emp表的所有字段
select * from emp;

在这里插入图片描述

2、基础查询(不带任何条件)—设置字段别名

-- 设置别名可以使用as关键字也可以省略as
SELECT   字段1  [ AS  别名1 ] , 字段2  [ AS  别名2 ]   ...  FROM   表名; -- 省略asSELECT   字段1  [ 别名1 ] , 字段2  [ 别名2 ]   ...  FROM   表名;

as可以省略

select id as eid from emp;-- 这个和上面的作用一样的,省略了as
select id eid from emp;

在这里插入图片描述

3、基础查询(不带任何条件)—去除重复记录

  • DISTINCT关键字:用于从查询结果中删除重复的行,确保返回的每一行都是唯一的。它通常用于 SELECT 语句中,以获取不同(唯一)的记录集合
    • DISTINCT 可以单列使用
    • DISTINCT 也可以与多个列一起使用,以返回基于这些列组合的唯一行
 SELECT  DISTINCT 字段列表  FROM   表名;
  • distinct单列
-- 查询公司员工的上班地址有哪些(不要重复),'工作地址'是别名
select distinct workaddress '工作地址' from emp;

在这里插入图片描述

  • distinct多列
-- 查询公司男员工的上班地址有哪些(不要重复),'工作地址'是别名
select distinct gender '性别', workaddress '工作地址' from emp;

在这里插入图片描述

  • DISTINCT 是一个有用的关键字,用于从查询结果中去除重复的行。然而,它可能会增加查询的复杂性,并可能影响性能,因此在使用时需要谨慎

4、条件查询

  1. 语法:
SELECT  字段列表  FROM   表名   WHERE   条件列表 ;

4.1、常用的比较运算符

在这里插入图片描述

  • 判断字段是不是null的时候,就可以使用is null或者是is not null来进行条件判断,而不是用=null或!=null。
-- 查询身份证号码为null的数据
select * from emp where idcard is null;
  • = 运算符不能用于检查 NULL 值,因为 NULL 表示未知,而未知与任何值(包括它自己)都不相等。因此,column = NULL 总是返回 FALSE。

  • 同样地,<> 运算符也不能用于检查 NULL 值,因为 NULL 不等于任何值,包括它自己。因此,column <> NULL 也总是返回 FALSE。

  • is null和 is not null的影响——索引和性能:

    • 在某些情况下,使用 IS NULL 或 IS NOT NULL 条件可能会影响查询性能,特别是当涉及到大表或索引时。因此,在设计数据库和编写查询时,应考虑到这一点。
      • 默认值:在创建表时,可以为列指定默认值。如果未为列提供值,则MySQL将使用默认值(如果已指定)。如果未指定默认值且列允许 NULL,则MySQL将插入 NULL 值。

4.2、常用的的逻辑运算符

在这里插入图片描述

--  查询没有身份证号的员工信息select * from emp where idcard is null;-- 查询有身份证号的员工信息
select * from emp where idcard is not null;-- 查询年龄不等于 28 的员工信息select * from emp where age != 28;select * from emp where age <> 28;-- 查询年龄在15岁(包含) 到 20岁(包含)之间的员工信息
select * from emp where age >= 15 && age <= 20;select * from emp where age >= 15 and age <= 20;select * from emp where age between 15 and 20;-- 查询年龄等于18 或 20 或 40 的员工信息select * from emp where age = 18 or age = 20 or age =40;select * from emp where age in(18,20,40);-- 查询姓名为两个字的员工信息(_表示一个占位符,%表示匹配任意个字符)
select * from emp where name like '__';-- 查询身份证号最后一位是X的员工信息(%表示前面可以有n个字符)select * from emp where idcard like '%X';

5、聚合函数

  1. 聚合函数:将一列数据作为一个整体,进行纵向计算 。
    在这里插入图片描述
SELECT  聚合函数(字段列表)  FROM   表名 ;

注意 : NULL值是不参与所有聚合函数运算的。

-- 统计的是总记录数(常用)
select count(*) from emp; -- 统计的是idcard字段不为null的记录数
select count(idcard) from emp; -- 统计该企业员工的平均年龄
select avg(age) from emp;-- 统计该企业员工的最大年龄
select max(age) from emp;--  统计该企业员工的最小年龄select min(age) from emp;--  统计西安地区员工的年龄之和select sum(age) from emp where workaddress = '西安';

6、分组查询

 SELECT  字段列表  FROM   表名  [ WHERE   条件 ]  GROUP   BY  分组字段名  [ HAVING  分组后过滤条件 ];
  1. where与having区别:
    • 执行时机不同where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
    • 判断条件不同where不能对聚合函数进行判断,而having可以。
  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
  • 执行顺序: where > 聚合函数 > having 。
  • 支持多字段分组, 具体语法为 : group by columnA,columnB,…
-- 根据性别分组 , 统计男性员工 和 女性员工的数量
select gender, count(*) from emp group by gender ;

在这里插入图片描述


-- 查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址
select workaddress, count(*) address_count from emp where age < 45 group by 
workaddress having address_count >= 3;

在这里插入图片描述

7、排序查询

  1. 排序在日常开发中是非常常见的一个操作,有升序排序(ASC,默认升序),也有降序排序(DESC)。
  2. 语法:
SELECT  字段列表  FROM   表名  ORDER  BY  字段1  排序方式1 , 字段2  排序方式2 ;
  1. 排序方式:

    • ASC(ascend) : 升序(默认值)
    • DESC(descend): 降序
  2. 注意事项:

    • 如果是升序, 可以不指定排序方式ASC ;
    • 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
-- 根据年龄对公司的员工进行升序排序select * from emp order by age asc;select * from emp order by age;-- 根据入职时间, 对员工进行降序排序
select * from emp order by entrydate desc;-- 根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序select * from emp order by age asc , entrydate desc;

8、分页查询

  1. 分页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台都需要借助于数据库的分页操作。
  2. 语法:
SELECT  字段列表  FROM   表名  LIMIT  起始索引, 查询记录数 ;
  1. 注意事项:
    • 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
    • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
    • 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
-- 查询第1页员工数据, 每页展示10条记录select * from emp limit 0,10;select * from emp limit 10; -- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10-- 查询第2页员工数据, 每页展示10条记录 --------> (页码-1)*页展示记录数select * from emp limit 10,10;

9、DQL语句在执行时的执行顺序

在这里插入图片描述

  • 1、证明from比where和select先执行
select e.age from emp e where e.id = 1; -- 这里使用表的别名可以说明是from先执行的,而where和select是后执行的,因为如果from不限执行,表别名e就无法使用了
  • 2、证明where比select先执行
select e.age a from emp e where e.id = 1 and a = 1; 

在这里插入图片描述

  • 3、证明select比order by 先执行
    在这里插入图片描述

  • 4、因为group by是对where条件过滤后的数据进行分组,而select是从分组的数据中选择需要的列,所以group by先执行

  • 5、limit是对最后的结果限制返回的行数,所以limit是最后执行的。

  • 总结select的执行顺序为

    • 执行第一:FROM:首先确定数据源,即表或视图。
    • 执行第二:WHERE:对数据源进行过滤,只保留符合条件的行。
    • 执行第三:GROUP BY:对过滤后的数据进行分组。
    • 执行第四:HAVING:对分组后的数据进行进一步过滤(如果有 HAVING 子句)。
    • 执行第五:SELECT:选择需要返回的列,并计算表达式(包括聚合函数)。
    • 执行第六:ORDER BY:对结果进行排序(如果有 ORDER BY 子句)。
    • 执行第七:LIMIT:限制返回的行数(如果有 LIMIT 子句)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460454.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从理解路由到实现一套Router(路由)

小伙伴们大家好啊&#xff0c;我是李牌牌。平时在Vue项目中经常用到路由&#xff0c;但是也仅仅处于会用的层面&#xff0c;很多基础知识并不是真正的理解。于是牌牌呢查阅了很多资料&#xff0c;总结下路由相关的知识&#xff0c;查缺不漏&#xff0c;加深自己对路由的理解。 …

MFC图形函数学习04——画矩形函数

MFC中绘制矩形函数是MFC的基本绘图函数&#xff0c;它的大小和位置由左上角和右下角的坐标决定&#xff1b;若想绘制的矩形边框线型、线宽、颜色以及填充颜色都还需要其它函数的配合。 一、绘制矩形函数 原型&#xff1a;BOOL Rectangle(int x1,int y1,int x2,int y2); …

Kafka 与传统 MQ 消息系统之间有三个关键区别?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka 与传统 MQ 消息系统之间有三个关键区别&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Kafka 与传统 MQ 消息系统之间有三个关键区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 …

TLKS-PMG-100BM这款输电线路智能多目视频监控装置,它具体有哪些亮点和优势?

TLKS-PMG-100BM输电线路智能多目视频监控装置&#xff08;输电线路全景视频监控装置、输电线路云台变焦视频监控装置&#xff09;无疑是一款功能全面、性能卓越的输电线路智能监控装置。它配备了水平360、垂直90旋转的全向云台摄像头&#xff0c;能够轻松实现全景视野监视&…

Java中的运算符【与C语言的区别】

目录 1. 算术运算符 1.0 赋值运算符&#xff1a; 1.1 四则运算符&#xff1a; - * / % 【取余与C有点不同】 1.2 增量运算符&#xff1a; - * / % * 【右侧运算结果会自动转换类型】 1.3 自增、自减&#xff1a;、-- 2. 关系运算符 3. 逻辑运算符 3.1 短路求值 3.2 【…

目标检测:YOLOv11(Ultralytics)环境配置,适合0基础纯小白,超详细

目录 1.前言 2. 查看电脑状况 3. 安装所需软件 3.1 Anaconda3安装 3.2 Pycharm安装 4. 安装环境 4.1 安装cuda及cudnn 4.1.1 下载及安装cuda 4.1.2 cudnn安装 4.2 创建虚拟环境 4.3 安装GPU版本 4.3.1 安装pytorch&#xff08;GPU版&#xff09; 4.3.2 安装ultral…

HT7178 带输出关断的20V,14A全集成同步升压转换器

1、特点 输入电压范围VpIN:2.7V-20V 输出电压范围VouT:4.5V-20V 可编程峰值电流:14A 高转换效率: 95%(VPIN7.2V, VoUT 16V, IouT3A) 94%(VPIN12V,VoUT18V,IoUT4A) 90%(VPIN3.3, VoUT-9V,IOUT3A) 轻载条件下两种调制方式:脉频调制(PFM)和 强制脉宽调试(PWM) 集成输出关断的栅极…

使用axios请求分页

npm install axios <template><div><el-table :data"items" style"width: 100%"><el-table-column prop"id" label"ID" /><el-table-column prop"name" label"名称" /><!-- 添…

基于SpringBoot的在线医疗问答平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

codeforces _ 补题

C. Ball in Berland 传送门&#xff1a;Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a;容斥原理 考虑 第 i 对情侣组合 &#xff0c;男生为 a &#xff0c;女生为 b &#xff0c;那么考虑与之匹配的情侣 必须没有 a | b &#xff0c;一共有 k 对情侣&#x…

【Canvas与图标】长方形牛皮纸文件袋图标

【成图】 120*120的图标 大图 小图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>长方文件袋图标</title>…

奔走相告! ClickHouse 全新构建了强大的 JSON 数据类型

本文字数&#xff1a;8969&#xff1b;估计阅读时间&#xff1a;23 分钟 作者&#xff1a;Pavel Kruglov 本文在公众号【ClickHouseInc】首发 简介 JSON 已成为现代数据系统中处理半结构化和非结构化数据的首选格式。无论是在日志记录和可观测性 (observability) 应用场景、实…

统信UOS下启动图形界面应用工具manager报错:No protocol specified的解决办法

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、问题情况 达梦提供了丰富的图形界面工具&#xff0c;包括&#xff1a;manager、monitor、dbca等&#xff0c;但在统信操作系统进入终端去启动manager时报错&#xff1a;No protocol specified。 咨询了达…

【CSS3】css开篇基础(6)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

【设计模式系列】迭代器模式(七)

一、什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供一种方法来顺序访问一个聚合对象中的各个元素&#xff0c;而不暴露其内部的表示。迭代器模式将集合的遍历过程封装在一个独立的迭代器对象中&#xff0c;这样…

Linux线程安全(二)条件变量实现线程同步

目录 条件变量 条件变量初始化和唤醒 键盘触发条件变量唤醒线程demo 条件变量的等待 条件变量定时等待demo 条线变量实现多线程间的同步 条件变量 条件变量是为了控制多个线程的同步工作而设计的 比如说一个系统中有多个线程的存在但有且仅有一个线程在工作&#xff0c…

数据结构---顺序表

文章目录 线性表顺序表的使用及其内部方法ArrayList 的扩容机制顺序表的几种遍历方式顺序表的优缺点顺序表的模拟实现杨辉三角扑克牌算法 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&a…

大模型,多模态大模型面试【LoRA,分类,动静态数据类型,DDPM,ControlNet,IP-Adapter, Stable Diffusion】

大模型&#xff0c;多模态大模型面试【LoRA&#xff0c;分类&#xff0c;动静态数据类型&#xff0c;DDPM&#xff0c;ControlNet&#xff0c;IP-Adapter, Stable Diffusion】 问题一&#xff1a;LoRA是用在节省资源的场景下&#xff0c;那么LoRA具体是节省了内存带宽还是显存呢…

【力扣刷题实战】相同的树

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a; 相同的树 题目描述 示例 1&#xff1a; 示例 2&#xff1a; 示例 3&#xff1a; 解题思路 题目理解 算法选择 具体思路 解题要点 完整代码&#xff08;C语言&#xff09; 兄弟们共勉 &#…

2024年AI绘画与写作工具排行榜:提升创作效率必备利器推荐

2024年&#xff0c;AI绘画和写作工具迎来全新突破&#xff0c;从艺术创作到内容写作&#xff0c;越来越多的创作者开始依赖AI工具来提升效率、拓展创意。而随着市场上AI工具的增多&#xff0c;如何选择适合的工具变得尤为重要。今天为大家推荐一些提升创作效率的AI绘画和写作利…