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

查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下。

一、数据查询的语句格式
 SELECT [ALL|DISTINCT] <目标列表达式>[<目标列表达式> ....] --可以选择多个列
FROM <表名或视图名>[<表名或视图名> ....]--可以选择多个表或视图
[ WHERE <条件表达式> ]  --查询什么条件的数据
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]  --按什么条件分组
[ ORDER BY <列名2> [ ASC|DESC ] ]--按什么条件排序

  • SELECT子句:指定要显示的属性列
  • FROM子句:指定查询对象(基本表或视图)
  • WHERE子句:指定查询条件
  • GROUP BY子句:
    细化聚集函数的作用对象
    • 未对查询结果分组,聚集函数将作用于整个查询结果
    • 对查询结果分组后,聚集函数将分别作用于每个组
    • 作用对象是查询的中间结果表
    • 按指定的一列或多列值分组,值相等的为一组

合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。

例子:
BILL表

CustomerQuantityDate
张三102020-3-19
李四292020-3-19
王五92020-3-19
张三212020-3-19
王五192020-3-20

执行SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer
我们会得到如下表

CustomerQuantity
张三31
李四29
王五28

如果我们不加GROUP BY 会得到这样一个表

CustomerQuantity
张三88
李四88
王五88
张三88
王五88

当然GROUP BY也可以按多个列分组,即两个都想同时才会被分到一个组
还是对BILL表操作 SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer,Date
我们会得到如下表

CustomerQuantity
张三31
李四29
王五9
王五19
  • HAVING短语:
    筛选出只有满足指定条件的组
    例子:
    BILL表

    CustomerQuantityDate
    张三102020-3-19
    李四292020-3-19
    王五92020-3-19
    张三212020-3-19
    王五192020-3-20

    我们查询购买总量小于30的Customer

    SELECT  Customer,SUM(Quantity)  From BILL 
    GROUP BY Customer
    HAVING SUM(Quantity)>30
    

    我们会得到如下:

    CustomerQuantity
    张三31
  • ORDER BY子句:对查询结果表按指定列值的升序或降序排序
    还是对BILL表操作

    CustomerQuantityDate
    张三102020-3-19
    李四292020-3-19
    王五92020-3-19
    张三212020-3-19
    王五192020-3-20

    我们想按照购买总数量排列查询结果

    SELECT Customer ,SUM(Quantity) FROM BILL 
    GROUP BY Customer
    ORDER BY SUM(Quantity) ASC
    

    我们会得到如下表

    CustomerQuantity
    王五28
    李四29
    张三31

ORDER BY子句

  • 可以按一个或多个属性列排序
  • 升序:ASC;降序:DESC;缺省值为升序
  • 当排序列含空值时
  • ASC:排序列为空值的元组最后显示
  • DESC:排序列为空值的元组最先显示
二、单表查询

刚才在介绍那几个保留字的时候,我们简单的举了几个查询的例子,现在我们详细系统的介绍一下,有点重复,但是比较基础,加深印象。

1.选择表中的若干列查询

选择某几列查询:

SELECT <1>,<2>......
FROM <数据表>;

选择全部列查询:
当然我们可以,把所有的列一一列举,我们也可以使用SELECT *

SELECT  *
FROM <数据表>

举例:
还是BILL表

CustomerQuantityDate
张三102020-3-19
李四292020-3-19
王五92020-3-19
张三212020-3-19
王五192020-3-20
SELECT Customer From BILL

得到如下表

Customer
张三
李四
王五
张三
王五

执行:

SELECT Customer ,Quantity,Date FROM BILL
--或者
SELECT * FROM BILL

得到如下结果

CustomerQuantityDate
张三102020-3-19
李四292020-3-19
王五92020-3-19
张三212020-3-19
王五192020-3-20
2.查询经过计算的值

之前我们给出了SELECT标准格式:

 SELECT [ALL|DISTINCT] <目标列表达式>[<目标列表达式> ....] --可以选择多个列
