T-SQL之数据操作(二):查

本文参考自: 原文地址

(前一章介绍了T-SQL数据操作中的增删改操作,这一章将会介绍数据操作中的查询操作。)

查询操作

查询语句是在做项目中使用次数最多的数据操作语句,其主要为SELECT语句

基础查询语法格式:

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

1、通用的查询方式:

SELECT * 
 FROM Student
GO
--代码说明:查询Student表中的所有数据列,得到的数据集可能及其庞大,因此不太常用

2、简略的查询方式

SELECT stu_Id,stu_Name,stu_Gender,stu_Age
 FROM Student
GO
--代码说明:查询Student表中的部分数据列,相对的查询到的数据量有一定的减少
--补充知识:

--对于只查询数据表中的部分信息时,有时会看到许多重复的信息,这是因为SQL默认会显示所有的满足条件的信息,若不想要重复的数据可以使用DISTINCT关键字来实现

--代码展示
SELECT ALL stu_Gender
 FROM Student
GO
--代码说明:显示所有满足条件的信息(默认不删除重复项)

SELECT DISTINCT stu_Gender
 FROM Student
GO
--代码说明:显示满足条件的信息(删除重复项)

3、where指定条件查询方式

SELECT * 
 FROM Student
 WHERE stu_Id = 101
GO
--代码说明:在Student表中查询学号为101的学生的全部信息

SELECT stu_Name,stu_Gender
 FROM Student
 WHERE stu_Id = 101
GO
--代码说明:在Student表中查询学号为101的学生的部分信息
--补充信息
--WHERE语句的使用方法
where语句是一个条件判断语句,只会对满足where语句条件的数据进行数据操作
(1)、单关系条件的where语句
1)常在where语句中使用条件判断符号:
<(小于)、>(大于)、(>=)不小于、(<=)不大于、=(等于)、(!=、<>)(不等于)
2)空值条件判断
使用 IS NULL 或 IS NOT NULL
(2)、多关系条件的where语句
1)常在where中使用到的逻辑符号:
AND、OR、NOT
2)between...and...条件判断
使用between and 语句执行的效率要优于实现相同功能的逻辑条件语句
3)属性域的判断条件
IN关键字指定属性的值域
--示例代码:
SELECT *
 FROM Student
 WHERE stu_age < 5
GO
--代码说明:查询表中年龄小于5的学生的所有信息

SELECT * 
 FROM Student
 WHERE stu_age > 5
GO
--代码说明:查询表中年龄大于5的学生的所有信息

SELECT *
 FROM Student
 WHERE stu_age <= 5
GO
--代码说明:查询年龄小于等于5的学生的所有信息

SELECT * 
 FROM Student
 WHERE stu_age >= 5
GO
--代码说明:查询年龄大于等于5的学生的所有信息

SELECT *
 FROM Student 
  WHERE stu_age = 1
GO
--代码说明:查询年龄等于1的学生的所有信息

SELECT * 
 FROM Student 
 WHERE stu_age <> 5
GO
--代码说明:查询年龄不等于5的学生的所有信息

SELECT *
 FROM Student
 WHERE stu_age != 5
GO
--代码说明:查询年龄不等于5的学生的所有信息

SELECT *
 FROM Student 
 WHERE stu_age IS NULL
GO
--代码说明:查询表中学生的年龄为NULL的学生的所有信息

SELECT *
 FROM Student 
 WHERE stu_age IS NOT NULL
GO
--代码说明:查询表中学生年龄不为NULL的学生的所有信息

SELECT *
 FROM Student
  WHERE stu_age <> 5 AND stu_Id = 101
GO
--代码说明:查询表中学生年龄不为5并且学号为101的学生的所有信息

SELECT *
 FROM Student
 WHERE stu_age <> 5 OR stu_Id = 101
GO
--代码说明:查询表中学生年龄不为5或者学号为101的学生的所有信息

SELECT *
 FROM Student 
 WHERE not stu_age = 5
