SQL总结(一)基本查询

作者:停留的风
原文地址:http://www.cnblogs.com/yank/p/3672478.html

SQL查询的事情很简单,但是常常因为很简单的事情而出错。遇到一些比较复杂的查询我们更是忘记了SQL查询的基本语法。

本文希望通过简单的总结,把常用的查询方法予以总结,希望能够明确在心。

场景:学生信息系统,包括学生信息、教师信息、专业信息和选课信息。

--学生信息表
IF OBJECT_ID (N'Students', N'U') IS NOT NULL
    DROP TABLE Students;
GO
CREATE TABLE Students(
    ID int primary key not null,
    Name nvarchar(50),
    Age int,
    City nvarchar(50),
    MajorID int
)


--专业信息表
IF OBJECT_ID (N'Majors', N'U') IS NOT NULL
    DROP TABLE Majors;
GO
CREATE TABLE Majors(
    ID int primary key not null,
    Name nvarchar(50)
)

--课程表
IF OBJECT_ID (N'Courses', N'U') IS NOT NULL
    DROP TABLE Courses;
GO
CREATE TABLE Courses(
    ID int primary key not null,
    Name nvarchar(50) not null
)

IF OBJECT_ID (N'SC', N'U') IS NOT NULL
    DROP TABLE SC;
GO
--选课表
CREATE TABLE SC(
    StudentID int not null,
    CourseID int not null,
    Score int    
)

1、基本查询

从表中查询某些列的值,这是最基本的查询语句。

SELECT 列名1,列名2 FROM 表名

2、Where(条件)

  • 作用:按照一定的条件查询数据。
  • 语法:
SELECT 列名1,列名2 FROM 表名 WHERE 列名1 运算符 值
  • 运算符:

比较操作符都比较简单,不再赘述。关于BETWEENLIKE,专门拿出来重点说下。

3、BETWEEN

在两个值之间,比如我从学生中查询年龄在18-20之间的学生信息:

SELECT ID,Name,Age FROM Students WHERE Age BETWEEN 18 AND 20

4、LIKE

  • 作用:模糊查询。LIKE关键字与通配符一起使用。
  • 主要的通配符:
  • 实例:

1).查询姓氏为张的学生信息:

SELECT ID,Name FROM Students WHERE Name LIKE '张%'

2).查询名字最后一个为“生”的同学:

SELECT ID,Name FROM Students WHERE Name LIKE '%生'

3).查询名字中含有“生”的学生信息:

SELECT ID,Name FROM Students WHERE Name LIKE '%生%'

4).查询姓名为两个字,且姓张学生信息:

SELECT ID,Name FROM Students WHERE Name LIKE '张_'

5).查询姓氏为张、李的学生信息:

这个可以使用or关键字,但是使用通配符更简单高效。

SELECT ID,Name FROM Students WHERE Name LIKE '[张李]%'

6).查询姓氏非张、李的学生信息:

这个也可以使用NOT LIKE来实现,用下面方法更好。

SELECT ID,Name FROM Students WHERE Name LIKE '[^张李]%'

或者:

SELECT ID,Name FROM Students WHERE Name LIKE '[!张李]%'

5、AND

AND在 WHERE 子语句中把两个或多个条件结合起来。表示和的意思,多个条件都成立。

查询年龄大于18且姓张的学生信息:

SELECT ID,Name FROM Students WHERE Age>18 AND Name LIKE '张%'

**6、OR **

OR可在 WHERE 子语句中把两个或多个条件结合起来。或关系,表示多个条件,只有一个符合即可。

查询姓氏为张、李的学生信息:

SELECT ID,Name FROM Students WHERE Name LIKE '张%' OR Name LIKE '李%'

7、IN

IN操作符允许我们在 WHERE 子句中规定多个值。表示:在哪些值当中。

查询年龄是18、19、20的学生信息:

SELECT ID,Name FROM Students WHERE Age IN (18,19,20)

8、NOT 否定

NOT对于条件的否定,取非。

