数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)
查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下。
一、数据查询的语句格式
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式> ....] --可以选择多个列
FROM <表名或视图名>[, <表名或视图名> ....]--可以选择多个表或视图
[ WHERE <条件表达式> ] --查询什么条件的数据
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ] --按什么条件分组
[ ORDER BY <列名2> [ ASC|DESC ] ];--按什么条件排序
- SELECT子句:指定要显示的属性列
- FROM子句:指定查询对象(基本表或视图)
- WHERE子句:指定查询条件
- GROUP BY子句:
细化聚集函数的作用对象- 未对查询结果分组,聚集函数将作用于整个查询结果
- 对查询结果分组后,聚集函数将分别作用于每个组
- 作用对象是查询的中间结果表
- 按指定的一列或多列值分组,值相等的为一组
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。
例子:
BILL表
Customer | Quantity | Date |
---|---|---|
张三 | 10 | 2020-3-19 |
李四 | 29 | 2020-3-19 |
王五 | 9 | 2020-3-19 |
张三 | 21 | 2020-3-19 |
王五 | 19 | 2020-3-20 |
执行SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer
我们会得到如下表
Customer | Quantity |
---|---|
张三 | 31 |
李四 | 29 |
王五 | 28 |
如果我们不加GROUP BY 会得到这样一个表
Customer | Quantity |
---|---|
张三 | 88 |
李四 | 88 |
王五 | 88 |
张三 | 88 |
王五 | 88 |
当然GROUP BY也可以按多个列分组,即两个都想同时才会被分到一个组
还是对BILL表操作 SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer,Date
我们会得到如下表
Customer | Quantity |
---|---|
张三 | 31 |
李四 | 29 |
王五 | 9 |
王五 | 19 |
HAVING短语:
筛选出只有满足指定条件的组
例子:
BILL表Customer Quantity Date 张三 10 2020-3-19 李四 29 2020-3-19 王五 9 2020-3-19 张三 21 2020-3-19 王五 19 2020-3-20 我们查询购买总量小于30的Customer
SELECT Customer,SUM(Quantity) From BILL
GROUP BY Customer
HAVING SUM(Quantity)>30
我们会得到如下:
Customer Quantity 张三 31 ORDER BY子句:对查询结果表按指定列值的升序或降序排序
还是对BILL表操作Customer Quantity Date 张三 10 2020-3-19 李四 29 2020-3-19 王五 9 2020-3-19 张三 21 2020-3-19 王五 19 2020-3-20 我们想按照购买总数量排列查询结果
SELECT Customer ,SUM(Quantity) FROM BILL
GROUP BY Customer
ORDER BY SUM(Quantity) ASC
我们会得到如下表
Customer Quantity 王五 28 李四 29 张三 31
ORDER BY子句
- 可以按一个或多个属性列排序
- 升序:ASC;降序:DESC;缺省值为升序
- 当排序列含空值时
- ASC:排序列为空值的元组最后显示
- DESC:排序列为空值的元组最先显示
二、单表查询
刚才在介绍那几个保留字的时候,我们简单的举了几个查询的例子,现在我们详细系统的介绍一下,有点重复,但是比较基础,加深印象。
1.选择表中的若干列查询
选择某几列查询:
SELECT <列1>,<列2>......
FROM <数据表>;
选择全部列查询:
当然我们可以,把所有的列一一列举,我们也可以使用SELECT *
SELECT *
FROM <数据表>;
举例:
还是BILL表
Customer | Quantity | Date |
---|---|---|
张三 | 10 | 2020-3-19 |
李四 | 29 | 2020-3-19 |
王五 | 9 | 2020-3-19 |
张三 | 21 | 2020-3-19 |
王五 | 19 | 2020-3-20 |
SELECT Customer From BILL
得到如下表
Customer |
---|
张三 |
李四 |
王五 |
张三 |
王五 |
执行:
SELECT Customer ,Quantity,Date FROM BILL
--或者
SELECT * FROM BILL
得到如下结果
Customer | Quantity | Date |
---|---|---|
张三 | 10 | 2020-3-19 |
李四 | 29 | 2020-3-19 |
王五 | 9 | 2020-3-19 |
张三 | 21 | 2020-3-19 |
王五 | 19 | 2020-3-20 |
2.查询经过计算的值
之前我们给出了SELECT标准格式:
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式> ....] --可以选择多个列
FROM <表名或视图名>[, <表名或视图名> ....]--可以选择多个表或视图
[ WHERE <条件表达式> ] --查询什么条件的数据
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ] --按什么条件分组
[ ORDER BY <列名2> [ ASC|DESC ] ];--按什么条件排序
其中目标表达式可以为:
- 算术表达式
- 字符串常量
- 函数
- 列别名
例子:
Students表
Name | Birth |
---|---|
李勇 | 1999 |
刘晨 | 1997 |
王敏 | 1996 |
张立 | 1998 |
我们查询每个人的年龄:
SELECT NAME,2020-Birth
FROM Student;
得道如下的查询结果:
Name | 2020-Birth |
---|---|
李勇 | 21 |
刘晨 | 23 |
王敏 | 24 |
张立 | 22 |
在查询中添加新的字符串列
例子
Name | Birth |
---|---|
李勇 | 1999 |
刘晨 | 1997 |
王敏 | 1996 |
张立 | 1998 |
SELECT Name,'Birth is:',Birth
FROM Students ;
结果:
Name | ‘Birth is:’ | Birth |
---|---|---|
李勇 | Birth is: | 1999 |
刘晨 | Birth is: | 1997 |
王敏 | Birth is: | 1996 |
张立 | Birth is: | 1998 |
查询中显示列别名
例子
Students表
Name | Birth |
---|---|
李勇 | 1999 |
刘晨 | 1997 |
王敏 | 1996 |
张立 | 1998 |
SELECT Name 姓名, Birth 生日
FROM Students ;
结果
姓名 | 生日 |
---|---|
李勇 | 1999 |
刘晨 | 1997 |
王敏 | 1996 |
张立 | 1998 |
3.选择表中的若干元组(行)
元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。
DISTINCT 语句:
指定DISTINCT关键词,去掉表中重复的行
例子:
BILL表
Customer | Quantity | Date |
---|---|---|
张三 | 10 | 2020-3-19 |
李四 | 29 | 2020-3-19 |
王五 | 9 | 2020-3-19 |
张三 | 21 | 2020-3-19 |
王五 | 19 | 2020-3-20 |
我们执行以下语句查看区别:
SELECT DISTINCT Customer FROM BILL
Customer |
---|
张三 |
李四 |
王五 |
如果不加DISTINCT,结果如下:
Customer |
---|
张三 |
李四 |
王五 |
张三 |
王五 |
作用显而易见
查询满足条件的元组:
常用的查询条件 | 谓词 |
---|---|
比 较 | =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符 |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN,NOT IN |
字符匹配 | LIKE,NOT LIKE |
空 值 | IS NULL,IS NOT NULL |
多重条件(逻辑运算) | AND,OR,NOT |
这次我们多举几个例子:
Student表
Sname | Sage | Sdept | Sgrade | Ssex |
---|---|---|---|---|
张三 | 18 | C.S | 80 | 1 |
李四 | 18 | C.S | 72 | 0 |
王五 | 17 | I.C.S | 63 | 0 |
韩六 | 18 | C.S | 98 | 1 |
周七 | 19 | I.C.S | 34 | 0 |
赵八 | 20 | C.S | 60 | 1 |
以下所有查询的基本表都默认为Student表
例一: 查询计算机科学系全体学生的名单
SELECT Sname
FROM Student
WHERE Sdept='C.S.';
结果:
Sname |
---|
张三 |
李四 |
韩六 |
赵八 |
例二: 查询所有年龄在18岁以上的学生姓名及其年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage>18;
结果
Sname | Sage |
---|---|
周七 | 19 |
赵八 | 20 |
BETWEEN…AND…语句
例三: 查询年龄在18~20岁(包括18岁和20岁)之间的学生的姓名、系别和年龄
SELECT Sname,Sage,Sdept
FROM Student
WHERE Sage BETWEEN 18 AND 20;
结果
Sname | Sage | Sdept |
---|---|---|
张三 | 18 | C.S |
李四 | 18 | C.S |
韩六 | 18 | C.S |
周七 | 19 | I.C.S |
赵八 | 20 | C.S |
例四: 查询年龄不在18~20岁(包括18岁和20岁)之间的学生的姓名、系别和年龄
SELECT Sname,Sage,Sdept
FROM Student
WHERE Sage NOT BETWEEN 18 AND 20;
结果
Sname | Sage | Sdept |
---|---|---|
王五 | 17 | I.C.S |
IN/NOT IN语句
例四: 查询年龄为17 和 20岁的学生姓名,年龄及专业
SELECT Sname,Sage,Sdept
FROM Student
WHERE Sage IN (17,20);
结果
Sname | Sage | Sdept |
---|---|---|
王五 | 17 | I.C.S |
赵八 | 20 | C.S |
例五: 查询年龄不为17 和 20岁的学生姓名,年龄及专业
SELECT Sname,Sage,Sdept
FROM Student
WHERE Sage NOT IN (17,20);
Sname | Sage | Sdept |
---|---|---|
张三 | 18 | C.S |
李四 | 18 | C.S |
韩六 | 18 | C.S |
周七 | 19 | I.C.S |
字符串匹配:
语法格式:
谓词:
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
<匹配串>:指定匹配模板
匹配模板:固定字符串或含通配符的字符串
当匹配模板为固定字符串时,
可以用 = 运算符取代 LIKE 谓词
用 != 或 < >运算符取代 NOT LIKE 谓词
通配符:
通配符 | 描述 |
---|---|
% | 代表任意长度(长度可以为0)的字符串 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist]或者[!charlist] | 不在字符列中的任何单一字符 |
例:
a%b表示以a开头,以b结尾的任意长度的字符串。如acb,addgb,ab 等都满足该匹配串
a_b表示以a开头,以b结尾的长度为3的任意字符串。如acb,afb等都满足该匹配串
ESCAPE 短语:
当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘<换码字符>’ 短语对通配符进行转义。
类型1: 匹配串为固定字符串
查询学号为200215121的学生的详细情况。
SELECT *
FROM Student
WHERE Sno LIKE ‘200215121';
等价于:
SELECT *
FROM Student
WHERE Sno = ' 200215121 ';
类型2: 匹配串为含通配符的字符串
查询所有姓刘学生的姓名、学号和性别。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE ‘刘%’;
查询姓"欧阳"且全名为三个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳__';
查询名字中第2个字为"阳"字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE ‘__阳%’;
查询所有不姓刘的学生姓名。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '刘%';
类型3: 使用换码字符将通配符转义为普通字符
查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\‘;
查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i_ _' ESCAPE ' \ ‘;
ESCAPE ‘\’ 表示“ \” 为换码字符
学过C++的大家都知道\n代表换行,\为转义字符。这里是说,我们通过ESCAPE语句将\定义为换码字符(可以理解为转义字符)
类型4: 涉及空值的查询
谓词:IS NULL 或 IS NOT NULL 而且 “IS” 不能用 “=” 代替。
如果某些同学的信息不完整,比如在某个表中手机号未填写,那这位同学的元组中的手机号这一属性为NULL;
要想查出这类同学的姓名我们可以执行以下操作
Student表
Sname | Sage | Sdept | Sgrade | Ssex | Spho |
---|---|---|---|---|---|
张三 | 18 | C.S | 80 | 1 | 12345678 |
李四 | 18 | C.S | 72 | 0 | 12345679 |
王五 | 17 | I.C.S | 63 | 0 | 12345680 |
韩六 | 18 | C.S | 98 | 1 | NULL |
周七 | 19 | I.C.S | 34 | 0 | 234234234 |
赵八 | 20 | C.S | 60 | 1 | NULL |
SELECT Sname,Spho From Student
WHERE Spho IS NULL;
Sname | Spho |
---|---|
韩六 | NULL |
赵八 | NULL |
类型5: 多重条件查询
逻辑运算符:
AND:且 连接前后两个条件都成立时表达式为真
OR:或 连接前后表达式有一个为真时表达式为真
AND优先级大于OR,可以加括号进行复合运算,进而改变优先级。
常用的查询条件 | 谓词 |
---|---|
比 较 | =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符 |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN,NOT IN |
字符匹配 | LIKE,NOT LIKE |
空 值 | IS NULL,IS NOT NULL |
多重条件(逻辑运算) | AND,OR,NOT |
可以连接上面表中的所有运算符,只要保证最后得到表达可以分辨真假有意义即可。
这个比较简单我们举一个例子:
查询18岁的学生且属于计算机科学专业的姓名,年龄,专业
Sname | Sage | Sdept | Sgrade | Ssex | Spho |
---|---|---|---|---|---|
张三 | 18 | C.S | 80 | 1 | 12345678 |
李四 | 18 | C.S | 72 | 0 | 12345679 |
王五 | 17 | I.C.S | 63 | 0 | 12345680 |
韩六 | 18 | C.S | 98 | 1 | NULL |
周七 | 19 | I.C.S | 34 | 0 | 234234234 |
赵八 | 20 | C.S | 60 | 1 | NULL |
SELECT Sname,Sage,Sdept FROM Students
WHERE Sage=18 AND Sdept='C.S.';
Sname | Sage | Sdept |
---|---|---|
张三 | 18 | C.S |
李四 | 18 | C.S |
韩六 | 18 | C.S |
4.聚集函数
计数
SQL COUNT(column_name) 语法
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
SELECT COUNT(column_name) FROM table_name
SQL COUNT(*) 语法
COUNT(*) 函数返回表中的记录数:
SELECT COUNT(*) FROM table_name
SQL COUNT(DISTINCT column_name) 语法
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:
SELECT COUNT(DISTINCT column_name) FROM table_name
例:
查询学生总人数。
SELECT COUNT(*)
FROM Student;
查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno)
FROM SC
计算总和
SQL SUM() 语法
SELECT SUM(column_name) FROM table_name
开头举过例子,这里就不再重复赘述。
计算平均值
AVG 函数返回数值列的平均值。NULL 值不包括在计算中。
SQL AVG() 语法
SELECT AVG(column_name) FROM table_name
例
计算1号课程的学生平均成绩。
SELECT AVG(Grade)
FROM SC
WHERE Cno= ‘ 1 ’;
最大最小值
MAX() 函数和MIN()函数
MAX 函数返回一列中的最大值,MIN 函数返回一列中的最小值。NULL 值不包括在计算中。
SQL中的语法
SELECT MAX(column_name) FROM table_name
SELECT MIN(column_name) FROM table_name
MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
例:
查询选修1号课程的学生最高分数。
SELECT MAX(Grade)
FROM SC
WHERE Cno= ‘ 1 ’;
写在最后:
我叫风骨散人,名字的意思是我多想可以不低头的自由生活,可现实却不是这样。家境贫寒,总得向这个世界低头,所以我一直在奋斗,想改变我的命运
给亲人好的生活,希望同样被生活绑架的你
可以通过自己的努力改变现状,深知成年人的世界里没有容易二字。目前是一名在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你!
如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文!
谢谢大家的阅读!数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)的更多相关文章
- 数据库SQL语言从入门到精通--Part 4--SQL语言中的模式、基本表、视图
数据库从入门到精通合集(超详细,学习数据库必看) 前言: 使用SQL语言时,要注意SQL语言对大小写并不敏感,一般使用大写.所有符号一定是西文标点符号(虽然是常识,但我还是提一嘴) 1.模式的定义与删 ...
- 数据库SQL语言从入门到精通--Part 1--SQL语言概述
数据库从入门到精通合集(超详细,学习数据库必看) 一.SQL概述 关系数据库标准语言SQL(结构化查询语言). 结构化查询语言(Structured Query Language)简称SQL,是一种特 ...
- 数据库SQL语言从入门到精通--Part 3--SQL语言基础知识
数据库从入门到精通合集(超详细,学习数据库必看) 一.关系 单一的数据结构----关系 现实世界的实体以及实体间的各种联系均用关系来表示 逻辑结构----二维表 从用户角度,关系模型中数据的逻辑结构是 ...
- 数据库SQL语言从入门到精通--Part 5--E-R图(实体联系图)用来描述数据库图例
数据库从入门到精通合集(超详细,学习数据库必看) E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. ...
- 数据库SQL语言从入门到精通--Part 2--MySQL安装
数据库从入门到精通合集(超详细,学习数据库必看) 首先给出的简单安装方式,文末给出标准的安装方式. 第一步下载我的压缩包 链接:https://pan.baidu.com/s/1EE40dU0j2U1 ...
- SQL学习笔记四(补充-1-1)之MySQL单表查询补充部分:SQL逻辑查询语句执行顺序
阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SELECT语句关键字的定义顺序 SELE ...
- mysql数据库从删库到跑路之select单表查询
一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...
- SQL学习笔记四(补充-1)之MySQL单表查询
阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录 ...
- 巨蟒python全栈开发数据库攻略3:行记录的操作&单表查询3
1.数据行的增删改 2.单表查询 select&where条件 3.group by&having&order by&limit
随机推荐
- Linux bash篇(四 命令)
1.一次执行多个命令 ; eg: ls -al ; touch data.txt 2.根据情况执行命令 && || cmd1 && c ...
- 正则表达式 regex
正则表达式存在于String api下的matches方法 常用正常表达式: 字符 x 字符 x \\ 反斜线字符 字符类 [abc] a.b 或 c(简单类) [^abc] 任何字符,除了 a.b ...
- for循环in遍历
<script> //对象本身没有length,所以不能用for循环遍历 //要用for...in...循环 var aaa = {"name":"拴住&qu ...
- 深入理解new运算符
在 JavaScript 中,new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例.创建一个对象很简单,为什么我们还要多此一举使用 new 运算符呢?它到底有什么样的魔力? 认 ...
- Python logging日志打印
1.logging常用函数Logger.setLevel():设置日志级别Logger.addHandler()和Logger.removeHandler():添加和删除一个handlerLogger ...
- Springboot:logback日志管理(九)
Springboot默认使用的日志框架就是logback 创建自定义的logback-spring.xml放在resources类目录下即可 logback-spring.xml: <?xml ...
- CentOS 使用中问题记录
⚠️使用yum提示Error: rpmdb open failed的解决方案 清除原rpmdb文件,这一步可能不用操作,直接进行第2步 # rm -f /var/lib/rpm/__db.* 重建rp ...
- Java 创建 Excel 数据透视表
Excel 数据透视表具有强大的数据处理功能,能够使表格中的数据更加直观化.使用Excel 数据透视表,能方便用户快速的排序. 筛选各种数据,同时也能满足用户对不同数据汇总的需求.本文将介绍如何在Ja ...
- 箭头函数的this指向问题-一看就懂
OK,对于箭头函数的this 用一句话概括:箭头函数中的this指向的是定义时的this,而不是执行时的this. 如果上面这句话听的是懂非懂或者完全不懂的,没关系,下面会有案例讲解. 举个栗子 来看 ...
- 8个超好用的Python内置函数,提升效率必备(小白必看)
python中有许多内置函数,不像print那么广为人知,但它们却异常的强大,用好了可以大大提高代码效率. 这次来梳理下8个好用的python内置函数. 1.set() 当需要对一个列表进行去重操作的 ...