SQL总结(一)基本查询
SQL总结(一)基本查询
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 | 搜索某种模式 |
比较操作符都比较简单,不再赘述。关于BETWEEN和LIKE,专门拿出来重点说下
3、BETWEEN
在两个值之间,比如我从学生中查询年龄在18-20之间的学生信息
SELECT ID,Name,Age FROM Students WHERE Age BETWEEN 18 AND 20
4、LIKE
作用:模糊查询。LIKE关键字与通配符一起使用
主要的通配符:
通配符 |
描述 |
% |
替代一个或多个字符 |
_ |
仅替代一个字符 |
[charlist] |
字符列中的任何单一字符 |
[^charlist] 或者 [!charlist] |
不在字符列中的任何单一字符 |
实例:
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(排序)
功能:对需要查询后的结果集进行排序
标识 | 含义 | 说明 |
ASC | 升序 | 默认 |
DESC | 倒序 |
实例:
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升序排列。
查询结果,例子:
ID |
Name |
Score |
2 |
广坤 |
98 |
3 |
老七 |
98 |
1 |
赵四 |
79 |
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即为学生的成绩表,字段:StudentID,CourseID,Score.
SELECT SUM(Score) AS TotalScore FROM SC WHERE StudentID=''
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=''
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 '' THEN '男' WHEN '' THEN '女' ELSE '其他' END AS Sex
FROM Students
2)查询学生信息,根据年龄统计是否成年,大于等于18为成年,小于18为未成年
SELECT ID, Name, CASE WHEN Age>=18 THEN '成年' ELSE '未成年'END AS 是否成年
FROM Students
3)统计成年未成年学生的个数
要求结果
成年 | 未成年 |
23 | 6 |
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)行列转换。统计男女生中未成年、成年的人数
结果如下:
性别 | 未成年 | 成年 |
男 | 3 | 13 |
女 | 2 | 18 |
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
SQL总结(一)基本查询的更多相关文章
- SQL多表连接查询
SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...
- 【SQL】Oracle分页查询的三种方法
[SQL]Oracle分页查询的三种方法 采用伪列 rownum 查询前10条记录 ? 1 2 3 4 5 6 7 8 9 10 11 [sql] select * from t_user t whe ...
- C# ADO.NET (sql语句连接方式)(查询)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- [.NET] SQL数据总笔数查询
[.NET] SQL数据总笔数查询 程序下载 范例下载:点此下载 原始码下载:点此下载 NuGet封装:点此下载 数据查询 开发系统时,使用C#执行SQL查询指令,就可以从SQL数据库里查询所需数据. ...
- 图解SQL多表关联查询
图解SQL多表关联查询 网上看了篇文章关于多表连接的,感觉很好,记录下来,以便日后自己学习 内连接 左连接 右连接 全外连接 1. 查两表关联列相等的数据 ...
- 【转】SQL Server T-SQL高级查询
SQL Server T-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student; //查询student ...
- SQL编程之高级查询(子查询)以及注意事项
SQL编程之高级查询(子查询)以及注意事项 1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命 ...
- T-SQL:SQL Server-数据库查询语句基本查询
ylbtech-SQL Server-Basic:SQL Server-数据库查询语句基本查询 SQL Server 数据库查询语句基本查询. 1,数据库查询语句基本查询 数据库 SQL Serv ...
- sql之独立子查询和相关子查询总结
1.独立子查询:顾名思义:就是子查询和外层查询不存在任何联系,是独立于外层查询的: 下面就看一个例子: 有一张订单表 Sales.Order 和一张 客户表 Sales.Customer 下面的sql ...
- 【转】PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
[转]PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理 只要有人用了: select t.* from ...
随机推荐
- <select>的下拉样式
今天做一个专题,其中,select标签的样式要做成下图的模样,但是默认情况是下下图的模样: 如何实现呢,实现的办法竟然比我想象中的简单好多: select{ border: solid 1px #00 ...
- Apriori原理与实践
Apriori: 其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集.经典的关联规则数据挖掘算法Apriori 算法广泛应用于各种领域,通过对数据的关联性进行了分析和挖掘,挖掘出的这 ...
- Sqlserver2012 中文乱码解决
1.在Windows Azure的数据库中,如果选择默认字符编码,那么在创建表字段是,字符串类型应该为nvarchar,如果是varchar将会出现乱码,同样的的在sql语句中生命变量,也是需要将字符 ...
- SSH原理与运用
SSH是每一台Linux电脑的标准配置. 随着Linux设备从电脑逐渐扩展到手机.外设和家用电器,SSH的使用范围也越来越广.不仅程序员离不开它,很多普通用户也每天使用. SSH具备多种功能,可以用于 ...
- mysql分组查询取分组后各分组中的最新一条记录
SELECT * FROM ( SELECT * FROM `CFG_LOGIN_LOG` ORDER BY LOGTIME DESC ) test GROUP BY login_name DESC
- row_number() OVER(PARTITION BY)函数介绍
OVER(PARTITION BY)函数介绍 开窗函数 Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个 ...
- iOS开发UI篇—从代码的逐步优化看MVC
iOS开发UI篇—从代码的逐步优化看MVC 一.要求 要求完成下面一个小的应用程序. 二.一步步对代码进行优化 注意:在开发过程中,优化的过程是一步一步进行的.(如果一个人要吃五个包子才能吃饱,那么他 ...
- SqlServer索引及优化详解
实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index ...
- sprintf函数
sprintf函数用法举例 #include<stdio.h> int main() { //1.连接字符串 char a1[] = {'A', 'B', 'C', 'D', 'E', ' ...
- hdu 1057 (simulation, use sentinel to avoid boudary testing, use swap trick to avoid extra copy.) 分类: hdoj 2015-06-19 11:58 25人阅读 评论(0) 收藏
use sentinel to avoid boudary testing, use swap trick to avoid extra copy. original version #include ...