280
Приложение C
7.3
Напишите запрос, возвращающий только
значение месяца текущей
даты.
mysql>
SELECT EXTRACT(MONTH FROM CURRENT_DATE( ));
++
| EXTRACT(MONTH FROM CURRENT_DATE) |
++
| 5 |
++
1 row in set (0.02 sec)
(Если это упражнение выполняется не в мае, полученный результат
будет отличаться от приведенного.)
Глава 8
8.1
Создайте запрос для подсчета числа строк в таблице
account
.
mysql>
SELECT COUNT(*)
> FROM account;
++
| count(*) |
++
| 24 |
++
1 row in set (0.32 sec)
8.2
Измените свой запрос из упражнения 8.1 для подсчета числа счетов,
имеющихся у каждого клиента. Для каждого клиента выведите ID
клиента и количество счетов.
mysql>
SELECT cust_id, COUNT(*)
> FROM account
> GROUP BY cust_id;
+++
| cust_id | count(*) |
+++
| 1 | 3 |
| 2 | 2 |
| 3 | 2 |
| 4 | 3 |
| 5 | 1 |
| 6 | 2 |
| 7 | 1 |
| 8 | 2 |
| 9 | 3 |
| 10 | 2 |
Решения к упражнениям
281
| 11 | 1 |
| 12 | 1 |
| 13 | 1 |
+++
13 rows in set (0.00 sec)
8.3
Измените запрос из упражнения 8.2 так, чтобы в результирующий на
бор были включены только клиенты, имеющие не меньше двух счетов.
mysql>
SELECT cust_id, COUNT(*)
> FROM account
> GROUP BY cust_id
> HAVING COUNT(*) >= 2;
+++
| cust_id | COUNT(*) |
+++
| 1 | 3 |
| 2 | 2 |
| 3 | 2 |
| 4 | 3 |
| 6 | 2 |
| 8 | 2 |
| 9 | 3 |
| 10 | 2 |
+++
8 rows in set (0.04 sec)
8.4 (дополнительно)
Найдите общий доступный остаток по типу счета и отделению, где на
каждый тип и отделение приходится более одного счета.
Результаты
должны быть упорядочены по общему остатку (от наибольшего к наи
меньшему).
mysql>
SELECT product_cd, open_branch_id, SUM(avail_balance)
> FROM account
> GROUP BY product_cd, open_branch_id
> HAVING COUNT(*) > 1
> ORDER BY 3 DESC;
++++
| product_cd | open_branch_id | SUM(avail_balance) |
++++
| CHK | 4 | 67852.33 |
| MM | 1 | 14832.64 |
| CD | 1 | 11500.00 |
| CD | 2 | 8000.00 |
| CHK | 2 | 3315.77 |
| CHK | 1 | 782.16 |
| SAV | 2 | 700.00 |
++++
7 rows in set (0.01 sec)
282
Приложение C
Примечание:
MySQL не принимает
ORDER
BY
SUM(avail_balance)
DESC,
, по
этому я был вынужден обозначить столбец сортировки его порядко
вым номером.
Глава 9
9.1
Создайте
запрос к таблице
account
, использующий условие фильтра
ции с несвязанным
подзапросом к таблице
product
для поиска всех кре
дитных счетов (
product.product_type_cd
=
'LOAN'
). Должны быть выбра
ны ID счета, код счета, ID клиента и доступный остаток.
mysql>
SELECT account_id, product_cd, cust_id, avail_balance
> FROM account
> WHERE product_cd IN (SELECT product_cd
> FROM product
> WHERE product_type_cd = 'LOAN');
+++++
| account_id | product_cd | cust_id | avail_balance |
+++++
| 21 | BUS | 10 | 0.00 |
| 22 | BUS | 11 | 9345.55 |
| 24 | SBL | 13 | 50000.00 |
+++++
3 rows in set (0.07 sec)
9.2
Переработайте запрос из упражнения 9.1,
используя
связанный
подза
прос к таблице
product
для получения того же результата.
mysql>
SELECT a.account_id, a.product_cd, a.cust_id, a.avail_balance
> FROM account a
> WHERE EXISTS (SELECT 1
> FROM product p
> WHERE p.product_cd = a.product_cd
> AND p.product_type_cd = 'LOAN');
+++++
| account_id | product_cd | cust_id | avail_balance |
+++++
| 21 | BUS | 10 | 0.00 |
| 22 | BUS | 11 | 9345.55 |
| 24 | SBL | 13 | 50000.00 |
+++++
3 rows in set (0.01 sec)
9.3
Соедините следующий запрос с таблицей
employee
, чтобы показать уро
вень квалификации каждого сотрудника:
Решения к упражнениям
283
SELECT 'trainee' name, '20040101' start_dt, '20051231' end_dt
UNION ALL
SELECT 'worker' name, '20020101' start_dt, '20031231' end_dt
UNION ALL
SELECT 'mentor' name, '20000101' start_dt, '20011231' end_dt
Дайте
подзапросу псевдоним
levels
(уровни) и включите ID сотрудни
ка, имя, фамилию и квалификацию (
levels.name
). (Совет: в условии со
единения определяйте диапазон, в который попадает столбец
employee
.start_date
, с помощью условия неравенства.)
mysql>
SELECT e.emp_id, e.fname, e.lname, levels.name
> FROM employee e INNER JOIN
> (SELECT 'trainee' name, '20040101' start_dt, '20051231' end_dt
> UNION ALL
> SELECT 'worker' name, '20020101' start_dt, '20031231' end_dt
> UNION ALL
> SELECT 'mentor' name, '20000101' start_dt, '20011231' end_dt) levels
> ON e.start_date BETWEEN levels.start_dt AND levels.end_dt;
+++++
| emp_id | fname | lname | name |
+++++
| 6 | Helen | Fleming | trainee |
| 7 | Chris | Tucker | trainee |
| 2 | Susan | Barker | worker |
| 4 | Susan | Hawthorne | worker |
| 5 | John | Gooding | worker |
| 8 | Sarah | Parker | worker |
| 9 | Jane | Grossman | worker |
| 10 | Paula | Roberts | worker |
| 12 | Samantha | Jameson | worker |
| 14 | Cindy | Mason | worker |
| 15 | Frank | Portman | worker |
| 17 | Beth | Fowler | worker |
| 18 | Rick | Tulman | worker |
| 1 | Michael | Smith | mentor |
| 3 | Robert | Tyler | mentor |
| 11 | Thomas | Ziegler | mentor |
| 13 | John | Blake | mentor |
| 16 | Theresa | Markham | mentor |
+++++
18 rows in set (0.00 sec)
9.4
Создайте запрос к таблице
employee
для получения ID, имени и фами
лии сотрудника вместе с названиями отдела и отделения, к которым
он приписан. Не используйте соединение таблиц.
mysql>
Достарыңызбен бөлісу: