三、SQL语句:查询_1

     为运行本章的例子,先执行如下基础代码:

*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.职工号



 

 



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值