码迷,mamicode.com
首页 > 数据库 > 详细

Net学习日记_SQL进阶_1

时间:2017-11-02 00:07:54      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:类型转换   查询   mat   pre   ror   筛选   个数   .class   div   

Case

在数据库中,对数据进行比对。

两种用法:

第一种,不对任何列进行case 条件判断。

SELECT 
Sid,English AS en,
CASE
WHEN English >= 60 THEN 及格
WHEN English <  60 THEN 不及格
END AS jige
FROM dbo.Score

从case开始:开始判断,判断什么?不知道。只有当when开始的时候才知道判断什么东西。

如果在判断一个列的值的时候,满足多个条件(when),先满足谁就执行谁

类似于c#中的 if else if else if else if else if else if else if.........else。。。。。。

SELECT 
Sid,English AS en,
CASE
WHEN English >60 THEN 英语及格
WHEN Math >60 THEN 数学及格
ELSE 都不及格
END AS jige
FROM dbo.Score

 

第二种,直接case列  值判断

SELECT 
CASE ptId
WHEN 1 THEN 家人
WHEN 2 THEN 同事
WHEN 3 THEN 同学
END
FROM dbo.PhoneType

从case开始,一开是就知道要判断ptid的值,如果这个值是1就输出”家人”。

相当于c#中的switch(age) case 。

 

例1:

SELECT id,Name,
(CASE Gender
WHEN 0 THEN 
WHEN 1 THEN 
END) AS Gender,Salary
 FROM dbo.Teacher

在结果集中,可以包含两个列,列名完全相同的,在数据库中这样是允许的。

在Ado中,如果我们习惯了用列名来取数据,这样就会出问题了,最终,会取出哪个数据呢?

可以将结果集改成自己需求的样子!!!

select id,Name,
(case Gender
when 1 then 
when 0 then 
end) as Gender,Salary
from dbo.Teacher

例2:

SELECT 
Sid,English AS en,
CASE
WHEN English >60 THEN 及格
WHEN English <60 THEN English
END AS jige
 FROM dbo.Score

说明:多个then后面的所有数据类型都必须相同.

SELECT 
Sid,English AS en,
CASE
WHEN English >60 THEN 及格
WHEN English <60 THEN CAST(English AS NVARCHAR(10))
END AS jige
FROM dbo.Score

如果多个then后面的数据类型不相同可以做数据类型转换.

 

子查询

在一个查询中,有另外一个查询,这个查询就叫做主查询的子查询。

SELECT * FROM dbo.Student WHERE CId = (SELECT id FROM dbo.Classes WHERE Name=四期班)

把小括号里面的查询的结果给cid,然后主查询继续执行

SELECT * FROM dbo.Student WHERE CId = (SELECT * FROM dbo.Classes WHERE Name=‘四期班‘)    有错误!!!!

Error:在选择列表中只能指定一个表达式。

小括号内的查询返回的是多个列,然后cid去看一下,就不知道到底是用哪一个列,然后就报错了。

 

一般子查询都是用在where条件后面的。

--要查出所有九期班以后的所有学员
--1.先查出所有九期班以后的班级,只取id
--2.根据id查找所有符合条件的学员
SELECT *  FROM dbo.Student WHERE CId IN (
SELECT id FROM dbo.Classes WHERE id>(
SELECT id FROM dbo.Classes WHERE Name =九期班
)
)

 

只有子查询返回的结果集是一行一列的才能当做值来用,才能用等值判断。

In 是判断一个值,是否在后面的所有值里面出现过。

Not in是判断一个值,是否在后面的所有值里面没有出现过。

 

Exists

SELECT * FROM dbo.Student WHERE EXISTS (SELECT * FROM dbo.Classes WHERE dbo.Classes.id=dbo.Student.CId)

SELECT * FROM dbo.PhoneNum WHERE EXISTS ( SELECT xxxx FROM dbo.PhoneType WHERE dbo.PhoneNum.pTypeId=dbo.PhoneType.ptId )

EXISTS是引用了主查询的数据进行子查询的一种方式,子查询中,只做条件判断,不做任何列的输出。

上式,exists里面包含着主键与副键的关系。

技术分享

 

分页查询

比较弱的查询方式

-- 查询第一页
select * from dbo.Area where ar_id<10
-- 查询第二行
select top 10 * from dbo.Area where ar_id not in(select top 10 ar_id from dbo.Area) 
-- 查询第三页
select top 10 * from dbo.Area where ar_id not in(select top 20 ar_id from dbo.Area)
-- 缺点:如果要取很多页以后的数据,那么就要去除前面很多很多页的id

第二种分页方式

select * from (
select *,row_Number() over(order by ar_id) as rows from dbo.Area ) as t
where t.rows between 1 and 10

技术分享

ROW_NUMBER() 会在结果集的基础上加上了一列,这一列从1开始,中间不会有间断的,然后配合between and使用,效率比较高。

加上这列并不在这结果集中,不能直接使用。

 

表连接Join

把两张表或多张表的数据行,按照指定的规则连接在一起。

--1:查询所有学生的姓名、年龄及所在班级
SELECT dbo.Student.Name,Age,dbo.Classes.Name FROM dbo.Student
JOIN dbo.Classes ON dbo.Classes.id=Student.CId

Join 连击多张表的数据时,会筛选要满足所有连接条件的数据才会留下来,其中任何一个条件不满足都不会出现数据。

LEFT JOIN

--4:查询所有学生(参加及未参加考试的都算)及成绩
SELECT * FROM dbo.Student
LEFT JOIN dbo.Score ON dbo.Student.id =dbo.Score.Sid

left join在普通的join基础上,优先显示左边的表的数据。(我把Student和Score联合,Student为左,Score为右。)

如果能满足连接条件,就显示连接之后的右表的数据;如果不满足连接条件,还是会显示左表数据,右表数据部分就是null(不知道)。

Right Join

在普通join的基础上,优先显示右表的数据。

如连接条件满足,就显示左表的数据,如果不满足就显示为null。

--5:请查询出所有没有参加考试
SELECT * FROM dbo.Student WHERE
 id NOT IN ( 
 SELECT dbo.Student.id 
 FROM dbo.Student 
 RIGHT JOIN dbo.Score ON dbo.Student.id = dbo.Score.Sid 
 WHERE dbo.Student.id IS NOT NULL
 )

Join配合子查询。INNER JOIN其实就是join,我们在用join的时候,系统就默认识别为innerjoin了。

CROSS JOIN会得出两张表的乘积行。

技术分享

 

视图

视图其实就是一个虚拟表,这张虚拟表的数据,其实是来自于一个查询,这个查询是查询了其他一个或者多个表的数据。

 

Net学习日记_SQL进阶_1

标签:类型转换   查询   mat   pre   ror   筛选   个数   .class   div   

原文地址:http://www.cnblogs.com/lisong-home/p/7768932.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!