GO
--代码说明:查询表中学生年龄不满足年龄为5条件的学生的所有信息

SELECT *
 FROM Student
 WHERE stu_age BETWEEN 0 AND 20
GO
--代码说明:查询表中学生年龄在0-20之间(包含0和20)学生的所有的信息

SELECT *
 FROM Student
 WHERE stu_age IN(1,2,5)
GO
--代码说明:查询表中学生年龄为1或2或5学生的所有信息
--注:域值的数据类型必须与属性的数据类型一致

--注意:
--1、关系判断条件默认将会自动屏蔽掉查询条件值为NULL的数据信息

4、有序查询方式

SELECT * 
 FROM Student 
 WHERE stu_age <> 5
 ORDER BY stu_age
GO
--代码说明:将查询到的学生信息安默认排序规则进行排序(正序)

SELECT *
 FROM Student
 WHERE stu_age <> 5
 ORDER BY stu_age DESC
GO
--代码说明:将查询到的学生信息按倒序规则进行排序

SELECT *
 FROM Student
 WHERE stu_age <> 5
 ORDER BY stu_age ASC
 --代码说明:将查询到的学生信息按正序规则进行排序

5、模糊查询方式

模糊查询就是查询的条件和查询的结果可以不完全匹配
常使用的通配符:
_:表示一个占位符,可以任何字符
%:表示零个或多个占位符,可以是任何字符
[]:表示只要满足中括号内一个字符就可以

[^]:表示不包含中括号内的任意一个字符

SELECT *
 FROM Student
 WHERE stu_Name LIKE N'%刘%'
GO
--代码说明:查询学生信息数据表中所有学生姓名中含有刘的学生信息

SELECT *
 FROM Student
 WHERE stu_Id LIKE '10_'
GO
--代码说明:查询学生信息表中学号以10开头的学生的信息

SELECT *
 FROM Student
 WHERE stu_Id LIKE '10[1-2]'
GO
--代码说明:查询学生信息表中学号为101或102的学生的信息

SELECT *
 FROM Student
 WHERE stu_Id LIKE '10[^1-2]'
GO
--代码说明:查询学生数据表中学号不为101或102的学生的信息

--注意:
--当查询的数据中含有通配符时的处理办法
方式一:将数据中的"通配符"放到[]中
SELECT * 
 FROM Student
 WHERE stu_Name LIKE '%[%]%'
GO
--代码说明:查询姓名中含有%号的学生信息

SELECT *
 FROM Student
 WHERE stu_Name LIKE '%[_]%'
GO
--代码说明:查询姓名中含有_的学生信息

SELECT *
 FROM Student 
 WHERE stu_Name LIKE '%[[]%'
GO
--代码说明:查询姓名中含有【的学生信息

SELECT *
 FROM Student 
 WHERE stu_Name LIKE '%[]]%'
GO
--代码说明:查询姓名中含有】的学生信息

SELECT * 
 FROM Student 
 WHERE stu_Name LIKE '%^%'
GO
--代码说明:查询姓名中含有^的学生信息
-^不用放到[]中,因为只有当^位于[]中才是通配符

方式二:
使用ESCAPE关键字来定义一个转义符

SELECT * 
 FROM Student 
 WHERE stu_Name LIKE '%\%%' ESCAPE '\'
GO
--代码说明:定义\为转义字符

6、分组查询方式:

 SELECT stu_gender AS 性别, AVG(stu_Age) 
  FROM Student
  GROUP BY stu_gender
GO
--代码说明:按性别将表中的学生分类
--AS :为查询的列定义一个别名
--AVG:计算一组中学生的平均年龄(聚合函数)

--补充信息:

1)、为查询列定义别名的方式:
方式一:
SELECT stu_gender AS 性别
 FROM Student

方式二:
SELECT stu_gender 性别
 FROM Student

 方式三:
 SELECT 性别=stu_gender
  FROM Student

