--数据库高级子句一
--今天的内容主要有Top Like In Between As Join InnerJoin LeftJoin RightJoin FullJoin Union
--------------------------------------------------------
--Top
--Top 子句用来截取要返回的数目,如果查询出的数据有成千上百条,那么Top就很有用了,
--可以只取读取结果的前几条,
--select top number|percent 列名 from 表名
use TSqlDemo
select top 3 * from Student --这样取出来的数据是查询结果集的前3行
select top 50 percent * from Student --这样取出来的数据时结果集的50%,如果总共有5条,那么取3条
---------------------------------------------------------
--Like
--Like操作符用用于查询时条件的模式。
select * from Student where Name like '%花'--%是指缺少的字母,%花指的是最后一位是花的人
--n%n指的是第一位和第二位是n的人,%n%指的是中间有n的人
----------------------------------------------------------
--通配符
--%这种符号被称为通配符,在数据库中可以代替一个或多个字符,必须与like一起使用
--%代替一个或多个字符
--_仅代替一个字符
--[N]字符列中的任何单一字符。[a]%代表以a为第一个字母的字符串
--[!N][^N]代表不在字符列中的单一字符.[!a]%代表不以a为第一个字母的字符串
--这些通配符都与Like子句做为Like子句的条件使用
-----------------------------------------------------------
--In
--In顾名思义就是在...中的,在sql语句中用来筛选多个数据
select * from Student where Name in('小花','小荷花')
--In后面要加一个括号,在括号中我们可以指定我们要选择的对象,可以是多个,可以是1个
--对象之间用‘,‘隔开,这样我们就将Name与括号中的多个数据相比较,只要符合其中一个就可以
-----------------------------------------------------------
--between and
--between在where后使用,用于选择在二者之间的数据,可以是数字和字符
select * from Student where Age between 20 and 21--年龄在20和21之间的人,包括20和21
select * from Student where Age not between 20 and 21 --年龄不在20和21之间的人,查询结果中没有20和21
-----------------------------------------------------------
--As
--As可以为表或者列指定名称,只是将显示的名称换了,并没有将数据库中字段的名称真正的换掉
select Name as '名称' from Student
--这样查询出来的结果Name的列头被换为名称,更直观。方便程序
-----------------------------------------------------------
--Join
--Join方便我们从更多的表格中得到结果,有时一张表格满足不了我们的需求,这时候需要用到Join
--现在我们再建一个成绩表,在成绩表中有每个人的学号还有他们的成绩,在学生表中的学号这一列是主键,是不会重复的
--成绩表中的SNum和Student表中的Num是一个字段,他们将2张表联系起来,这样即使姓名相同,学号也可以区分他们
--现在我们想要知道谁考了多少分,就需要从查询成绩表,然后去学生表拿名字
select Student.Name,Score.Math from Score,Student where Student.Num=Score.SNum
--这是第一种方法,我们可用通过多表的结合查询,下面用join的方法
select Student.Name,Score.Math from Score inner join Student on Student.Num=Score.SNum
--inner join on 需要注意的是from后面的表名和inner join后面的表名不能相同
--on后面是我们关联查询的查询依据,在on的后面我们同样可以查询条件的字句,
select Student.Name,Score.Math from Score inner join Student on Student.Num=Score.SNum where Math >90 order by Score.Math desc
--where 一定要在order by 的前面
------------------------------------------------------------
--Join还有几个相似的查询,如left join InnerJoin LeftJoin RightJoin FullJoin
--上面我们所做的例子是Inner join ,下面我们看看他们的不同
--inner join: 表中有一个匹配项时,显示行
--left join: 即使右表中没有匹配,也返回左表的所有的行
--right join: 即使左表中没有匹配,也返回右表的所有的行
--full join: 只要其中一个表中存在匹配,就返回所有表的行
--下面我们做实验来测试这几种join
select Student.Name,Score.Math from Student left join Score on Student.Num=Score.SNum
--返回的结果是,他把学生表里的全部数据都返回的,如果没有score的则显示未NULL
select Student.Name,Score.Math from Student right join Score on Student.Num=Score.SNum
--返回的结果是,他把成绩表中所有的数据都返回了,如果在学生表里没有,则在Name处显示null,当然我们之前做过外键
--所以在成绩表中的人必须在学生表里存在,大家可以去掉外键之后试试
select Student.Name,Score.Math from Student full join Score on Student.Num=Score.SNum
--full顾名思义就是全部,不管你们有没有匹配我全都给你返回
-------------------------------------------------------------
--union
--union可以将查询出的2张表结合在一起,但是前提是他们的查询语句必须一样
--查询出的结果必须一样,行数必须一样,就是2张一样的表不同的就是数据,
--表的结构必须吻合,这样才可以合并在一起
select * from Student
union
select * from Score
--------------------------------------------------------------
--好了,今天的任务结束了,明天继续