一 SQL语句中可能会涉及到的表格:

StudentInfo:

PersonInfo:

Test_outjoin:

Test2_outjoin:

二 基本的sql语法
if exists(select * from dbo.sysobjects where name='StudentInfo')--查询数据库中存在的视图如果存在此表就删除 drop table StudentInfo go create table StudentInfo ( id int identity(20140001,1),--按步长为1进行增长 name nvarchar(20), Chinese float, Math float, English float, address nvarchar(20), tel nvarchar(20), EnTime datetime ) ---------------------在表中插入相关的数据 insert StudentInfo values('张三丰',50.5,69.3,90.4,'山东','47356454','2014-01-09 00:00:00') insert StudentInfo values('李小飞',80.5,39.3,90.4,'河北','47344454','2014-01-09 00:00:00') insert StudentInfo values('卢第',6.5,39.3,90.4,'湖北','47344454','2014-01-09 00:00:00') insert StudentInfo values('王解',80.5,79.3,70.4,'安徽','4777454','2014-01-09 00:00:00') --------------------查询表中的数据 select name,Math from StudentInfo -------------------建立临时表变量 declare @TempStudentInfo table(name nvarchar(20),Chinese float,Math float,English float)--声明表变量 insert into @TempStudentInfo select name,Chinese,Math,English from StudentInfo-----向表变量中插入数据 select * from @TempStudentInfo ---------------自定义数据类型(都是基于已有的数据类型)方法1手动 --在数据库----可编程性---类型---用户定义数据类型 ---方式2通过代码实现 exec sp_addtype newChar,'char(80)','not null' -------------case语句 select *,语文= case when Chinese>60 then '合格' when Chinese<60 then '不合格' end from StudentInfo go -------------循环语句 declare @mysum int declare @i int set @i=1 set @mysum=0 while(@i<101) begin set @mysum=@mysum+@i set @i+=1 end print @mysum go -------------------临时表 --局部临时表 create table #tempStu ( id int, name nvarchar(20) ) insert into #tempStu select id,name from StudentInfo select * from #tempStu go ---全局临时表 drop table ##tempStu create table ##tempStu ( id int, name nvarchar(20) ) insert into ##tempStu select id,name from StudentInfo select * from ##tempStu select id,name into #temptable from StudentInfo ---将id和name插入到临时表(同时创建了临时表) -----------------------------列的计算 select name as 姓名,Chinese as 语文,Math as 数学,English as 英语,Chinese+Math+English as 总分 from StudentInfo order by 总分 desc--默认为升序降序则为desc --------区间查询 select * from table id (not)between 17 and 20 -------in的使用 select * from StudentInfo where Math in(69.3,79.3) -------------------------------------连接两张表(join) select * from StudentInfo -----性别表 create table PersonInfo ( id int, sex nvarchar(10) ) insert into PersonInfo values(20140007,'女') select * from PersonInfo ---------开始连接两张表 select A1.name as 姓名,A2.sex as 性别 from StudentInfo A1,PersonInfo A2 where A1.id=A2.id go -------group by 的使用 select address as 地区,Sum(Math)as 数学分数 from StudentInfo A1 group by A1.address --------distance的使用 选取相关列的不同数据 使用方式 select distinct sex from PersonInfo ---------like的使用 ---LIKE 是另一个在 WHERE 子句中会用到的指令。基本上,LIKE 能让我们依据一个套式 (pattern) 来找出我们要的资料。 --SELECT "栏位名" FROM "表格名" WHERE "栏位名" LIKE {套式}; --套式经常包括野卡一下几个例子: /* 1 'A_Z': 所有以 'A' 起头,另一个任何值的字原,且以 'Z' 为结尾的字串。 'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字原,而不是一个字原)。 2'ABC%': 所有以 'ABC' 起头的字串。举例来说,'ABCD' 和 'ABCABC' 都符合这个套式。 3'%XYZ': 所有以 'XYZ' 结尾的字串。举例来说,'WXYZ' 和 'ZZXYZ' 都符合这个套式。 4'%AN%': 所有含有 'AN' 这个套式的字串。举例来说, 'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个套式。 */ select name from StudentInfo where name like '张_' --------Having的使用 /*
那我们如何对函数产生的值来设定条件呢?举例来说,我们可能只需要知道哪些人的分数超过60。在这个情况下,我们不能使用 WHERE 的指令。那要怎么办呢?很幸运地,SQL 有提供一个 HAVING 的指令,而我们就可以用这个指令来达到这个目标。 HAVING 子句通常是在一个 SQL 句子的最后。一个含有 HAVING 子句的 SQL 并不一定要包含 GROUP BY 子句。HAVING 的语法如下:
SELECT "栏位1", SUM("栏位2")
FROM "表格名"
GROUP BY "栏位1"
HAVING (函数条件);
*/
select name ,sum(Math) from StudentInfo group by name having sum(Math)>60
/*内部链接和外部链接:左连接 (left join),又称内部连接 (inner join)。在这个情况下,要两个表格内都有同样的值,那一笔资料才会被选出。那如果我们想要列出一个表格中每一笔的资料,无论它的值在另一个表格中有没有出现,那该怎么办呢?在这个时候,我们就需要用到 SQL OUTER JOIN (外部连接) 的指令。
外部连接的语法是依数据库的不同而有所不同的。举例来说,在 Oracle 上,我们会在 WHERE 子句中要选出所有资料的那个表格之后加上一个 "(+)" 来代表说这个表格中的所有资料我们都要。
*/ --------------------------------------------------SQL的外部链接 --重新建两张表格 go create table Test_outjoin ( city nvarchar(30), StoreNummber int, infodatetime datetime ) create table Test2_outjoin ( City_in_Where nvarchar(10), City nvarchar(10) ) select * from Test_outjoin select * from Test2_outjoin -------河北和北京不在表一中我们将采用外部链接两张表
select A1.City,SUM(A2.StoreNummber)from Test2_outjoin A1 left join Test_outjoin A2 on A1.City=A2.city group by A1.City
--Orcle的写法为select A1.City,SUM(A2.StoreNummber)from Test2_outjoin A1,Test_outjoin A2 where A1.City=A2.city(+) group by A1.City(右连接为:A1.City(+)=A2.city)

-----------------------UNION的使用
/*
UNION 指令的目的是将两个sql语句合并起来。从这个角度看union跟join有些类似,因为这两个指令都可以有多个表格中撷取资料。union的一个限制是两个sql语句所产生的栏位需要是同样的资料种类。另外当我们用union这个指令时我们只会看到不同的资料值(类似与select distinct)
*/
go
select Test_outjoin.city from Test_outjoin union select Test2_outjoin.City from Test2_outjoin--两种查询区并集
--union all UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复

---INTERSECT 与union恰好相反他有点像and取交集的意思
select Test_outjoin.city from Test_outjoin intersect select Test2_outjoin.City from Test2_outjoin

---MINUS(MSSQL不存在)不相同值只列出一次
/*MINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的结果中。如果有的话,那这一笔资料就被去除,而