《SQL与数据库基础》04. SQL-DQL
本文以 MySQL 为例
DQL
语法结构:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
基础查询
查询多个字段:
SELECT 字段1, 字段2, ......, 字段n FROM 表;
查询所有字段:
SELECT * FROM 表;
查询时显示为别名:
SELECT 字段1 [AS] '别名1', 字段2 [AS] '别名2', ......, 字段n [AS] '别名n' FROM 表;
查询结果去除重复记录:
SELECT DISTINCT 字段1, 字段2, ......, 字段n FROM 表;
示例:
CREATE TABLE student(
id INT,
name VARCHAR(20),
age INT
);
INSERT INTO student
VALUES (10001, '周杰轮', 31),
(10002, '王力鸿', 33),
(10003, '林俊节', 26),
(10004, '张学油', 26),
(10005, '刘德滑', 40),
(10006, '李白', 33),
(10007, '张无忌', 31),
(10008, '张三丰', 91),
(10009, '李逵', 40);
# 查询id和name两个列
SELECT id, name FROM student;
# 查询全部列
SELECT id, name, age FROM student;
# 查询全部列,快捷写法
SELECT * FROM student;
# 查询id和name两个列,年龄小于33岁
SELECT id, name FROM student WHERE age < 33;
# 查询全部列,id等于10003
SELECT id, name, age FROM student WHERE id = 10003;
# 查询name列,并设置别名显示为“姓名”
SELECT name AS '姓名' FROM student;
# 查询age列,且重复结果只显示一个
SELECT DISTINCT age FROM student;
条件查询
基础语法:
SELECT 字段列表 FROM 表 WHERE 条件列表;
条件:
==============================================================
比较运算符 | 功能
--------------------------------------------------------------
> | 大于
>= | 大于等于
< | 小于
<= | 小于等于
= | 等于
<> 或 != | 不等于
BETWEEN ... AND ... | 在某个范围之内(含最大、最小)
IN(...) | 在in之后列表中的值,满足一个即可
LIKE '占位符' | 模糊匹配(“_”匹配单个字符,“%”匹配任意个字符)
IS NULL | 值为null
==============================================================
==============================================================
逻辑运算符 | 功能
--------------------------------------------------------------
AND 或 && | 并且(多个条件同时成立)
OR 或 || | 或者(多个条件任意一个成立)
NOT 或 ! | 非
==============================================================
分组聚合
基础语法:
SELECT [字段] 聚合函数 FROM 表 [WHERE 条件判断] [GROUP BY 字段];
注意:
GROUP BY后面出现哪个字段,哪个字段才能出现在SELECT后的字段中
聚合函数
聚合函数:将一列数据作为一个整体,进行纵向计算。
语法:
SELECT 聚合函数 FROM 表;
聚合函数:
==============================================================
函数 | 功能
--------------------------------------------------------------
SUM(字段) | 求和
AVG(字段) | 求平均值
MIN(字段) | 求最小值
MAX(字段) | 求最大值
COUNT(字段 或 *) | 求数量
==============================================================
注:
null不参与任何聚合函数运算
分组查询
语法:
SELECT 字段 FROM 表 [WHERE 条件] GROUP BY 字段 [HAVING 分组后过滤条件];
where与having区别:
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;having是分组之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以。
示例:
DROP TABLE IF EXISTS student;
CREATE TABLE student(
id INT,
name VARCHAR(20),
age INT,
gender VARCHAR(10),
address VARCHAR(20)
);
INSERT INTO student
VALUES(10001, '周杰轮', 31, '男', '北京'),
(10002, '王力鸿', 33, '男', '上海'),
(10003, '林俊节', 26, '男', '成都'),
(10004, '蔡依琳', 27, '女', '北京'),
(10005, '林志灵', 30, '女', '贵阳'),
(10006, '张学油', 35, '男', '重庆'),
(10007, '刘德滑', 40, '男', '北京');
# 求age平均值
SELECT AVG(age) FROM student;
# 按gender字段分类并分别求age平均值(不显示gender)
SELECT AVG(age) FROM student GROUP BY gender;
# 按gender字段分类并分别求age平均值(显示gender)
SELECT gender, AVG(age) FROM student GROUP BY gender;
# 按gender字段分类并分别求age平均值与总和,id最大值与最小值
SELECT gender, AVG(age), SUM(age), MIN(id), MAX(id), COUNT(*) FROM student GROUP BY gender;
# 查询年龄大于30的员工,并根据地址分组
SELECT address, COUNT(*) FROM student WHERE age > 30 GROUP BY address;
# 查询年龄大于30的员工,根据地址分组,获取员工数量大于1的地址
SELECT address, COUNT(*) AS address_count FROM student WHERE age > 30 GROUP BY address HAVING address_count > 1;
结果排序
可以对查询的结果,使用ORDER BY关键字,指定某个列进行排序。
语法:
SELECT 字段列表 FROM 表 ORDER BY 字段1 [排序方式1], 字段2 [排序方式2], ......, 字段n [排序方式n];
排序方式:
ASC:升序(默认值)
DESC:降序
注:
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
示例:
DROP TABLE IF EXISTS student;
CREATE TABLE student(
id INT,
name VARCHAR(20),
age INT,
gender VARCHAR(10)
);
INSERT INTO student
VALUES(10001, '周杰轮', 31, '男'),
(10002, '王力鸿', 33, '男'),
(10003, '林俊节', 26, '男'),
(10004, '蔡依琳', 27, '女'),
(10005, '林志灵', 30, '女'),
(10006, '张学油', 26, '男'),
(10007, '李白', 26, '男'),
(10008, '哪吒', 33, '男'),
(10009, '刘德滑', 40, '男');
# 按age降序排序结果
SELECT * FROM student ORDER BY age DESC;
# 按id升序排序结果
SELECT * FROM student WHERE age > 31 ORDER BY id;
# 根据年龄进行降序排序,若年龄相同则根据id升序排序
SELECT * FROM student ORDER BY age DESC, id ASC;
# 根据年龄进行降序排序,若年龄相同则根据id降序排序
SELECT * FROM student ORDER BY age DESC, id DESC;
分页限制
语法:
SELECT 字段列表 FROM 表名 LIMIT [起始索引, ] 查询记录数;
注:
起始索引从0开始。
不同数据库有不同的分页查询实现,MySQL中是limit。
示例:
# 查询结果限制为2条
SELECT * FROM student LIMIT 2;
# 跳过前3条后查询2条
SELECT * FROM student LIMIT 3, 2;
# 跳过前3条后查询2条
SELECT * FROM student WHERE gender = '男' ORDER BY id LIMIT 3, 2;
总结
编写顺序:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
注:
语句执行顺序为:FROM -> WHERE -> ORDER BY -> HAVING -> SELECT -> ORDER BY -> LIMIT
示例:
DROP TABLE IF EXISTS emp;
# 创建员工表(employee)
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', '柳岩', '女', 20, '123456789012345678', '北京', '2000-01-01'),
(2, '00002', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01'),
(3, '00003', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-01'),
(4, '00004', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01'),
(5, '00005', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01'),
(6, '00006', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01'),
(7, '00007', '范瑶', '男', 40, '123456789212345670', '北京', '2005-05-01'),
(8, '00008', '黛绮丝', '女', 38, '123456157123645670', '天津', '2015-05-01'),
(9, '00009', '范凉凉', '女', 45, '123156789012345678', '北京', '2010-04-01'),
(10, '00010', '陈友谅', '男', 53, '123456789012345670', '上海', '2011-01-01'),
(11, '00011', '张士诚', '男', 55, '123567897123465670', '江苏', '2015-05-01'),
(12, '00012', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-01'),
(13, '00013', '张三丰', '男', 88, '123656789012345678', '江苏', '2020-11-01'),
(14, '00014', '灭绝', '女', 65, '123456719012345670', '西安', '2019-05-01'),
(15, '00015', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-01'),
(16, '00016', '周芷若', '女', 18, null, '北京', '2012-06-01');
# 查询年龄为20,21,22,23岁的员工信息
SELECT * FROM emp WHERE gender = '女' AND age IN(20,21,22,23);
# 查询性别为男,并且年龄在20-40岁(含)以内的姓名为三个字的员工
SELECT * FROM emp WHERE gender = '男' AND (age BETWEEN 20 AND 40) AND name LIKE '___';
# 统计员工表中,年龄小于60岁的,男性员工和女性员工的人数
SELECT gender, COUNT(*) FROM emp WHERE age < 60 GROUP BY gender;
# 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序
SELECT name, age FROM emp WHERE age <= 35 ORDER BY age ASC, entrydate DESC;
# 查询性别为男,且年龄在20-40岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序
SELECT * FROM emp WHERE gender = '男' AND (age BETWEEN 20 AND 40) ORDER BY age ASC, entrydate ASC LIMIT 5;
# 通过别名验证DQL语句的执行顺序
SELECT e.name ename, e.age eage FROM emp e WHERE e.age > 15 ORDER BY eage ASC;
《SQL与数据库基础》04. SQL-DQL的更多相关文章
- Sql Server数据库基础
--------------------------------------第一章 Sql Server数据库基础------------------------------------------ ...
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. . ...
- SQL Server 数据库基础笔记分享(下)
前言 本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作和约束,视图,存储过程,触发器的基本了解. 注:内容比较基础,适合入门者对SQL S ...
- SQL Server 数据库基础笔记分享(上)
前言 本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作和约束,视图,存储过程,触发器的基本了解. 注:内容比较基础,适合入门者对SQL S ...
- 【SQL必知必会笔记(1)】数据库基础、SQL、MySQL8.0.16下数据库、表的创建及数据插入
文章目录 1.数据库基础 1.1 数据库(database) 1.2 表(table) 1.3 列和数据类型 1.4 行 1.5 主键 2.什么是SQL 3.创建后续练习所需数据库.表(MySQL8. ...
- DBA常用SQL之数据库基础信息
第一部分: 1. 查看oracle最大连接数 sql>show parameter processes #最大连接数 2. 修改最大连接数 sql>alter system set pro ...
- sql Servers数据库基础
1. 数据库约束包含: ·非空约束 ·主键约束(PK) primary key constraint 唯一且不为空 ·唯一约束(UQ) unique constraint 唯一 ...
- SQL Server 数据库基础知识
数据库(Database)是由文件管理系统发展起来的,按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. 特点: 尽可能小的冗余度. 具有较高的数据独立性和易扩 ...
- sql操作数据库(2)--->DQL、数据库备份和还原
查询 查询表中的所有的行和列的数据 select * from 表名; select * from student; 查询指定列的数据:如果有多个列,中间用逗号隔开. select 列名1,列 ...
- MariaDB——数据库基础与sql语句
数据库介绍 什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来管理数据 ...
随机推荐
- vue全家桶进阶之路11:计算属性
Vue2 中的计算属性是指在组件中声明的计算属性,它们的值是根据其他数据计算得出的,并且会根据依赖数据的变化而自动更新.计算属性可以在模板中使用,与普通属性一样使用,但是它们具有以下优点: 缓存:计算 ...
- c#构建具有用户认证与管理的socks5代理服务端
Socks 协议是一种代理 (Proxy) 协议, 例如我们所熟知的 Shdowsocks 便是 Socks 协议的一个典型应用程序, Socks 协议有多个版本, 目前最新的版本为 5, 其协议标准 ...
- c#优雅高效的读取字节数组——不安全代码(1)
在开发上位机的经历中,会有很多需要和下位机交互通信的场景,大多数都会定义一个和硬件的通信协议,最终在上位机代码中的形式其实就是符合通信协议的字节数组. 目录 场景 如何解析字节数组到类或结构体中 建立 ...
- [MAUI]模仿Chrome下拉标签页的交互实现
@ 目录 创建粘滞效果的圆控件 贝塞尔曲线绘制圆 创建控件 创建形变 可控形变 形变边界 形变动画 创建手势控件 创建页面布局 更新拖拽物位置 其它细节 项目地址 今天来说说怎样在.NET MAUI中 ...
- Qt+QtWebApp开发笔记(四):http服务器使用Session和Cookie实现用户密码登录和注销功能
前言 前面实现了基础的跳转,那么动态交互中登录是常用功能. 本篇实现一个动态交互的简单登录和注销功能,在Qt中使用Session和Cookie技术. Demo 下载地址 链接:ht ...
- GitHub 的项目徽章
GitHub 项目的 README.md 中可以添加徽章(Badge)对项目进行标记和说明,这些好看的小图标不仅简洁美观,而且还包含了清晰易读的信息. GitHub 项目的徽标可以参考 https:/ ...
- JetBrain学信网注册(Clion)
一.打开网站 首先打开JetBrains关于学生认证的网站:https://www.jetbrains.com/shop/eform/students,可以看见以下页面: 二.人工验证 人工验证适合于 ...
- Linux系统运维之MYSQL数据库集群部署(主从复制)
一.介绍 Mysql主从复制,前段时间生产环境部署了一套主从复制的架构,当时现找了很多资料,现在记录下 二.拓扑图 三.环境以及软件版本 主机名 IP 操作系统 角色 软件版本 MysqlDB_Mas ...
- Oracle sql 错误 : ORA-01861: 文字与格式字符串不匹配和日期与字符串互转问题解决
正确的要这样的: public int update(String ceratedate); <update id="update" parameterType=" ...
- [TSG开发日志4]算法组件、个人编写的库文件如何封装成DLL,如何更好地对接软件开发?
写在前面 这个内容确实是我有点疏忽了,我以为做算法的同事应该多少对这方面会有点了解的.但是我想了一下我刚毕业的时候,确实对这方面的理解不深,查了很多资料才勉强搞懂什么意思,也是后来随着工程学习的愈加深 ...