СУБД осень 2012 Лекция 4

34
СУБД Лекция 4 Павел Щербинин

Upload: technopark

Post on 26-Jun-2015

97 views

Category:

Education


0 download

TRANSCRIPT

Page 1: СУБД осень 2012 Лекция 4

СУБДЛекция 4

Павел Щербинин

Page 2: СУБД осень 2012 Лекция 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;

Page 3: СУБД осень 2012 Лекция 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 |

Page 4: СУБД осень 2012 Лекция 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;

Page 5: СУБД осень 2012 Лекция 4

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

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

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

[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

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

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

JOINS

Page 12: СУБД осень 2012 Лекция 4

Набор данных

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Преимущества VIEW

1. Дает возможность гибкой настройки прав доступа к данным за счет того, что права даются не на таблицу, а на представление.

2. Позволяет разделить логику хранения данных и программного обеспечения.

3. Удобство в использовании за счет автоматического выполнения таких действий как доступ к определенной части строк и/или столбцов, получение данных из нескольких таблиц и их преобразование с помощью различных функций.

Page 27: СУБД осень 2012 Лекция 4

Ограничения VIEW

нельзя повесить триггер на представление;

нельзя сделать представление на основе временных таблиц;

нельзя сделать временное представление;

в определении представления нельзя использовать подзапрос в части FROM;

в определении представления нельзя использовать системные и пользовательские переменные;

таблицы и представления, присутствующие в определении представления должны существовать.

Page 28: СУБД осень 2012 Лекция 4

Особенности 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

Особенности VIEW

1. Если в обоих операторах встречается условие WHERE, то оба этих условия будут выполнены как если бы они были объединены оператором AND.

2. Если в определении представления есть конструкция ORDER BY, то она будет работать только в случае отсутствия во внешнем операторе SELECT, обращающемся к представлению, собственного условия сортировки. При наличии конструкции ORDER BY во внешнем операторе сортировка, имеющаяся в определении представления, будет проигнорирована.

3. При наличии в обоих операторах модификаторов, влияющих на механизм блокировки, таких как HIGH_PRIORITY, результат их совместного действия неопределен. Для избежания неопределенности рекомендуется в определении представления не использовать подобные модификаторы.

Page 30: СУБД осень 2012 Лекция 4

Алгоритмы 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

Алгоритмы 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

Изменение VIEW

WITH [CASCADED | LOCAL] CHECK OPTION

• Изменение данных (UPDATE) будет происходить только если строка с новыми значениями удовлетворяет условию WHERE в определении представления.

• Добавление данных (INSERT) будет происходить только если новая строка удовлетворяет условию WHERE в определении представления.

• Для LOCAL происходит проверка условия WHERE только в собственном определении представления.

• Для CASCADED происходит проверка для всех представлений на которых основанно данное представление. Значением по умолчанию является CASCADED.

Page 33: СУБД осень 2012 Лекция 4

Изменение 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'

Page 34: СУБД осень 2012 Лекция 4

Спасибо за внимание

Павел Щербинин[email protected]