* Псевдоними на колони и таблици
Публикувано на 19 март 2009 в раздел Бази от Данни.
Псевдонимите на колони ни улесняват да пишем по-ясни записи на заявките. Нeка разгледаме пример от предишната статия:
Задача: Изведете името на банката и средната сума на акаунтите в нея, но само за банките, които имат буквата “M” някъде в името на банковия клон:
mysql> SELECT banks.name, AVG(accounts.amount)
FROM banks JOIN branches ON branches.bank_code = banks.code
JOIN accounts ON accounts.branch_id = branches.id
WHERE branches.name LIKE '%M%'
GROUP BY banks.name;
+-----------------+-------------+
| name | AVG(amount) |
+-----------------+-------------+
| Societe General | 2821.020000 |
| Wells Fargo | 2775.247500 |
+-----------------+-------------+
2 rows in set (0.00 sec)
Виждате, че резултатът е таблица с две колони. Имената им са съответно „name“ и „AVG(amount)“. Въпреки, че от гледна точка на програмиста това е напълно достатъчно, то не е лошо да ги наименоваме с по-описателни имена. Например:
mysql> SELECT banks.name AS bank_name, AVG(amount) AS average_amount
FROM banks JOIN branches ON branches.bank_code = banks.code
JOIN accounts ON accounts.branch_id = branches.id
WHERE branches.name LIKE '%M%'
GROUP BY banks.name;
+-----------------+----------------+
| bank_name | average_amount |
+-----------------+----------------+
| Societe General | 2821.020000 |
| Wells Fargo | 2775.247500 |
+-----------------+----------------+
2 rows in set (0.00 sec)
Още повече – навсякъде, където сме използвали в заявката пълното име, можем да го заменим с неговия псевдоним. В случая това е само на едно място:
mysql> SELECT banks.name AS bank_name, AVG(amount) AS average_amount
FROM banks JOIN branches ON branches.bank_code = banks.code
JOIN accounts ON accounts.branch_id = branches.id
WHERE branches.name LIKE '%M%'
GROUP BY bank_name;
+-----------------+----------------+
| bank_name | average_amount |
+-----------------+----------------+
| Societe General | 2821.020000 |
| Wells Fargo | 2775.247500 |
+-----------------+----------------+
2 rows in set (0.00 sec)
Можем да правим и псевдоними вътре в заявката. Например нека разгледаме заявка, която изкарва името на клиента и сумата пари, които притежава, но само за клиентите с id> 3 и id < 10:
mysql> SELECT customers.name, SUM(accounts.amount) FROM customers JOIN accounts ON customers.id = accounts.customer_id WHERE customers.id > 3 AND customers.id < 10 GROUP BY customers.id ORDER BY customers.name; +-------------------+----------------------+ | name | SUM(accounts.amount) | +-------------------+----------------------+ | Atanas Petrov | 1200.00 | | Elica Zaharieva | 211.98 | | Ivan Ivanov | 133.48 | | Mariana Zaharieva | 1236.33 | | Mihail Ivchev | 1331.50 | | Zlatomir Petrov | 256.41 | +-------------------+----------------------+ 6 rows in set (0.02 sec)
Можем да „прекръстим“ таблицата customers с по-кратко име, като и зададем псевдоним в FROM:
mysql> SELECT cst.name, SUM(accounts.amount) FROM customers AS cst JOIN accounts ON cst.id = accounts.customer_id WHERE cst.id > 3 AND cst.id < 10 GROUP BY cst.id ORDER BY cst.name; +-------------------+----------------------+ | name | SUM(accounts.amount) | +-------------------+----------------------+ | Atanas Petrov | 1200.00 | | Elica Zaharieva | 211.98 | | Ivan Ivanov | 133.48 | | Mariana Zaharieva | 1236.33 | | Mihail Ivchev | 1331.50 | | Zlatomir Petrov | 256.41 | +-------------------+----------------------+ 6 rows in set (0.00 sec)
Така навсякъде, където сме се обръщали към таблицата customers вече можем да използваме по-краткото име. Принцип преименуването на таблици, които си имат вече статични имена не се счита за добър начин на работа. Наистина често ни спестява писане на доста досаден код, но пък внася допълнително объркване, защото трябва да следим допълнителни връзки.
Когато работим с таблици – извадки от други, то винаги трябва да им избираме псевдоним. Ще демонстрираме това с елементарна заявка, която изкарва броя на банките, които започват с буквата „B“:
mysql> SELECT COUNT(*) FROM ( SELECT code, name FROM banks ) AS orgs WHERE orgs.name LIKE 'B%'; +----------+ | COUNT(*) | +----------+ | 2 | +----------+ 1 row in set (0.00 sec)
Е, в случая можехме да пропуснем вписването на такава таблица, но използвахме примера за демонстрация на техниката.
Задача: Намерете броят на клиентите, чийто сметки от тип 2 имат повече от 500 долара.
6 коментара за “Псевдоними на колони и таблици”
Trackback URI | RSS за коментарите
Пусни коментар
Категории
- Бази от Данни (39)
- Вероятности (30)
- История (14)
- Кучета (67)
- Лада Нива (91)
- Математика (159)
- Методика (52)
- Общи работи (107)
- ПИК-3 Java (38)
- Политика (40)
- Програмни Среди (1)
- ПТСК (37)
- С/C++ (45)
- Семейни (15)
- Физика (35)
- ХHTML/JS (25)
- Храна (11)
Нови
- Как да разрежем хляба?
- Здравей бебе!
- Какво означават метеорологичните кодове?
- Берра проправя пътеки
- Задача от YES
04 септември 2010 на 12:01
SELECT COUNT(customers.name)
FROM customers LEFT JOIN accounts ON customers.id = accounts.customer_id
WHERE accounts.type = 2 AND accounts.amount > 500;
05 септември 2010 на 10:55
Не, ако един клиент има две сметки от тип 2 с повече от 500 долара, то той ще бъде преброен два пъти. „решение“ даде грежно решение.
11 август 2011 на 17:27
Задачата с псевдоним ли трябва да се реши?
11 август 2011 на 20:47
„Както може“ трябва да се реши.
12 август 2011 на 17:17
SELECT DISTINCT COUNT(customers.name)
FROM customers LEFT JOIN accounts ON customers.id = accounts.customer_id
WHERE accounts.type = 2 AND accounts.amount > 500;
12 август 2011 на 17:34
Без групиране? Странно.