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 运算符 值

运算符:

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

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 子语句中把两个或多个条件结合起来。表示和的意思,多个条件都成立。

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

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

6、OR

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

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

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

7、IN

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

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

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

8、NOT 否定

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

1)查询非张姓氏的学习信息

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 值不包括在计算中。
  • MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。

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

SELECT MAX(Score) FROM Students

2 ) 查询学生中最小年龄

SELECT MIN(Age) FROM Students

13、SUM

查询某列的合计值。

1)查询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

作者:停留的风
文章源自:http://www.cnblogs.com/yank/p/3672478.html

SQL总结(一)基本查询相关推荐

  1. ylb:SQL 表的高级查询-多表连接和子查询

    ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...

  2. 【转】在SQL Server中通过SQL语句实现分页查询

    在SQL Server中通过SQL语句实现分页查询 2008年01月06日 星期日 12:28 建立表: CREATE TABLE [TestTable] ( [ID] [int] IDENTITY ...

  3. SQL里各种联合查询总结

    SQL里各种联合查询总结 create database mytest go  www.2cto.com   use mytest go create table t_dept ( d_id int ...

  4. SQL语法之排序查询(进阶3)and常见函数(进阶4)

    SQL语法体系学习笔记 SQL语法之基础查询(进阶1)and条件查询(进阶2) SQL语法之排序查询(进阶3)and常见函数(进阶4) SQL语法之分组函数,分组查询(进阶5)and连接查询(sql9 ...

  5. SQL语法之基础查询(进阶1)and条件查询(进阶2)

    SQL语法体系学习笔记 SQL语法之基础查询(进阶1)and条件查询(进阶2) SQL语法之排序查询(进阶3)and常见函数(进阶4) SQL语法之分组函数,分组查询(进阶5)and连接查询(sql9 ...

  6. 在 sql server 中,查询 数据库的大小 和 数据库中各表的大小

    2019独角兽企业重金招聘Python工程师标准>>> 在 sql server 中,查询 数据库的大小 和 数据库中各表的大小 其实本来只想找一个方法能查询一下 数据库 的大小,没 ...

  7. 利用SQL语言表达复杂查询

    这篇博客主要介绍一些复杂的sql查询,DDL和简单的sql部分这里不做介绍 先贴表结构: 出现在where子句中的select语句被称为子查询,子查询返回了一个集合,可以通过和这个集合的比较来确定另一 ...

  8. SQL 新加字段查询窗口报错

    SQL 新加字段查询窗口报错 这是由于SQL Server的intellisense的引起的,intellisense是SQL Server的智能记录智能感知功能,即当给sql表名加上".& ...

  9. SQL进阶,子查询与窗口函数

    本节给大家讲解SQL在实际过程中用途比较多的子查询与窗口函数,下面一起学习. 示例工具:MySQL8.0.Navicat Premium 12 本文讲解内容:子查询与窗口函数 适用范围:SQL进阶应用 ...

  10. sql语句提高数据库查询效率

    可以通过以下多个方面优化sql语句提高数据库查询效率 1. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2. 应尽量避免在 where 子 ...

最新文章

  1. 【剑指offer-Java版】27二叉搜索树与双向链表
  2. AI硬件碎片化难题,英特尔想用“一个API”解决,还推出新的编程语言DPC++
  3. Android开发者必须深入学习的10个应用开源项目
  4. 用python编写最简单的记事本_Python使用字典实现的简单记事本功能示例
  5. gblfy大数据技术之安装CentOS系列
  6. 中断函数 printf_嵌入式中断服务函数的一些特点
  7. ROS学习笔记三:创建ROS软件包
  8. AST语法结构树初学者完整教程
  9. Golang学习(10)——bufio包
  10. Python获取Redis所有Key以及内容
  11. 【剑指 offer】(二十一)—— 包含 min 函数的栈
  12. [云计算]VXLAN的网关划分
  13. PHP-FPM 设置多pool、配置文件重写
  14. 比赛计分软件部分界面抓图
  15. zabbix监控系统
  16. 目标检测:损失函数之SmoothL1Loss
  17. CCTM_FormElement 类
  18. 动手做一个小机器人——语音控制篇
  19. 生产用料清单-在制材料数量
  20. js 替换所有指定的字符串

热门文章

  1. Mysql存储过程(四)——异常处理
  2. 要想工作效率高,我们到底需要多少睡眠?
  3. 【对讲机的那点事】450MHz模拟无线列调的工作原理(连载五)
  4. linux安装tomcat Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
  5. 教你如何察觉出网络钓鱼电子邮件
  6. 英国电信云服务直连Salesforce
  7. 移动应用APP性能测试白皮书
  8. JavaScript DOM 6 - 节点的创建,插入,替换,删除
  9. 二十四种设计模式:访问者模式(Visitor Pattern)
  10. JAVA基础学习笔记(2)