СУБД осень 2012 Лекция 4
-
Upload
technopark -
Category
Education
-
view
102 -
download
0
Transcript of СУБД осень 2012 Лекция 4
![Page 1: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/1.jpg)
СУБДЛекция 4
Павел Щербинин
![Page 2: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/2.jpg)
Пользовательские переменные
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;
![Page 3: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/3.jpg)
Пользовательские переменные
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 |
![Page 4: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/4.jpg)
Пользовательские переменные
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;
![Page 5: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/5.jpg)
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);
![Page 6: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/6.jpg)
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);
![Page 7: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/7.jpg)
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)
![Page 8: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/8.jpg)
[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
);
![Page 9: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/9.jpg)
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 ...
![Page 10: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/10.jpg)
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;
![Page 11: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/11.jpg)
JOINS
![Page 12: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/12.jpg)
Набор данных
LastName DepartmentID
Rafferty 31
Jones 33
Steinberg 33
Robinson 34
Smith 34
John NULL
DepartmentID DepartmentName
31 Sales
33 Engineering
34 Clerical
35 Marketing
![Page 13: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/13.jpg)
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
![Page 14: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/14.jpg)
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
![Page 15: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/15.jpg)
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;
![Page 16: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/16.jpg)
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;
![Page 17: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/17.jpg)
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
![Page 18: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/18.jpg)
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
![Page 19: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/19.jpg)
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
![Page 20: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/20.jpg)
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
![Page 21: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/21.jpg)
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;
![Page 22: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/22.jpg)
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
![Page 23: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/23.jpg)
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
![Page 24: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/24.jpg)
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
![Page 25: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/25.jpg)
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]
![Page 26: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/26.jpg)
Преимущества VIEW
1. Дает возможность гибкой настройки прав доступа к данным за счет того, что права даются не на таблицу, а на представление.
2. Позволяет разделить логику хранения данных и программного обеспечения.
3. Удобство в использовании за счет автоматического выполнения таких действий как доступ к определенной части строк и/или столбцов, получение данных из нескольких таблиц и их преобразование с помощью различных функций.
![Page 27: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/27.jpg)
Ограничения VIEW
нельзя повесить триггер на представление;
нельзя сделать представление на основе временных таблиц;
нельзя сделать временное представление;
в определении представления нельзя использовать подзапрос в части FROM;
в определении представления нельзя использовать системные и пользовательские переменные;
таблицы и представления, присутствующие в определении представления должны существовать.
![Page 28: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/28.jpg)
Особенности 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;
![Page 29: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/29.jpg)
Особенности VIEW
1. Если в обоих операторах встречается условие WHERE, то оба этих условия будут выполнены как если бы они были объединены оператором AND.
2. Если в определении представления есть конструкция ORDER BY, то она будет работать только в случае отсутствия во внешнем операторе SELECT, обращающемся к представлению, собственного условия сортировки. При наличии конструкции ORDER BY во внешнем операторе сортировка, имеющаяся в определении представления, будет проигнорирована.
3. При наличии в обоих операторах модификаторов, влияющих на механизм блокировки, таких как HIGH_PRIORITY, результат их совместного действия неопределен. Для избежания неопределенности рекомендуется в определении представления не использовать подобные модификаторы.
![Page 30: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/30.jpg)
Алгоритмы 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;
![Page 31: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/31.jpg)
Алгоритмы 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;
![Page 32: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/32.jpg)
Изменение VIEW
WITH [CASCADED | LOCAL] CHECK OPTION
• Изменение данных (UPDATE) будет происходить только если строка с новыми значениями удовлетворяет условию WHERE в определении представления.
• Добавление данных (INSERT) будет происходить только если новая строка удовлетворяет условию WHERE в определении представления.
• Для LOCAL происходит проверка условия WHERE только в собственном определении представления.
• Для CASCADED происходит проверка для всех представлений на которых основанно данное представление. Значением по умолчанию является CASCADED.
![Page 33: СУБД осень 2012 Лекция 4](https://reader037.fdocuments.net/reader037/viewer/2022102706/558c92c7d8b42ae9098b4574/html5/thumbnails/33.jpg)
Изменение 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'