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

Post on 26-Jun-2015

98 Views

Category:

Education

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

СУБДЛекция 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

top related