查询非张姓氏的学习信息:

SELECT ID,Name FROM Students WHERE Name NOT LIKE '张%'

9、ORDER BY(排序)

  • 功能:对需要查询后的结果集进行排序。
  • 实例:

1).查询学生信息表的学号、姓名、年龄,并按Age升序排列:

SELECT ID,Name,Age FROM Students ORDER BY Age

或指明ASC:

SELECT ID,Name,Age FROM Students ORDER BY Age ASC

2).查询学生信息,并按Age倒序排列:

SELECT ID,Name,Age FROM Students ORDER BY Age DESC

除了制定某个列排序外,还能指定多列排序,每个排序字段可以制定排序规则。

说明:优先第一列排序,如果第一列相同,则按照第二列排序规则执行,以此类推。

3).查询学生的信息,按照总成绩倒序、学号升序排列:

SELECT ID,Name,Score FROM Students ORDER BY Score DESC,ID ASC

这个查询含义:首先按Score倒序排列,如果有多条记录Score相同,再按ID升序排列。

查询结果,例子:

10、AS(Alias)

可以为列名称和表名称指定别名(Alias)

作用:我们可以将查询的列,或者表指定需要的名字,如表名太长,用其简称,在连表查询中经常用到。

1).将结果列改为需要的名称:

SELECT ID AS StudentID,Name AS StudentName FROM Students

2).用表名的别名,标识列的来源:

SELECT S.ID,S.Name,M.Name AS MajorName 
FROM Students AS S 
LEFT JOIN Majors AS M
ON S.MajorID = M.ID

3).在合计函数中,给合计结果命名:

SELECT COUNT(ID) AS StudentCount FROM Students

11、Distinct

  • 含义:不同的
  • 作用:查询时忽略重复值。
  • 语法:
SELECT DISTINCT 列名称 FROM 表名称
  • 实例:

1).查询学生所在城市名,排除重复:

SELECT DISTINCT City FROM Student

2).查询成绩分布分布情况:

SELECT DISTINCT(Score),Count(ID) FROM Student GROUP BY Score

学生成绩可能重复,以此得到分数、得到这一成绩的学生数。后续会详细介绍GROUP BY用法。

12、MAX/MIN

  • MAX函数返回一列中的最大值。NULL值不包括在计算中。
  • MIN函数返回一列中的最小值。NULL值不包括在计算中。
  • MINMAX也可用于文本列,以获得按字母顺序排列的最高或最低值。

1).查询学生中最高的分数:

SELECT MAX(Score) FROM Students

2).查询学生中最小年龄:

SELECT MIN(Age) FROM Students

13、SUM

查询某列的合计值。

查询ID为1001的学生的各科总成绩:

SC即为学生的成绩表,字段:StudentIDCourseIDScore.

SELECT SUM(Score) AS TotalScore FROM SC WHERE StudentID='1001' 

14、AVG

AVG函数返回数值列的平均值。

1).查询学生的平均年龄:

SELECT AVG(Age) AS AgeAverage FROM Students

2).求课程ID为C001的平均成绩:

SELECT AVG(Score) FROM SC WHERE CourseID='C001'

15、COUNT

COUNT()函数返回匹配指定条件的行数。

1).查询学生总数:

SELECT COUNT(ID) FROM Students

2).查询学生年龄分布的总数:

SELECT COUNT(DISTINCT Age) FROM Students

3).查询男生总数:

SELECT COUNT(ID) FROM Students WHERE Sex='男'

4).查询男女生各有多少人:

SELECT Sex,COUNT(ID) FROM Students GROUP BY Sex

16、GROUP BY

GROUP BY语句用于结合合计函数,根据一个或多个列对结果集进行分组。

1).查询男女生分布,上面已经给了答案:

SELECT Sex,COUNT(ID) FROM Students GROUP BY Sex

2).查询学生的城市分布情况:

SELECT City,COUNT(ID) FROM Students GROUP BY City

