数据库实验三
一、基本查询
1.查询员工的姓名及其工资。
SELECT
employee_name,
salary
FROM
employee AS e,
works AS w
WHERE
e.employee_ID = w.employee_ID
2.显示雇员工资上浮20%的结果。
SELECT
salary * 1.2
FROM
works
3.显示WORKS表的雇员名称以及工资的两倍。
SELECT
employee_name,
salary * 2
FROM
works AS w,
employee AS e
WHERE
e.employee_ID = w.employee_ID
4.显示员工的employee_name和salary,其中employee_name属性列显示为“姓名”,salary属性列显示为‘工资’。
SELECT
employee_name 姓名,
salary 工资
FROM
works AS w,
employee AS e
WHERE
w.employee_ID = e.employee_ID
5.显示MANAGES表中不同的经理名称。注意:去掉重复的名称。
SELECT DISTINCT
employee_name
FROM
manages AS m,
employee AS e
WHERE
e.employee_ID=m.employee_ID
6.查询雇员姓名和工资,并按工资从小到大排序。
SELECT
employee_name,
salary
FROM
works AS w,
employee AS e
WHERE
e.employee_ID = w.employee_ID
ORDER BY
salary DESC;
7.查询雇员信息,先按公司名从小到大排序,再按工资从小到大排序。
SELECT
employee_name,
company_name,
salary
FROM
works as w,employee as e
WHERE
w.employee_ID=e.employee_ID
ORDER BY
company_name ASC,
salary ASC
二、简单条件查询
- 显示公司名称为“Alibaba”的雇员的姓名和工资。
SELECT
employee_name,
salary
FROM
works,
employee
WHERE
company_name = 'Alibaba'
AND works.employee_ID = employee.employee_ID
- 显示工资大于等于10000的雇员姓名和工资。
SELECT
employee_name,
salary
FROM
works,
employee
WHERE
salary>=10000
AND works.employee_ID = employee.employee_ID
- 显示在公司Tensent和Huawei的员工的姓名和工资。
SELECT
employee_name,
salary
FROM
works,
employee
WHERE
(
company_name = 'Tensent'
OR company_name = 'Huawei'
)
AND works.employee_ID = employee.employee_ID
- 显示不在公司Tensent和Huawei的员工的姓名和工资。
SELECT
employee_name,
salary
FROM
works,
employee
WHERE
not(
company_name = 'Tensent'
OR company_name = 'Huawei'
)
AND works.employee_ID = employee.employee_ID
- 显示工资在10000和15000之间的员工的姓名。注意:可以使用BETWEEN…AND…
SELECT
employee_name
FROM
works,
employee
WHERE
(salary BETWEEN 10000 AND 15000)
AND works.employee_ID = employee.employee_ID
- 显示公司’Alibaba’和公司’Baidu’中工资大于15000的雇员。
SELECT
employee_name
FROM
works,
employee
WHERE
(
company_name = 'Alibaba'
OR company_name = 'Baidu'
)
AND salary >= 15000
AND works.employee_ID = employee.employee_ID
- 显示所有以‘G’字母开头的员工的姓名。
SELECT
employee_name
FROM
employee
WHERE
employee_name LIKE 'G%'
- 在employee中,查询所有以‘n’字母结尾的员工姓名,且‘n’前面只有4个字母。
SELECT
employee_name
FROM
employee
WHERE
employee_name LIKE '____n'
- 在manages中,查询manager_name为空的记录。
SELECT
*
FROM
manages
WHERE
manager_ID = NULL
三、分组查询
10. 根据company_name对works表中的数据进行分组。
SELECT
company_name
FROM
works
GROUP BY
company_nameD
- 根据company_name对works表中的数据进行分组,并显示员工个数大于3的分组信息.
SELECT
company_name
FROM
works
GROUP BY
company_name
HAVING
COUNT(employee_ID) > 3
- 显示每个公司中所有员工的总工资大于50000的公司名称及其所有员工的总工资数。
SELECT
company_name,
sum(salary)
FROM
works
GROUP BY
company_name
HAVING
SUM(salary) > 50000
思考题:
(1)分组查询中的WHERE和HAVING有什么区别?请举例说明。
where的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
例如:一个表中有name、company_name,salary,如果我要找出这所有salary>10000的就要使用where。这个时候是没有分公司的,是直接寻找salary大于10000的。如果我要找出每所公司中的salary大于10000的则使用having。这个时侯是已经分好公司再找。
(2)不在GROUP BY子句中出现的属性,是否可以出现在select子句中?请举例说明。
这里是引用答:不可以出现再select子句。
例:一个表中有name、company_name,salary,对company_name进行分组,这个时候表中只有company_name的数据,如果select的是name字段,在分好组的company_name中是找不到的。
(3)在GROUP BY子句中出现的属性,是否可以不出现在SELECT子句中?请举例说明。
答:可以不出现在select子句。
例:一个表中有name、company_name,salary,对company_name,salary进行分组,这个时候表中有company_name和salary组合好的数据,如果只select字段salary,在组好的数据中也有salary字段,那么就可以查询的到。