SQLsever各种查询语句和建表语句Word文件下载.docx
《SQLsever各种查询语句和建表语句Word文件下载.docx》由会员分享,可在线阅读,更多相关《SQLsever各种查询语句和建表语句Word文件下载.docx(28页珍藏版)》请在冰豆网上搜索。
北京海淀区'
B24'
上海公司'
上海闵行区'
C13'
福建公司'
福建福州鼓楼区'
D00'
台湾%公司'
台北县台北市'
INSERTINTOWorker(WorkerID,WorkerName,WorkerSex,WorkerAge,WorkerJob,Salary,CompanyID)
A0101'
黄伟强'
33,'
工程师'
2100,'
A0102'
陈至'
36,'
高级工程师'
4300,'
B2424'
林发清'
43,'
5000,'
C1313'
陈华仁'
35,NULL,2500,'
C1315'
傅星'
23,'
助理工程师'
2000,'
X0001'
赵苑言'
NULL,NULL,3000,NULL)
INSERTINTOProject(ProjectID,ProjectName,ProjectPlace)
101'
国道'
四川成都'
202'
高速公路'
NULL)
303'
大桥'
天津南开区'
INSERTINTOEnroll(WorkerID,ProjectID,Job,MonthCount,MonthSalary)
项目经理'
18,1000)
NULL,12,800)
NULL,23,800)
NULL,17,650)
施工员'
14,800)
15,900)
监理'
20,1000)
--1.
SELECT*FROMWorker
--2.
SELECTWorkerNameAS姓名,SalaryFROMWorker
--3
SELECTWorkerID,Salary/22.5FROMWorker
SELECTWorkerID,Convert(Int,Salary/22.5)FROMWorker
SELECTWorkerID,CAST(Salary/22.5ASINT)FROMWorker
SELECTWorkerID,Salary/22.5ASDaySalaryFROMWorker
SELECTWorkerIDAS员工号,Salary/22.5AS日工资FROMWorker
SELECTWorkerID员工号,Salary/22.5日工资FROMWorker
SELECT员工号=WorkerID,日工资=Salary/22.5FROMWorker
SELECT[INT员"
工"
号]=WorkerID,Salary/22.5"
日[工]资"
FROMWorker
--4.
Select*FromEnroll
WhereMonthCount>
15
--5.
Select*
FromCompany
Where'
=CompanyID
--6
SelectProjectName
FromProject
WhereProjectPlace='
四川'
--7
FromWorker
WhereWorkerNameLIKE'
陈%'
--8
%言'
--9
张%言'
--10
WhereCompanyNameLIKE'
%司%'
%%%'
WhereWorkerIDLIKE'
_01_2'
陈__'
--11
[傅赵]%'
--12
[^傅赵]%'
WhereWorkerNameNOTLIKE'
WhereNOTWorkerNameLIKE'
--13
WhereCompanyAddressIN('
--13.5
%+%%'
ESCAPE'
+'
--14
WhereWorkerAgeBetween20And30
--15
WhereWorkerAgeNOTBetween20And30
WhereNOTWorkerAgeBetween20And30
--17
WhereWorkerAgeISNULL
WhereWorkerAgeISNOTNULL
--19
OrderBySalary
OrderBySalaryASC
--20
OrderBySalaryDESC
--21
OrderByCompanyID,SalaryDESC
--22
SelectTOP1*
OrderByWorkerAgeAsc
--23
SelectDistinctCompanyID
/****************************
*回顾
*
*索引的概念
*简单查询
*选择全部、部分字段
*计算字段
*字段重命名
*选择查询WHERE
*基本的比较条件>
<
=>
=<
>
!
<
=
*多个条件的逻辑连接NOTANDOR
*字符串的LIKE匹配%_[][^][acegh][A-Z]
*IN和BETWEEN的范围比较
*空值的判断IS[NOT]NULL
*结果排序
*ORDERBY
*TOPn[PERCENT](SQLServer)
*LIMIT(mysql)
*ROWID(Oracle)
****************************/
--ANSI:
yyyy-MM-ddHH:
mm:
ss.ttt
SELECTMONTH('
2009-9-2710:
24:
36.234'
*本次计划
*分组查询
*聚合函数
*GROUPBY子句
*HAVING子句
*混合使用
*连接查询
*等值连接
*不等值连接
*自连接
/*
之前的查询,无论怎么过滤,都是针对原始数据的
假如要查询统计数据,则需要使用聚合函数
*/
--例:
查询工程师的平均年龄
SELECTWorkerAge
SELECTAVG(WorkerAge)ASAvgAge
查询工程师的最大、最小年龄
SELECTMAX(WorkerAge)ASMaxAge,MIN(WorkerAge)ASMinAge
查询在编号101的项目中工作的工程师人数
SELECTCOUNT(WorkerID)ASWorkerCount
FROMEnroll
WHEREProjectID='
聚合函数对符合条件的记录的指定字段进行统计查询
五个聚合函数:
MIN、MAX、COUNT、SUM、AVERAGE
注意各自的特点
可以先用WHERE进行记录选择
求工程师年龄的个数,和工程师个数
--以及性别的种类数
SELECTCOUNT(WorkerAge)ASAgeCount,
COUNT(*)ASWorkerCount,
COUNT(DISTINCTWorkerSex)ASSexCount
注意观察:
聚合函数对空值(NULL)的处理
查询各个项目所发放的总工资
--思路,即将各工程师参加项目的月津贴乘以月份,再累加
SELECTSUM(MonthSalary*MonthCount)ASTotalSalary
假如要对不同类型的数据分别进行统计,怎么进行?
计算每个工程师参加的项目数量
SELECTWorkerID,COUNT(*)ASProjectCount
GROUPBYWorkerID
GROUPBY子句首先将记录根据指定的字段进行分组
然后对各个组分别计算汇总
查询每个项目参与的工程师数量,以及月工资总和
SELECTProjectID,COUNT(*)ASWorkerCount,
SUM(MonthSalary)ASSalarySum
GROUPBYProjectID
特别的,分组查询时,在SELECT中出现的字段只能是以下两种
分组字段
聚合函数
如:
SELECTWorkerNameFROMWorkerGROUPBYCompanyID
是非法的,为什么?
在进行聚合查询之前,可以用WHERE子句对记录进行选择
那么假如需要对聚合后的结果进行选择,用什么办法?
HAVING子句:
用于对分组后的结果进行筛选
查询公司人数超过2人的公司编号,以及平均工资
SELECTCompanyID,AVG(Salary)ASAvgSalary
GROUPBYCompanyID
HAVINGCOUNT(*)>
=2
注意HAVING和WHERE的区别
以上各种查询可以混合使用
查出拥有高级员工(指工资超过3000的工程师)
--超过2人的公司
--并计算高级员工的人数、平均工资和最高工资
当包含多个子句进行查询时,各子句被执行的顺序是:
FROM-->
WHERE-->
GROUPBY-->
HAVING-->
SELECT-->
ORDER-->
TOP
连接查询
连接查询就是对多个表进行连接,将多个表的数据结合在一起
通常,连接的表都是有外键关系的表
连接查询就是关系连接运算的实现
连接运算是为了将设计时拆分的表组合起来
查询出每个工程师的信息,以及他工作的单位信息
SELECTWorker.WorkerName,Company.CompanyName
FROMWorkerINNERJOIN
CompanyONWorker.CompanyID=Company.CompanyID
连接查询的主要工作在FROM子句中
基本语法为:
FROM<
表1>
连接类型>
JOIN<
表2>
ON<
连接条件>
连接类型包括:
内连接、外连接、交叉连接等
下面叙述的主要针对内连接
连接条件,往往是两个表之间的关联字段,一般是等值比较
查询包括工程师信息的参加工作情况
对于连接查询而言,经过JOIN的两个表,构成了一个新表
我们在之前所讲述的所有查询手段,都可以应用于这个新表
查询工资超过3000的工程师的姓名和公司名称、电话
在连接查询中,字段可以用<
表名>
.<
字段名>
来引用
尤其对于两边同名的字段,必须加表名进行限定
对于重名的字段,往往需要用字段别名的方式在结果中加以区分
名称不重复的字段,可以不限定,但是建议限定
单表查询也可以在字段名前加表名进行限定,但是往往不需要
查询中为了简化书写,可以给表起别名
表>
[AS]<
别名>
哪怕是单表查询也可以加别名,但是没有太大意义
别名往往用简单的字母A、B、C等,但往往用表名的简称
用表别名的方式重写上面的例子
SELECTw.WorkerName,co.CompanyName
FROMWorkerwINNERJOIN
CompanycoONw.CompanyID=co.CompanyID
自然连接
在数据库的设计中,关联的字段(外键)往往会采取和主键表相同的命名
此时我们可以写成自然连接
语法:
外键表>
NATURALJOIN<
主键表>
不需要说明任何条件,自动找同名字段进行等值连接
但是:
SQLServer不提供本语法,以上语法在Oracle中提供
通常我们用INNERJOIN替代
在实际应用中,参与连接的表可以不止两个,可以为多个
多表连接,一般是分部进行的,以内连接为例,语法如下:
INNERJOIN<
条件>
表3>
我们可以理解为先连接前两个,形成一个新表,然后新表再连接第三个表
查询完整的参加工作情况,包括工程师、公司和工程项目信息
多表连接时,我们可以用括号指定连接顺序
对于内连接,因为满足交换律、结合律,因此都是等价的
查询在上海的公司中工资超过3000的工程师的人数、平均工资
*预习
*外连接
*嵌套查询(子查询)
WhereWo