【SQL语句练习提高】
在SQL中,查询和操作数据是其核心功能。以下通过给出的练习题目,我们将深入理解SQL的基本句式和用法。
28. 题目要求从`employee`表中抽取部门名称(depart_name),计算平均工资(avg(wage)),并按部门名称排序,但排除含有"human resource"的部门。解决方法如下:
```sql
SELECT depart_name, AVG(wage)
FROM employee
WHERE depart_name <> 'human resource'
GROUP BY depart_name
ORDER BY depart_name;
```
此查询首先通过`WHERE`子句排除了"human resource"部门,然后使用`AVG()`函数计算每个部门的平均工资,并通过`GROUP BY`将结果按部门名称分组。`ORDER BY`确保结果按照部门名称的字母顺序排序。
29. 题目要求返回`Test`表中`num`字段的最小值,但不能使用`MIN`等统计函数。我们可以利用`ORDER BY`和`LIMIT`或`TOP 1`来实现:
```sql
-- 对于MySQL或PostgreSQL
SELECT num
FROM Test
ORDER BY num
LIMIT 1;
-- 对于SQL Server
SELECT TOP 1 num
FROM Test
ORDER BY num;
```
这两个查询都将返回`num`字段的最小值,因为它们都首先对`num`进行排序,然后选择第一个记录。
33. 要求查询每个`Customer`的`Revenue`总和。这里有几种不同的写法,它们都会得到相同的结果:
```sql
-- 方法一:使用FULL JOIN
SELECT Customer.ID, SUM(ISNULL([Order].Revenue, 0))
FROM customer
FULL JOIN [order] ON ([order].CustomerID = customer.ID)
GROUP BY customer.ID;
-- 方法二:使用INNER JOIN
SELECT customer.id, SUM(order.revener)
FROM customer
INNER JOIN [order] ON (order.customerid = customer.id)
GROUP BY customer.id;
-- 方法三:使用WHERE子句
SELECT customer.id, SUM(order.revener)
FROM customer, [order]
WHERE customer.id = customerid
GROUP BY customer.id;
```
5. 问题涉及`performance`表,要求选出最高分数(score)。如果只需要分数,可以使用:
```sql
SELECT MAX(score) FROM performance;
```
如果要同时选出分数和对应的名字,可以使用:
```sql
SELECT TOP 1 score, name
FROM performance
ORDER BY score DESC;
```
或者:
```sql
SELECT name1, score
FROM performance
WHERE score IN (SELECT MAX(score) FROM performance);
```
4. 关系`s(sno, sname)`, `c(cno, cname)`, `sc(sno, cno, grade)`的题目:
1. 查询选修了课程"db"的学生人数:
```sql
SELECT COUNT(*)
FROM sc
WHERE cno = (SELECT cno FROM c WHERE c.cname = 'db');
```
2. 选择成绩最高的学生号:
```sql
SELECT sno
FROM sc
WHERE grade = (SELECT MAX(grade) FROM sc);
```
3. 每科大于90分的人数:
```sql
SELECT c.cname, COUNT(*)
FROM c
JOIN sc ON c.cno = sc.cno AND sc.grade > 90
GROUP BY c.cname;
```
以上SQL语句展示了如何处理各种数据查询,包括聚合函数、连接操作、子查询以及条件筛选。通过这些练习,我们可以更好地理解和掌握SQL的基础知识。