View
93
Download
0
Category
Tags:
Preview:
Citation preview
СУБДЛекция 4
Павел Щербинин
Пользовательские переменные
SET @t1=1, @t2=2, @t3:=4; SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3
| 1 | 2 | 4 | 7 |
SET @var_name = expr [, @var_name = expr] ...
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
Пользовательские переменные
SET @t1=1, @t2=2, @t3:=4; SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3
| 1 | 2 | 4 | 7 |
SET @var_name = expr [, @var_name = expr] ...
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
| 5 | 5 | 1 | 4 |
Пользовательские переменные
SET @t1=1, @t2=2, @t3:=4; SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3
| 1 | 2 | 4 | 7 |
SET @var_name = expr [, @var_name = expr] ...
SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
| 5 | 5 | 1 | 4 |
SET @id := 0; SELECT @id := @id + 1 AS row_number, your_table.* FROM your_table;
SELECT @i := @i + 1 AS row_number, your_table.* FROM your_table, (select @i:=0) AS z;
SUBQUERIES
non_subquery_operand comparison_operator (subquery)= > < >= <= <> != <=> LIKE
SELECT col0,(SELECT col1 FROM table1 WHERE table1.id = table0.id),(SELECT col2 FROM table1 WHERE table1.id = table0.id)FROM table0
SELECT * FROM t1 WHERE column1 = (SELECT MAX(column2) FROM t2);
SELECT * FROM t1 AS t WHERE 2 = (SELECT COUNT(*) FROM t1 WHERE t1.id = t.id);
SUBQUERIES
perand comparison_operator ANY (subquery) operand IN (subquery) operand comparison_operator SOME (subquery)
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);
operand comparison_operator ALL (subquery)
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2); SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);
ROW SUBQUERIES
SELECT * FROM t1 WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
SELECT * FROM t1 WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
SELECT column1,column2,column3 FROM t1 WHERE (column1,column2,column3)
IN (SELECT column1,column2,column3 FROM t2)
[NOT] EXISTS
SELECT DISTINCT store_type FROM stores WHERE EXISTS (
SELECT * FROM cities_stores WHERE cities_stores.store_type = stores.store_type
);
SELECT DISTINCT store_type FROM stores WHERE NOT EXISTS (
SELECT * FROM cities_stores WHERE cities_stores.store_type = stores.store_type
);
SUBQUERIES in FROM
SELECT AVG(sum_column1) FROM (
SELECT SUM(column1) AS sum_column1 FROM t1 GROUP BY column1
) AS t1;
SELECT ... FROM (subquery) [AS] name ...
UNION
SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]
person amount
Joe 1000
Alex 2000
Bob 5000
person amount
Joe 2000
Alex 2000
Zach 35000
SELECT * FROM sales2010 UNION SELECT * FROM sales2011;
person amount
Joe 1000
Alex 2000
Bob 5000
Joe 2000
Zach 35000
person amount
Joe 1000
Joe 2000
Alex 2000
Alex 2000
Bob 5000
Zach 35000
SELECT * FROM sales2010 UNION ALLSELECT * FROM sales2011;
JOINS
Набор данных
LastName DepartmentID
Rafferty 31
Jones 33
Steinberg 33
Robinson 34
Smith 34
John NULL
DepartmentID DepartmentName
31 Sales
33 Engineering
34 Clerical
35 Marketing
CROSS JOIN
SELECT * FROM employee CROSS JOIN department;
Employee.LastName Employee.DepartmentID
Department.DepartmentName
Department.DepartmentID
Rafferty 31 Sales 31
Jones 33 Sales 31
Steinberg 33 Sales 31
Smith 34 Sales 31
Robinson 34 Sales 31
John NULL Sales 31
Rafferty 31 Engineering 33
Jones 33 Engineering 33
Steinberg 33 Engineering 33
Smith 34 Engineering 33
Robinson 34 Engineering 33
John NULL Engineering 33
CROSS JOIN
SELECT * FROM employee, department;
Employee.LastName Employee.DepartmentID
Department.DepartmentName
Department.DepartmentID
Rafferty 31 Sales 31
Jones 33 Sales 31
Steinberg 33 Sales 31
Smith 34 Sales 31
Robinson 34 Sales 31
John NULL Sales 31
Rafferty 31 Engineering 33
Jones 33 Engineering 33
Steinberg 33 Engineering 33
Smith 34 Engineering 33
Robinson 34 Engineering 33
John NULL Engineering 33
INNER JOIN
Employee.LastName Employee.DepartmentID
Department.DepartmentName
Department.DepartmentID
Robinson 34 Clerical 34
Jones 33 Engineering 33
Smith 34 Clerical 34
Steinberg 33 Engineering 33
Rafferty 31 Sales 31
SELECT * FROM employee INNER JOIN department ON employee.DepartmentID = department.DepartmentID;
INNER JOIN
Employee.LastName Employee.DepartmentID
Department.DepartmentName
Department.DepartmentID
Robinson 34 Clerical 34
Jones 33 Engineering 33
Smith 34 Clerical 34
Steinberg 33 Engineering 33
Rafferty 31 Sales 31
SELECT * FROM employee, department WHERE employee.DepartmentID = department.DepartmentID;
NATURAL (EQUAL ) JOIN
SELECT * FROM employee NATURAL JOIN department;
DepartmentID Employee.LastName Department.DepartmentName
34 Robinson Clerical
33 Jones Engineering
34 Smith Clerical
33 Steinberg Engineering
31 Rafferty Sales
NATURAL JOIN
SELECT * FROM employee JOIN department USING (DepartmentID);
DepartmentID Employee.LastName Department.DepartmentName
34 Robinson Clerical
33 Jones Engineering
34 Smith Clerical
33 Steinberg Engineering
31 Rafferty Sales
LEFT OUTER JOIN
SELECT * FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
Employee.LastName
Employee.DepartmentID
Department.DepartmentName
Department.DepartmentID
Jones 33 Engineering 33
Rafferty 31 Sales 31
Robinson 34 Clerical 34
Smith 34 Clerical 34
John NULL NULL NULL
Steinberg 33 Engineering 33
FULL OUTER JOIN
SELECT * FROM employee FULL OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
Employee.LastName
Employee.DepartmentID
Department.DepartmentName
Department.DepartmentID
Smith 34 Clerical 34
Jones 33 Engineering 33
Robinson 34 Clerical 34
John NULL NULL NULL
Steinberg 33 Engineering 33
Rafferty 31 Sales 31
NULL NULL Marketing 35
FULL OUTER JOIN
SELECT * FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID
UNION
SELECT * FROM employee RIGHT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
SELF-JOIN
SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.Country FROM Employee F INNER JOIN Employee S ON F.Country = S.Country
EmployeeID LastName Country DepartmentID
123 Rafferty Australia 31
124 Jones Australia 33
145 Steinberg Australia 33
201 Robinson United States 34
305 Smith Germany 34
306 John Germany NULL
SELF-JOIN
SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.Country FROM Employee F INNER JOIN Employee S ON F.Country = S.Country WHERE F.EmployeeID < S.EmployeeID ORDER BY F.EmployeeID, S.EmployeeID;
EmployeeID LastName Country DepartmentID
123 Rafferty Australia 31
124 Jones Australia 33
145 Steinberg Australia 33
201 Robinson United States 34
305 Smith Germany 34
306 John Germany NULL
SELF-JOIN
EmployeeID LastName EmployeeID LastName
123 Rafferty 124 Jones
123 Rafferty 145 Steinberg
124 Jones 145 Steinberg
305 Smith 306 John
EmployeeID LastName Country DepartmentID
123 Rafferty Australia 31
124 Jones Australia 33
145 Steinberg Australia 33
201 Robinson United States 34
305 Smith Germany 34
306 John Germany NULL
VIEW
Представление (VIEW) — объект базы данных, являющийся результатом выполнения запроса к базе данных, определенного с помощью оператора SELECT, в момент обращения к представлению.
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}][DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
Преимущества VIEW
1. Дает возможность гибкой настройки прав доступа к данным за счет того, что права даются не на таблицу, а на представление.
2. Позволяет разделить логику хранения данных и программного обеспечения.
3. Удобство в использовании за счет автоматического выполнения таких действий как доступ к определенной части строк и/или столбцов, получение данных из нескольких таблиц и их преобразование с помощью различных функций.
Ограничения VIEW
нельзя повесить триггер на представление;
нельзя сделать представление на основе временных таблиц;
нельзя сделать временное представление;
в определении представления нельзя использовать подзапрос в части FROM;
в определении представления нельзя использовать системные и пользовательские переменные;
таблицы и представления, присутствующие в определении представления должны существовать.
Особенности VIEW
CREATE VIEW v AS SELECT a.id, b.id FROM a,b;
CREATE VIEW v (a_id, b_id) AS SELECT a.id, b.id FROM a,b;
CREATE VIEW v AS SELECT a.id a_id, b.id b_id FROM a,b;
CREATE VIEW v AS SELECT group_concat(DISTINCT column_name
oreder BY column_name separator '+') FROM table_name;
Особенности VIEW
1. Если в обоих операторах встречается условие WHERE, то оба этих условия будут выполнены как если бы они были объединены оператором AND.
2. Если в определении представления есть конструкция ORDER BY, то она будет работать только в случае отсутствия во внешнем операторе SELECT, обращающемся к представлению, собственного условия сортировки. При наличии конструкции ORDER BY во внешнем операторе сортировка, имеющаяся в определении представления, будет проигнорирована.
3. При наличии в обоих операторах модификаторов, влияющих на механизм блокировки, таких как HIGH_PRIORITY, результат их совместного действия неопределен. Для избежания неопределенности рекомендуется в определении представления не использовать подобные модификаторы.
Алгоритмы VIEW (MERGE)
CREATE VIEW v AS SELECT subject, num_views/num_replies AS param FROM topics WHERE num_replies>0;
SELECT subject, param FROM v WHERE param>1000;
SELECT subject, num_views/num_replies AS param FROM topics WHERE num_replies>0 AND num_views/num_replies>1000;
Алгоритмы VIEW (TEMPTABLE)
CREATE VIEW v AS SELECT forum_id, count(*) AS num FROM topics GROUP BY forum_id;
SELECT MAX(num) FROM v;
SELECT MAX(count(*)) FROM topics GROUP BY forum_id;
CREATE TEMPORARY TABLE tmp_table SELECT forum_id, count(*) AS num FROM topics GROUP BYforum_id;SELECT MAX(num) FROM tmp_table;DROP TABLE tpm_table;
Изменение VIEW
WITH [CASCADED | LOCAL] CHECK OPTION
• Изменение данных (UPDATE) будет происходить только если строка с новыми значениями удовлетворяет условию WHERE в определении представления.
• Добавление данных (INSERT) будет происходить только если новая строка удовлетворяет условию WHERE в определении представления.
• Для LOCAL происходит проверка условия WHERE только в собственном определении представления.
• Для CASCADED происходит проверка для всех представлений на которых основанно данное представление. Значением по умолчанию является CASCADED.
Изменение VIEW
CREATE OR REPLACE VIEW v ASSELECT forum_name, `subject`, num_views FROM topics,forums fWHERE forum_id=f.id AND num_views>2000 WITH CHECK OPTION;
UPDATE v SET num_views=1999 WHERE subject='test';ERROR 1369 (HY000): CHECK OPTION failed 'test.v'
UPDATE v SET num_views=2003 WHERE subject='test';Query OK
INSERT INTO v (subject,num_views) VALUES('test1',4000);ERROR 1369 (HY000): CHECK OPTION failed ‘test.v‘
INSERT INTO v (forum_id,subject,num_views) VALUES(1,'test1',4000);ERROR 1054 (42S22): Unknown COLUMN 'forum_id' IN 'field list'
Спасибо за внимание
Павел Щербининp.scherbinin@corp.mail.ru
Recommended