3).学生的平均成绩,查询结果包括:学生ID,平均成绩:

SELECT StudentID,AVG(Score) FROM SC GROUP BY StudentID

4).删除学生信息中重复记录:

根据列进行分组,如果全部列相同才定义为重复,则就需要GROUP BY所有字段。否则可按指定字段进行处理。

DELETE FROM Students WHERE ID NOT IN (SELECT MAX(ID) FROM Students GROUP BY ID,Name,Age,Sex,City,MajorID)

17、HAVING

在 SQL 中增加HAVING子句原因是,WHERE关键字无法与合计函数一起使用。

语法:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

1).查询平均成绩大等于于60的学生ID及平均成绩:

SELECT StudentID,AVG(Score) FROM SC GROUP BY StudentID HAVING AVG(Score)>=60

2).还是用HAVING的SQL语句中,可以有普通的WHERE条件

查询平均成绩大于等于60,且学生ID等于1的学生的ID及平均成绩:

SELECT StudentID,AVG(Score) FROM SC 
WHERE StudentID='1' 
GROUP BY StudentID 
HAVING AVG(Score)>=60

3).查询总成绩在600分以上(包括600)的学生ID:

SELECT StudentID FROM SC GROUP BY StudentID HAVING SUM(Score)>=600

18、TOP

TOP子句用于规定要返回的记录的数目。对于大数据很有用的,在分页时也会常常用到。

1).查询年龄最大的三名学生信息:

SELECT TOP 3 ID,Name FROM Students ORDER BY Age DESC

2).还是上一道题,如果有相同年龄的如何处理呢:

SELECT ID,Name,Age FROM Students WHERE Age IN (SELECT TOP 3 Age FROM Students)

19、Case语句

计算条件列表,并返回多个可能的结果表达式之一。

CASE表达式有两种格式:

  • CASE简单表达式,它通过将表达式与一组简单的表达式进行比较来确定结果。

  • CASE搜索表达式,它通过计算一组布尔表达式来确定结果。

  • 简单表达式语法:

CASE input_expression 
     WHEN when_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END 
  • 搜索式语法:
CASE
     WHEN Boolean_expression THEN result_expression [ ...n ] 
     [ ELSE else_result_expression ] 
END

1).查询学习信息,如果Sex为0则显示为男,如果为1显示为女,其他显示为其他:

SELECT ID, Name, CASE Sex WHEN '0' THEN '男' WHEN '1' THEN '女' ELSE '其他' END AS Sex
FROM Students

2).查询学生信息,根据年龄统计是否成年,大于等于18为成年,小于18为未成年:

SELECT ID, Name, CASE WHEN Age>=18 THEN '成年' ELSE '未成年'END AS 是否成年
FROM Students

3).统计成年未成年学生的个数:

要求结果

SQL语句:

SELECT SUM(CASE WHEN Age>=18 THEN  1 ELSE 0 END) AS '成年',SUM(CASE WHEN Age<18 THEN  1 ELSE 0 END) AS '未成年'
FROM Students

4).行列转换。统计男女生中未成年、成年的人数:

结果如下:

SQL语句:

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,504评论 18 399
  • SQL语言基础 本章,我们将会重点探讨SQL语言基础,学习用SQL进行数据库的基本数据查询操作。另外请注意本章的S...
    厲铆兄阅读 5,287评论 2 46
  • 女人年近百半 应该什么样子?什么身材? 是“大腹”婆,还是跟更年期在斗争? 今天介绍的女主 今年已经是47岁的女人...
    因为咸啊阅读 364评论 0 0
  • 前面两篇文章简单介绍了一下Masonry的属性及方法,那么我们这一篇做一个小Demo加深一下练习。我们就仿照做一个...
    南方_H阅读 1,231评论 6 9
  • 余初生之年,天朝尚疲力,东拒红俄,西绝鞑虏,然民风朴素,文化单纯,神州大地,红旗招展,吾辈自诩为:红旗下的蛋。 求...
    达耳闻阅读 244评论 0 3