本章内容
6.1  基本查询
6.2  嵌套查询
6.3  连接查询
6.1  基本查询
SQL数据查询语句是SELECT语句。该语句的基本框架是SELECT-FROM-WHERE,它包含输出字段、数据来源和查询条件等基本子句。在这种固定格式中,可以不要WHERE,但是SELECTFROM是必备的。SELECT语句的子句很多,理解了这条语句各项的含义,就能从数据库中查询出各种数据。
6.1  基本查询
简单查询
语法格式:
SELECT [ALL|DISTINCT]
[TOP n [PERCENT]] select_list FROM
table_name
(1) ALL:表示输出所有记录,包括重复记录。
(2)select_list:所要查询的选项的集合,多个选项之间用逗号分开。
in运算符的含义(3)table_name:要查询的表。
6.1  基本查询
6-1  分别显示Sales数据库中的员工表employee、商品表goods、销售表sell_order表和部门表department中的所有记录。
SELECT * FROM employee
SELECT * FROM goods
SELECT * FROM sell_order
SELECT * FROM department
6.1  基本查询
6-2  显示employee表中全部员工的姓名和年龄,去掉重名。
SELECT DISTINCT employee_name AS 姓名,YEAR(GETDATE())-YEAR(birth_date) AS 年龄
FROM employee
6.1  基本查询
6-3  employee表,分别查询公司的员工总数和公司员工的平均收入。
    SELECT COUNT(*) AS 总数 FROM employee
    SELECT AVG(wages) AS 平均收入 FROM employee
6.1  基本查询
带条件查询
语法格式:
WHERE search_condition
6-4  employee表,列出月工资在2000以上的员工记录。
SELECT * FROM employee WHERE wages>2000
6.1  基本查询
6-5  employee表,求出男员工的平均工资。
    SELECT AVG(wages) as 平均工资 FROM employee WHERE sex='
6-6  employee表,列出市场部和销售部的员工名单。
SELECT d.department_name, e.employee_name
FROM employee e INNER JOIN department d ON e.department_id = d.department_id
WHERE d.department_name IN ('市场部', '销售部')
      语句中的WHERE子句还有等价的形式:
      WHERE (d.department_name = '市场部') OR (d.department_name = '销售部')
6.1  基本查询
6-7  employee表,列出月工资在20003000之间的员工名单。
      SELECT * FROM employee WHERE wages BETWEEN 2000 AND 3000
      语句中的WHERE子句还有等价的形式:
      WHERE wages>=2000 AND wages<=3000
6.1  基本查询
6-8  employee表,列出所有的姓的员工名单。
    SELECT * FROM employee WHERE employee_name LIKE '%'
    语句中的WHERE子句还有等价的形式:
      WHERE LEFT(employee_name,1)= '
6-9  employee表,列出所有工资为空值的员工编号和姓名。
SELECT employee_id,employee_name FROM employee WHERE wages IS NULL
6.1  基本查询
查询结果处理
1. 排序输出(ORDER BY)
语法格式:
ORDER BY order_by_expression1[ASC|DESC]
[,order_by_expression2[ASC|DESC]] [,…]]
6.1  基本查询
6-10  employee表,按性别顺序列出员工的编号、姓名、性别、部门编号及工资,性别相同的再先按部门后按工资由高到低排序。
SELECT employee_id,employee_name,sex,department_id,wages FROM employee
       ORDER BY sex,department_id,wages DESC
6.1  基本查询
2. 重定向输出(INTO)
语法格式:
INTO new_table
  6-11  对部门表department和员工表employee,查询出市场部所有员工的信息,并将结果存入testtable表中。
SELECT employee.* INTO testtable
FROM employee INNER JOIN department
      ON employee.department_id = department.dapartment_id
WHERE department.department_name = '市场部'
6.1  基本查询
3. 输出合并(UNION)
语法格式:
    [UNION [ALL] <SELECT语句>]
合并的规则是:
    (1)不能合并子查询的结果。
    (2)两个SELECT语句必须输出同样的列数。
    (3)两个表各相应列的数据类型必须相同,数字和字符不能合并。
    (4)仅最后一个SELECT语句中可以用ORDER BY子句,且排序选项必须依据第一个SELECT列表中的列。
6.1  基本查询
    6-12  employee表,列出部门编号为“D001”“D002”的所有员工姓名。
      SELECT employee_name,department_id FROM employee WHERE department_id='D001'
UNION
SELECT employee_name,department_id FROM employee WHERE department_id='D002'
6.1  基本查询
4. 分组统计(GROUP BY)与筛选(HAVING)
语法格式:
GROUP BY group_by_expression1 [,group_by_expression2][,…]
  6-13  employee表,分别统计男女员工人数。
    SELECT sex,COUNT(sex) as 人数 FROM employee GROUP BY sex
6.1  基本查询
6-14  employee表,分别统计各部门男女员工的人数。
SELECT department_id, sex,COUNT(*) as 人数 FROM employee
GROUP BY department_id,sex
6-15  employee表,列出部门平均工资大于2000的部门编号。
SELECT department_id,AVG(wages) AS 平均工资 FROM employee
GROUP BY department_id HAVING AVG(wages)>=2000
6.1  基本查询
5. 使用COMPUTECOMPUTE BY子句汇总
语法格式:
COMPUTE row_aggregate(column_name)[,row_aggregate(colornn_name)...]
[BY column_name[, column_name. . . ]]
6-16  employee表中部门编号为“D001”的员工工资,按照其部门编号生成汇总行和明细行。
    SELECT department_id, wages FROM employee
WHERE department_id = 'D001' ORDER BY department_id COMPUTE sum(wages)
6.1  基本查询
6-17  employee表中部门编号为“D001”“D002”的员工工资,按照其部门编号生成分
组汇总行和明细行。
    SELECT department_id, wages FROM employee
WHERE department_id = 'D001' OR department_id = 'D002'
ORDER BY department_id
COMPUTE sum(wages) BY department_id
6.2  嵌套查询
SQL Server允许多层嵌套查询。嵌套查询一般的查询方法是由里向外进行处理,即每个子查询在上一级查询处理之前处理,子查询的结果用于建立其父查询的查条件。子查询中所存取的表可以是父查询没有存取的表,子查询选出的记录不显示。
6.2  嵌套查询
单值嵌套查询
1. 返回单值的子查询
子查询的返回结果是一个值的嵌套查询称为单值嵌套查询。
    6-18  Sales数据库,列出市场部的所有员工的编号。
    SELECT employee_id FROM employee
WHERE department_id=(SELECT department_id
FROM department
WHERE department_name='市场部')
6.2  嵌套查询
多值嵌套查询
子查询的返回结果是一列值的嵌套查询称为多值嵌套查询。