三、SQL语句:查询<上>


SQL语句中,查询语句是最常用,也是最基础的
下面我们看几个具体的查询例子
备注:以下例子均在SQL Server 2000中执行通过

为方便查看查询结果,请先运行如下基础代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*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)

一、查询语句的基本结构

1
2
3
4
5
6
7
8
9
10
11
SELECT 字段列表
[INTO 新表名]
FROM 表名或视图名, 表名或视图名…..
[WHERE 条件表达式]
[GROUP BY 列名列表]
[HAVING 条件表达式]
[ORDER BY 列名[ASC|DESC], 列名[ASC|DESC]..]
[compute 行聚合函数名(统计表达式)..BY 分类表达式]
备注:
1:上面的顺序固定不变,[]表示可选
2ASC表示升序(默认),DESC表示降序

二、简单查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*查询男职工的记录,并按工作时间的倒序排列*/
SELECT * FROM worker
WHERE 性别='男'
ORDER BY 参加工作 desc</pre>
<pre class="brush:sql">/*查询前6条记录*/
SELECT top 6 * FROM worker</pre>
<pre class="brush:sql">/*查询前30%的记录*/
SELECT top 30 percent  职工号 FROM worker</pre>
<h2>三、子查询</h2>
可以在INSERTSELECTUPDATE、delect等地方嵌套SELECT查询子句
<pre class="brush:sql">/*修改工资为5000的员工的性别为男*/
UPDATE worker
SET 性别='男'
WHERE 姓名=
(
    SELECT 姓名 FROM salary
    WHERE 工资 = 5000.0
)

四、UNION操作

通过union操作可以将两个或多个查询结果合并到一个结果集

1
2
3
SELECT 职工号,姓名 FROM worker
UNION
SELECT 职工号,姓名 FROM salary

五、连接

1、内连接

内连接:查询多表中匹配的记录

1
2
3
4
5
/*内连接,inner可省略不写*/
SELECT *
FROM worker w INNER JOIN salary s
ON w.职工号 = s.职工号
WHERE w.姓名 = '孙华'

查询结果如下:

备注:
下面语句与上面的语句的执行结果一样

1
2
3
4
SELECT *
FROM worker w ,salary s
WHERE   w.职工号 = s.职工号
    AND w.姓名 = '孙华'

2、交叉连接

交叉连接:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)

1
2
3
/*交叉连接*/
SELECT *
FROM worker CROSS JOIN depart

查询结果如下:

3、外连接

3.1、左外连接

1
2
3
4
5
6
7
8
9
10
11
12
13
/*左外连接:
  语法
  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、右外连接

1
2
3
4
5
6
7
8
9
10
11
12
13
/*右外连接:
  语法
  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、全连接

1
2
3
4
5
6
7
8
9
10
11
12
13
/*全外连接:
  语法
  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.职工号
Tags:
文 / 甲乙丙丁
LEAVE A REPLY

loading