资讯专栏INFORMATION COLUMN

关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询

VishKozus / 3631人阅读

摘要:连接查询涉及两个及以上的表查询为连接查询。查询二班学生成绩二班聚合函数查询聚合函数是一个值的集合为输入,返回单个值的函数。具体的数据库还会预定义一些其他常用的函数,比如字符串相聚合函数时间聚合函数。

前言

</>复制代码

  1. 上一篇关系数据库常用SQL语句语法大全主要是关系型数据库大体结构,本文细说一下关系型数据库查询的SQL语法。

语法回顾

</>复制代码

  1. SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]…
  2. FROM <表名或视图名>[,<表名或视图名>]…
  3. [WHERE <条件表达式>]
  4. [GROUP BY <列名> [HAVING <条件表达式>]]
  5. [ORDER BY <列名> [ASC|DESC]…]

</>复制代码

  1. SQL查询语句的顺序:SELECTFROMWHEREGROUP BYHAVINGORDER BYSELECTFROM是必须的,HAVING子句只能与GROUP BY搭配使用。

准备工作

</>复制代码

  1. 1.创建数据库和数据表
    2.插入基本数据
    3.本文以SQL Server为例介绍

</>复制代码

  1. -- 创建学生表
  2. CREATE TABLE Students(
  3. Id int NOT NULL PRIMARY KEY,
  4. Name varchar(20) NOT NULL,
  5. Class varchar(15) NOT NULL,
  6. Gender varchar(10) NULL,
  7. Age int NULL,
  8. Phone varchar(15) NULL,
  9. [Address] varchar(100) NULL
  10. )
  11. -- 创建课程表
  12. CREATE TABLE Courses(
  13. Id int NOT NULL PRIMARY KEY IDENTITY(1,1),
  14. Name varchar(50) NOT NULL
  15. );
  16. -- 创建成绩表
  17. CREATE TABLE Scores(
  18. Id int PRIMARY KEY IDENTITY(1,1),
  19. SId int NOT NULL,
  20. CId int NOT NULL,
  21. Grades decimal(5,2) NOT NULL,
  22. IsPassed bit NOT NULL
  23. );
  24. -- 插入学生表基础数据
  25. INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016001,"小明","一班","男",20,"18817716611","北京");
  26. INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016002,"小龙","一班","男",19,"18817716622","天津");
  27. INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016003,"小王","二班","男",20,"18817716633","北京");
  28. INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016004,"婷婷","一班","女",17,"18817716644","济南");
  29. INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016005,"张三","一班","男",19,"18817716655","北京");
  30. INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016006,"小赵","一班","男",20,"18817716666","北京");
  31. INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016007,"丽丽","二班","女",18,"18817716677","北京");
  32. INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016008,"花花","一班","女",19,"18817716688","沈阳");
  33. INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016009,"静静","二班","女",20,"18817716699","北京");
  34. -- 插入课程表基础数据
  35. INSERT INTO Courses(Name) VALUES("语文");
  36. INSERT INTO Courses(Name) VALUES("数学");
  37. INSERT INTO Courses(Name) VALUES("英语");
  38. -- 插入成绩表基础数据
  39. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,1,120,1);
  40. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,2,70,0);
  41. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,3,89,1);
  42. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,1,90,1);
  43. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,2,88,1);
  44. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,3,96,1);
  45. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016003,1,112,1);
  46. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016003,3,102,1);
  47. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,1,80,1);
  48. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,2,86,1);
  49. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,3,47,0);
  50. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,1,87,1);
  51. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,2,96,1);
  52. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,3,68,0);
  53. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016006,2,95,1);
  54. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016006,3,100,1);
  55. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,1,87,1);
  56. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,2,57,0);
  57. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,3,130,1);
  58. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016008,1,89,1);
  59. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016008,3,66,0);
  60. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,1,97,1);
  61. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,2,104,1);
  62. INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,3,68,1);
简单查询

</>复制代码

  1. 简单查询只需要SELECTFROMWHERE3个关键字即可实现。

</>复制代码

  1. SELECT * FROM Students;
  2. SELECT * FROM Students WHERE Class="一班";
  3. SELECT * FROM Students WHERE Class="一班" AND Age = 20;

别名/更名

语法

</>复制代码

  1. SELECT 字段名1 [AS] 别名 [,字段名1 AS 别名]… FROM <表名>

</>复制代码

  1. AS可以省略
    当别名中含有非字母和下划线时或者是关键字时,需要加上单/双引号

示例

</>复制代码

  1. SELECT Id AS "学号",Name "姓名",Class ClassName FROM Students;

子查询(嵌套查询)

</>复制代码

  1. 子查询也称嵌套查询,是指一个SELECT查询语句可以嵌入另一个SELECT查询语句之中。SQL中允许多级嵌套,子查询在实际使用中非常多。
    连接查询:涉及两个及以上的表查询为连接查询。

</>复制代码

  1. --查询二班学生成绩
  2. SELECT * FROM Scores WHERE SId IN(SELECT Id FROM Students WHERE Class="二班")

聚合函数查询

</>复制代码

  1. 聚合函数:是一个值的集合为输入,返回单个值的函数。
    SQL预定义了5个聚集函数:AVG(平均值)、MIN(最小值)、MAX(最大值)、SUM(求和)、COUNT(计数)。
    具体的数据库还会预定义一些其他常用的函数,比如字符串相聚合函数、时间聚合函数……。

</>复制代码

  1. SELECT AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id) FROM Students;

分组查询

</>复制代码

  1. 使用GROUP BY子句可进行分组查询
    注意:分组查询的时候要在GROUP BY子句后面跟上所有查询字段的列表

</>复制代码

  1. --根据班级分组查询各班平均年龄、最大 年龄、最小年龄、年龄总和、班级人数
  2. SELECT Class,AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id) FROM Students GROUP BY Class;

HAVING子句

</>复制代码

  1. 如果需要在分组前的数据进行限制,可以使用HAVING子句
    HAVING子句只能与GROUP BY搭配使用

</>复制代码

  1. --根据班级分组查询各班平均年龄并且班级人数大于3人
  2. SELECT Class,AVG(Age) FROM Students GROUP BY Class HAVING COUNT(Id)>3;

HAVING子句和WHERE的区别

</>复制代码

  1. WHERE语句在GROUP BY语句之前,SQL会在分组之前计算WHERE语句;
    HAVING语句在GROUP BY语句之后,SQL会在分组之后计算HAVING语句。

模糊查询

语法

</>复制代码

  1. SELECT 字段列表 FROM 表名 WHERE 字段 LIKE "<通配符>"

</>复制代码

  1. 模糊查询是通过关键字LIKE和通配符实现的
    _:任何单个字符(一个"_"只匹配一个字符,多个字符就使用多个_)
    %:包含零个或更多字符的任意字符串(匹配任意内容)
    []:指定范围的字符(只匹配[]内的字符)
    [ ^]:不在指定范围的字符(只匹配除[]内的字符)
    SQL中通配符可以混合使用

单个字符匹配

</>复制代码

  1. SELECT * FROM Students WHERE Name LIKE "小_";
  2. SELECT * FROM Students WHERE Phone LIKE "188177166__";

任意字符匹配

</>复制代码

  1. SELECT * FROM Students WHERE Phone LIKE "188177166__";
  2. SELECT * FROM Students WHERE Phone LIKE "%";
  3. SELECT * FROM Students;

</>复制代码

  1. 这三条SQL语句查询结果都相同只针对此表,原因是瞎猫碰上死耗子。(数据少,刚好查询的结果是全部的内容)

范围内查询

</>复制代码

  1. -- 查询所有手机号码结尾两位包含1和2的信息
  2. SELECT * FROM Students WHERE Phone LIKE "188177166[12][12]";

不在范围内查询

</>复制代码

  1. -- 查询所有手机号码结尾两位不包含1、3、5、7的信息
  2. SELECT * FROM Students WHERE Phone LIKE "188177166[^1357][^1357]";

关于SQL查询就到这里告一段落,后面会更新相关内容。
如果你觉得有问题,欢迎和你一起探讨。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17543.html

相关文章

  • 关系据库SQL高级数据查询:去重复、组合查询、连接查询、虚拟表

    摘要:前言接上一篇关系数据库之基本数据查询子查询分组查询模糊查询,主要是关系型数据库基本数据查询。包括子查询分组查询聚合函数查询模糊查询,本文是介绍一下关系型数据库几种高级数据查询语法,包括虚拟表去重复查询组合查询连接查询。 前言 接上一篇关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询,主要是关系型数据库基本数据查询。包括子查询、分组查询、聚合函数查询、模糊查询,本文是介绍一下...

    EasonTyler 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<