首页 / 更多教程 / Net学习日记_SQL进阶_1
Net学习日记_SQL进阶_1
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Net学习日记_SQL进阶_1,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4862字,纯文字阅读大概需要7分钟。
内容图文
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
内容总结
以上是互联网集市为您收集整理的Net学习日记_SQL进阶_1全部内容,希望文章能够帮你解决Net学习日记_SQL进阶_1所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。