FROM <表名或视图名>[<表名或视图名> ....]--可以选择多个表或视图
[ WHERE <条件表达式> ]  --查询什么条件的数据
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]  --按什么条件分组
[ ORDER BY <列名2> [ ASC|DESC ] ]--按什么条件排序

其中目标表达式可以为:

  • 算术表达式
  • 字符串常量
  • 函数
  • 列别名

例子:
Students表

NameBirth
李勇1999
刘晨1997
王敏1996
张立1998

我们查询每个人的年龄:

SELECT NAME,2020-Birth    
FROM Student;

得道如下的查询结果:

Name2020-Birth
李勇21
刘晨23
王敏24
张立22

在查询中添加新的字符串列
例子

NameBirth
李勇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表

NameBirth
李勇1999
刘晨1997
王敏1996
张立1998
SELECT  Name 姓名, Birth 生日
FROM Students ;

结果

姓名生日
李勇1999
刘晨1997
王敏1996
张立1998
3.选择表中的若干元组(行)

元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。

DISTINCT 语句:
指定DISTINCT关键词,去掉表中重复的行
例子:
BILL表

CustomerQuantityDate
张三102020-3-19
李四292020-3-19
王五92020-3-19
张三212020-3-19
王五192020-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表

SnameSageSdeptSgradeSsex
张三18C.S801
李四18C.S720
王五17I.C.S630
韩六18C.S981
周七19I.C.S340
赵八20C.S601

以下所有查询的基本表都默认为Student表

例一: 查询计算机科学系全体学生的名单

SELECT Sname
    FROM Student
    WHERE Sdept='C.S.'

结果:

Sname
张三
李四
韩六
赵八

例二: 查询所有年龄在18岁以上的学生姓名及其年龄。

SELECT Sname,Sage 
FROM    Student    
WHERE Sage>18

结果

SnameSage
周七19
赵八20

BETWEEN…AND…语句
例三: 查询年龄在18~20岁(包括18岁和20岁)之间的学生的姓名、系别和年龄

SELECT Sname,Sage,Sdept
FROM     Student
WHERE   Sage BETWEEN 18 AND 20

结果

SnameSageSdept
张三18C.S
李四18C.S
韩六18C.S
周七19I.C.S
赵八20C.S

例四: 查询年龄在18~20岁(包括18岁和20岁)之间的学生的姓名、系别和年龄

SELECT Sname,Sage,Sdept
FROM     Student
WHERE   Sage NOT BETWEEN 18 AND 20

结果

SnameSageSdept
王五17I.C.S

IN/NOT IN语句
例四: 查询年龄为17 和 20岁的学生姓名,年龄及专业

SELECT Sname,Sage,Sdept
FROM     Student
WHERE   Sage IN (1720);

结果

SnameSageSdept
王五17I.C.S
赵八20C.S

例五: 查询年龄不为17 和 20岁的学生姓名,年龄及专业

SELECT Sname,Sage,Sdept
FROM     Student
WHERE   Sage NOT IN (1720);
SnameSageSdept
张三18C.S
李四18C.S
韩六18C.S
周七19I.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 LIKE200215121';

等价于:

  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表

SnameSageSdeptSgradeSsexSpho
张三18C.S80112345678
李四18C.S72012345679
王五17I.C.S63012345680
韩六18C.S981NULL
周七19I.C.S340234234234
赵八20C.S601NULL
SELECT Sname,Spho From Student
WHERE Spho IS NULL;
SnameSpho
韩六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岁的学生且属于计算机科学专业的姓名,年龄,专业

SnameSageSdeptSgradeSsexSpho
张三18C.S80112345678
李四18C.S72012345679
王五17I.C.S63012345680
韩六18C.S981NULL
周七19I.C.S340234234234
赵八20C.S601NULL
SELECT Sname,Sage,Sdept FROM Students
WHERE Sage=18 AND Sdept='C.S.';
SnameSageSdept
张三18C.S
李四18C.S
韩六18C.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 ’;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值