为运行本章的例子,先执行如下基础代码:
*1.建表*/
/*职工表 worker*/
create table worker
(
职工号 int primary key
,姓名 char(8)
,性别 char(2)
,出生日期 datetime
,党员否 varchar(2) default('否') not null
,参加工作 datetime
,部门号 int
)
/*部门表 depart */
create table depart
(
部门号 int
,部门名 char(10)
,primary key(部门号)
)
/*工资表 salary*/
create table salary
(
职工号 int not null
,姓名 char(8)
,日期 datetime not null
,工资 decimal(6,1)
,primary key(职工号,日期)
)
/*插入数据*/
insert into depart(部门号,部门名) values(1,'财务处')
insert into depart(部门号,部门名) values(2,'人事处')
insert into depart(部门号,部门名) values(3,'市场部')
insert into worker(职工号,姓名,性别,出生日期,党员否,参加工作,部门号) values(1,'孙华','男','1952-03-01','是','1970-10-10',1)
insert into worker(职工号,姓名,性别,出生日期,党员否,参加工作,部门号) values(2,'陈明','男','1948-08-05',default,'1965-01-01',2)
insert into worker(职工号,姓名,性别,出生日期,党员否,参加工作,部门号) values(3,'程西','男','1980-10-06',default,'2002-10-07',1)
insert into worker(职工号,姓名,性别,出生日期,党员否,参加工作,部门号) values(4,'孙天奇','女','1965-10-03','是','1987-10-07',3)
insert into worker(职工号,姓名,性别,出生日期,党员否,参加工作,部门号) values(5,'刘夫文','男','1942-03-03','是','1969-09-10',2)
insert into worker(职工号,姓名,性别,出生日期,党员否,参加工作,部门号) values(6,'刘天','男','1942-03-03','是','1969-09-10',2)
insert into worker(职工号,姓名,性别,出生日期,党员否,参加工作,部门号) values(10,'刘夫文','女','1942-09-21','是','1965-09-11',3)
insert into salary(职工号,姓名,日期,工资) values(1,'孙华','2004-04-01',1201.5)
insert into salary(职工号,姓名,日期,工资) values(2,'陈明','2004-04-01',1350.6)
insert into salary(职工号,姓名,日期,工资) values(3,'程西','2004-04-01',780.5)
insert into salary(职工号,姓名,日期,工资) values(4,'孙天奇','2004-04-01',900.0)
insert into salary(职工号,姓名,日期,工资) values(5,'刘夫文','2004-04-01',2006.8)
insert into salary(职工号,姓名,日期,工资) values(1,'孙华','2004-05-01',690.5)
insert into salary(职工号,姓名,日期,工资) values(2,'陈明','2004-05-01',3100.6)
insert into salary(职工号,姓名,日期,工资) values(3,'程西','2004-05-01',1563.2)
insert into salary(职工号,姓名,日期,工资) values(4,'孙天奇','2004-05-01',2310.4)
insert into salary(职工号,姓名,日期,工资) values(5,'刘夫文','2004-05-01',180.2)
insert into salary(职工号,姓名,日期,工资) values(10,'刘夫文','2004-05-01',5000.0)
一、查询语句的结构
Select 字段列表 [into 新表名] From 表名或视图名, 表名或视图名….. [Where 条件表达式] [Group by 列名列表] [Having 条件表达式] [Order by 列名[Asc|Desc], 列名[Asc|Desc]…..] [compute 行聚合函数名(统计表达式)…..by 分类表达式] 备注:1:上面的顺序固定不变,[]表示可选 2:Asc表示升序(默认),Desc表示降序 |
二、简单的查询
/*查询男职工的记录,并按工作时间的倒序排列*/
select * from worker
where 性别='男'
order by 参加工作 desc
/*查询前5条记录*/
select top 5 * from worker
/*查询前20%的记录*/
select top 20 percent 职工号 from worker
三、UNION操作
通过union操作可以将两个或多个查询结果合并到一个结果集
select 职工号,姓名 from worker
union
select 职工号,姓名 from salary
四、子查询
可以在insert、select、update、delect等地方嵌套select查询子句
/*修改工资为5000的员工的性别为男*/
update worker
set 性别='男'
where 姓名=
(
select 姓名 from salary
where 工资 = 5000.0
)
五、连接
1、内连接:查询多表中匹配的记录
/*内连接,inner可省略不写*/
select *
from worker w inner join salary s
on w.职工号 = s.职工号
where w.姓名 = '孙华'
结果为:
备注:
以上代码等价于:
select *
from worker w ,salary s
where w.职工号 = s.职工号
and w.姓名 = '孙华'
2、交叉连接:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)
/*交叉连接*/
select *
from worker cross join depart
结果为:
3、外连接:
3.1、左外连接:
/*左外连接:
语法
Select 表1.列名 as 别名,表2.列名 as 别名
From 表1 left [outer] join 表2
On 表1.列名=表2.列名
说明:对左表1不加限制,对表2加限制
结果:先查询出在两表中都满足条件的记录,再查询出左表1中其他的记录,并在右表的相应列上填上Null
*/
select worker.姓名,工资
from worker left join salary
on worker.职工号 = salary.职工号
3.2、右外连接:
/*右外连接:
语法
Select 表1.列名 as 别名,表2.列名 as 别名
From 表1 right [outer] join 表2
On 表1.列名=表2.列名
说明:对右表2不加限制,对表1加限制
结果:先查询出在两表中都满足条件的记录,再查询出右表2中其他的记录,并在左表的相应列上填上Null
*/
select worker.姓名,工资
from worker right outer join salary
on worker.职工号 = salary.职工号
3.3、全连接:
/*全外连接:
语法
Select 表1.列名 as 别名,表2.列名 as 别名
From 表1 full [outer] join 表2
On 表1.列名=表2.列名
说明:对右表2不加限制,对表1加限制
结果:先查询出在两表中都满足条件的记录,再查询出左表1中其他的记录,最后查询出右表2中其他的记录,并在左表或右表的相应列中填上Null,bit类型则以0补充
*/
select worker.姓名,工资
from worker full join salary
on worker.职工号 = salary.职工号