查询操作是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 SnameFROM StudentWHERE 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,SsexFROM StudentWHERE  Sname LIKE ‘刘%’;

查询姓"欧阳"且全名为三个汉字的学生的姓名。

  SELECT SnameFROM   StudentWHERE  Sname LIKE '欧阳__';

查询名字中第2个字为"阳"字的学生的姓名和学号。

  SELECT Sname,SnoFROM StudentWHERE Sname LIKE ‘__阳%’;

查询所有不姓刘的学生姓名。

   SELECT Sname,Sno,SsexFROM StudentWHERE Sname NOT LIKE '刘%';

类型3: 使用换码字符将通配符转义为普通字符

查询DB_Design课程的课程号和学分。

  SELECT Cno,CcreditFROM CourseWHERE Cname LIKE 'DB\_Design' ESCAPE '\‘;

查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。

  SELECT  *FROM   CourseWHERE  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 SCWHERE 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 SCWHERE Cno= ‘ 1 ’;

学数据库还不会Select,SQL Select详解,单表查询完全解析?相关推荐

  1. 数据库标准语言SQL(六)——单表查询(二)

    数据库标准语言SQL(五)--查询(二) 一.前言 这一次内容继续是单表查询的部分,然后单表查询就结束了. 二.示例 1.用值表确定集合查询 引入谓词IN 查找属性值属于指定集合的元组,可以让我们在查 ...

  2. Mysql数据库轻松学06—数据分析师常用:数据查询语言DQL之单表查询

    数据查询语言DQL 用来查询数据库表中的记录 基本结构: SELECT 字段名 FROM 表或视图名 WHERE 查询条件 单表查询 1.结果为虚拟结果集 select语句执行后服务器会按照要求检索表 ...

  3. oracle数据库之数据的增删改以及简单的单表查询

    /*注意,下面的某些表内容是为了演示需要,你们练习的时候可以复制我的这篇文章做SQL脚本直接运行,应该没有问题,如果有问题可以检查一下是不是少了    ;         或者哪行注释没有注释掉,自己 ...

  4. 数据库学习记录9一文详解多表查询

    目录 多表关系 一对多 多对多 一对一 多表查询概述 数据准备 概述 分类 内连接 外连接 自连接 联合查询 子查询 列子查询 行子查询 表子查询 多表查询 多表关系 一对一 一对多(多对一) 多对多 ...

  5. oracle数据库查询需步骤,PLSQL操作Oracle数据库之单表查询SQL语句 看完你就知道了...

    Orcale数据库作为商业级的大型关系型数据库管理系统,以其较高的安全性和强大的可移植性赢得了市场的广泛认可,而PLSQL作为操作Oracle的编程语言的最佳选择,掌握其编程原理及基本的sql操作是掌 ...

  6. oracle分页查询sql语句通用,oracle分页查询sql语句,oracle分页查询sql语句详解

    oracle分页查询sql语句,oracle分页查询sql语句详解,Oracle分页查询sql语句 Oracle中分页和MySql中的分页不同,MySql中的分页使用关键字limit即可,相对简单一点 ...

  7. 数据库作业:SQL练习3 - SELECT(单表查询)

    这是一些单表查询的例题的练习. [3.29] SELECT * FROM Student WHERE Sno LIKE '201215121'; 等价于: SELECT * FROM Student ...

  8. SQL语句 SELECT LIKE用法详解

    在SQL结构化查询语言中,LIKE语句有着至关重要的作用. LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用 ...

  9. 笔记:3.4 《数据库系统概论》之数据查询---SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)

    对 3.2 数据查询-SELECT(单表查询.连接查询.嵌套查询.集合查询.多表查询)的转载与学习笔记: 0.前言 本篇文章是对<数据库系统概论>王珊老师主编的数据库查询SELECT部分做 ...

最新文章

  1. 二维码Data Matrix简介及在VS2010中的编译
  2. Ubuntu~Tensorflow~GPU
  3. PHP程序员如何突破技术瓶颈
  4. python自动填写小程序表单_新年好!教大家用Python写一个自动回复拜年信息的小程序!...
  5. 将字符串1/4转换成0.25 eval()
  6. 面试—每日一题(5)
  7. bootstrap-suggest插件处理复杂对象时的解决方案
  8. 苹果激活锁功能降低iPhone盗窃案发案率
  9. 僵尸进程以及如何处理僵尸进程
  10. golang模拟新浪微博登录
  11. 蜗牛星际b款装服务器系统,蜗牛星际B款单网口折腾
  12. 服务器guid怎么装系统,GUID分区模式,UEFI+PGT磁盘模式安装Ghost系统详解
  13. 解决某物流企业二维码打印问题
  14. 后缀是php,php是什么文件_文件后缀php是什么意思
  15. 陈欧体程序员版And各种版本
  16. C语言中常常被忽略的知识-特殊字符打印、多组输入输出等等问题。
  17. 淘宝网深圳专场招聘会亲历记
  18. caffe源码理解之inner_product_layer
  19. 基于ssm的图书(借阅)管理系统
  20. 一篇文章梳理清楚 Python 多线程与多进程

热门文章

  1. 中国石油计算机第二次在线作业,中国石油大学(北京)计算机应用基础第二次在线作业1教程.docx...
  2. Java线程池ThreadPoolExecutor
  3. PHP str_replace() 和str_ireplace()函数
  4. 《开源思索集》一黑客的胜利——读《增长黑客》有感
  5. 读《代码整洁之道》前四章浅显印象 和 我所见的不整洁代码引以为戒
  6. js实现选中文字 分享功能
  7. quartus怎么仿真波形_单相半波可控整流电路电阻负载的Matlab Simulink仿真
  8. php调用百度天气接口,php使用百度天气接口示例
  9. css3如何向上_html5 – 使用CSS3不断向上动画气泡?
  10. C语言编写一个赋值程序,实验2 用C语言编写简单程序——2.1 基本数据处理.doc