2)、聚合函数:
	经常使用的聚合函数有:
	MAX():得到数据中的最大值;
	MIN():得到数据中的最小值 
	COUNT():得到数据的条数
	SUM():得到整性数据的和(必须为整形)
	AVG():得到数值类型数据的平均数

示例代码:
SELECT MAX(stu_Age) AS 最大值
 FROM Student
GO 

SELECT MIN(stu_Age) AS 最小值
 FROM Student
GO

SELECT COUNT(*) AS 总数
 FROM Student
GO

SELECT SUM(stu_Age) AS 求和
 FROM Student
GO

SELECT AVG(stu_Age) AS 求平均s
 FROM Student
GO

--注意:
--1、在MIN() MAX() AVG() SUN 中会自动屏蔽掉NULL值,,但是在COUNT()中不会屏蔽掉NULL

7、分组过滤查询方式

使用having语句来过滤不符合条件的分组信息

SELECT stu_Gender AS 性别,AVG(stu_Age)
 FROM Student
 GROUP BY stu_Gender
 HAVING stu_Gender IS NOT NULL
GO
--代码说明:先按性别对学生进行分组,剔除性别为NULL的分组,最后求各个分组年龄的平均值

--注意:
--1、where子句用在from语句后,having子句用在group by语句后;where语句是对整个表进行筛选,而having是对分组进行筛选
--2、having子句中可以使用统计函数,而where子句中不能使用;group by子句中也不能使用统计函数,必须是原始列
--3、必须在group by子句中列出select查询字段中所有的非集合字段

8、连接查询方式

当两个或多个表中的数据存在联系时(外键关系),对数据的查询操作可能需要将两个数据表根据外键关系连接起来再进行查询操作

方式一:在where语句中通过外键将两个数据表连接起来
SELECT stuName,cName,score
 FROM Course,Score,Student
 WHERE Score.stuId = Student.stuId AND Score.cId = Course.cId
GO
--代码说明:where子句执行之后,将Course,Score,Student这三个数据表连接依据外键关系进行连接操作,创建一个新的临时表(含有三个表所有信息)
--			from子句指定查询数据所在的数据表
--			select子句将要查询展示的列名,当列名在多个表中都存在时,必须要指定查询哪个表中的列(若为某个表所特有的可以不加)

方式二:使用JOIN子句进行连接查询
SELECT stuName,cName,score
 FROM Score
 JOIN Student ON Score.stuId = Student.stuId
 JOIN Course ON Score.cId = Course.cId
GO
--代码说明:SELECT子句指示将要显示的信息
--			from子句要进行连接的一个子表
--			(inner)join子句进行两个表之间的链接只有满足条件的记录才会被保留

--注:1、使用JOIN子句进行数据表的链接时,一次只能链接两张表
--	  2、INNER JOIN子句:内连接,只有满足条件的记录才会被保留
--		 LEFT JOIN子句:左连接,保留左表中的全部数据记录
--		 RIGHT JOIN子句:右连接,保留右表中的全部数据记录
--		 FULL JOIN子句:只要其中一个表中存在匹配就返回行
--		 CROSS JOIN子句:返回笛卡尔积
                  方式一结果        方式二结果 

9、联合查询方式

联合查询将查询到的多张表的结果联合到一张表中

SELECT * 
 FROM Student
 UNION ALL
 SELECT * 
 FROM Student
GO
--代码说明:select子句查询表的数据信息
--	        union子句进行结果的联合,(ALL显示全部的信息,默认是去除重复记录)

--注:连接两个结果集的条件
--1.	两个集合必须具有相同的列数
--2.	列具有相同的数据类型(至少能隐式转换的)
--3.	最终输出的集合的列名由第一个集合的列名来确定
--4.	使用的默认的排序规则对得到的结果进行排序(若要手动进行排序则将order by子句写入第二个select子句中)

结果展示:


附录:

数据表信息展示:

多表查询之后的数据表信息





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值