SQL数据查询

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

字数1843阅读1707评论10喜欢115

前言

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

SQL数据查询

语法回顾

SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]…FROM<表名或视图名>[,<表名或视图名>]…  [WHERE<条件表达式>]  [GROUPBY<列名> [HAVING<条件表达式>]]  [ORDERBY<列名> [ASC|DESC]…]

SQL查询语句的顺序:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。SELECT、FROM是必须的,HAVING子句只能与GROUP BY搭配使用。

准备工作

1.创建数据库和数据表

2.插入基本数据

3.本文以SQL Server为例介绍

-- 创建学生表CREATETABLEStudents(IdintNOTNULLPRIMARYKEY,Namevarchar(20)NOTNULL,Classvarchar(15)NOTNULL,    Gendervarchar(10)NULL,    AgeintNULL,    Phonevarchar(15)NULL,    [Address]varchar(100)NULL)-- 创建课程表CREATETABLECourses(IdintNOTNULLPRIMARYKEYIDENTITY(1,1),Namevarchar(50)NOTNULL);-- 创建成绩表CREATETABLEScores(IdintPRIMARYKEYIDENTITY(1,1),SIdintNOTNULL,    CIdintNOTNULL,    Gradesdecimal(5,2)NOTNULL,    IsPassedbitNOTNULL);-- 插入学生表基础数据INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016001,'小明','一班','男',20,'18817716611','北京');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016002,'小龙','一班','男',19,'18817716622','天津');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016003,'小王','二班','男',20,'18817716633','北京');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016004,'婷婷','一班','女',17,'18817716644','济南');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016005,'张三','一班','男',19,'18817716655','北京');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016006,'小赵','一班','男',20,'18817716666','北京');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016007,'丽丽','二班','女',18,'18817716677','北京');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016008,'花花','一班','女',19,'18817716688','沈阳');INSERTINTOStudents (Id,Name,Class,Gender,Age,Phone,[Address])VALUES(2016009,'静静','二班','女',20,'18817716699','北京');-- 插入课程表基础数据INSERTINTOCourses(Name)VALUES('语文');INSERTINTOCourses(Name)VALUES('数学');INSERTINTOCourses(Name)VALUES('英语');-- 插入成绩表基础数据INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016001,1,120,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016001,2,70,0);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016001,3,89,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016002,1,90,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016002,2,88,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016002,3,96,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016003,1,112,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016003,3,102,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016004,1,80,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016004,2,86,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016004,3,47,0);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016005,1,87,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016005,2,96,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016005,3,68,0);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016006,2,95,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016006,3,100,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016007,1,87,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016007,2,57,0);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016007,3,130,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016008,1,89,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016008,3,66,0);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016009,1,97,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016009,2,104,1);INSERTINTOScores(SId,CId,Grades,IsPassed)VALUES(2016009,3,68,1);

简单查询

简单查询只需要SELECT、FROM、WHERE3个关键字即可实现。

SELECT *FROMStudents;SELECT *FROMStudentsWHEREClass='一班';SELECT *FROMStudentsWHEREClass='一班'ANDAge =20;

简单查询结果

别名/更名

语法

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

AS可以省略

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

示例

SELECTIdAS'学号',Name'姓名',ClassClassNameFROMStudents;

别名/更名

子查询(嵌套查询)

子查询也称嵌套查询,是指一个SELECT查询语句可以嵌入另一个SELECT查询语句之中。SQL中允许多级嵌套,子查询在实际使用中非常多。

连接查询:涉及两个及以上的表查询为连接查询。

--查询二班学生成绩SELECT *FROMScoresWHERESIdIN(SELECTIdFROMStudentsWHEREClass='二班')

子查询

聚合函数查询

聚合函数:是一个值的集合为输入,返回单个值的函数。

SQL预定义了5个聚集函数:AVG(平均值)、MIN(最小值)、MAX(最大值)、SUM(求和)、COUNT(计数)。

具体的数据库还会预定义一些其他常用的函数,比如字符串相聚合函数、时间聚合函数……。

SELECTAVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id)FROMStudents;

聚合函数查询

分组查询

使用GROUP BY子句可进行分组查询

注意:分组查询的时候要在GROUP BY子句后面跟上所有查询字段的列表

--根据班级分组查询各班平均年龄、最大 年龄、最小年龄、年龄总和、班级人数SELECTClass,AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id)FROMStudentsGROUPBYClass;

分组查询

HAVING子句

如果需要在分组前的数据进行限制,可以使用HAVING子句

HAVING子句只能与GROUP BY搭配使用

--根据班级分组查询各班平均年龄并且班级人数大于3人SELECTClass,AVG(Age)FROMStudentsGROUPBYClassHAVINGCOUNT(Id)>3;

HAVING子句

HAVING子句和WHERE的区别

WHERE语句在GROUP BY语句之前,SQL会在分组之前计算WHERE语句;

HAVING语句在GROUP BY语句之后,SQL会在分组之后计算HAVING语句。

模糊查询

语法

SELECT 字段列表FROM表名WHERE字段LIKE'<通配符>'

模糊查询是通过关键字LIKE和通配符实现的

_:任何单个字符(一个'_'只匹配一个字符,多个字符就使用多个_)

%:包含零个或更多字符的任意字符串(匹配任意内容)

[]:指定范围的字符(只匹配[]内的字符)

[ ^]:不在指定范围的字符(只匹配除[]内的字符)

SQL中通配符可以混合使用

单个字符匹配

SELECT *FROMStudentsWHERENameLIKE'小_';SELECT *FROMStudentsWHEREPhoneLIKE'188177166__';

模糊查询-单个字符匹配

任意字符匹配

SELECT *FROMStudentsWHEREPhoneLIKE'188177166__';SELECT *FROMStudentsWHEREPhoneLIKE'%';SELECT *FROMStudents;

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

模糊查询-任意匹配

范围内查询

-- 查询所有手机号码结尾两位包含1和2的信息SELECT *FROMStudentsWHEREPhoneLIKE'188177166[12][12]';

模糊查询-范围内查询

不在范围内查询

-- 查询所有手机号码结尾两位不包含1、3、5、7的信息SELECT *FROMStudentsWHEREPhoneLIKE'188177166[^1357][^1357]';

模糊查询-不在范围内查询

关于SQL查询就到这里告一段落,后面会更新相关内容。

如果你觉得有问题,欢迎和你一起探讨。

本文采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

基于简书上的作品创作。 可转载、引用,但需经本人同意后署名作者且注明文章出处,并以相同方式共享。

知识共享许可协议

关系数据库常用SQL语句语法大全 - 简书

seayxuwww.jianshu.com →

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

seayxuwww.jianshu.com →

MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建 - 简书

seayxuwww.jianshu.com →

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容