[ÐопÑоÑÑ Ð´Ð»Ñ ÑобеÑедованиÑ](README.md)
https://tproger.ru/articles/sql-interview-questions/
# SQL
+ [ЧÑо Ñакое _«SQL»_?](#ЧÑо-Ñакое-sql)
+ [Ðакие ÑÑÑеÑÑвÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ SQL?](#Ðакие-ÑÑÑеÑÑвÑÑÑ-опеÑаÑоÑÑ-sql)
+ [ЧÑо ознаÑÐ°ÐµÑ `NULL` в SQL?](#ЧÑо-ознаÑаеÑ-null-в-sql)
+ [ЧÑо Ñакое _«вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑаблиÑа»_? ÐÐ»Ñ Ñего она иÑполÑзÑеÑÑÑ?](#ЧÑо-Ñакое-вÑеменнаÑ-ÑаблиÑа-ÐлÑ-Ñего-она-иÑполÑзÑеÑÑÑ)
+ [ЧÑо Ñакое _«пÑедÑÑавление» (view)_ и Ð´Ð»Ñ Ñего оно пÑименÑеÑÑÑ?](#ЧÑо-Ñакое-пÑедÑÑавление-view-и-длÑ-Ñего-оно-пÑименÑеÑÑÑ)
+ [Ðаков обÑий ÑинÑакÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑоÑа `SELECT`?](#Ðаков-обÑий-ÑинÑакÑиÑ-опеÑаÑоÑа-select)
+ [ЧÑо Ñакое `JOIN`?](#ЧÑо-Ñакое-join)
+ [Ðакие ÑÑÑеÑÑвÑÑÑ ÑÐ¸Ð¿Ñ `JOIN`?](#Ðакие-ÑÑÑеÑÑвÑÑÑ-ÑипÑ-join)
+ [ЧÑо лÑÑÑе иÑполÑзоваÑÑ `JOIN` или подзапÑоÑÑ?](#ЧÑо-лÑÑÑе-иÑполÑзоваÑÑ-join-или-подзапÑоÑÑ)
+ [ÐÐ»Ñ Ñего иÑполÑзÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `HAVING`?](#ÐлÑ-Ñего-иÑполÑзÑеÑÑÑ-опеÑаÑоÑ-having)
+ [Ð Ñем ÑазлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð¿ÐµÑаÑоÑами `HAVING` и `WHERE`?](#Ð-Ñем-ÑазлиÑие-междÑ-опеÑаÑоÑами-having-и-where)
+ [ÐÐ»Ñ Ñего иÑполÑзÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `ORDER BY`?](#ÐлÑ-Ñего-иÑполÑзÑеÑÑÑ-опеÑаÑоÑ-order-by)
+ [ÐÐ»Ñ Ñего иÑполÑзÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `GROUP BY`?](#ÐлÑ-Ñего-иÑполÑзÑеÑÑÑ-опеÑаÑоÑ-group-by)
+ [Ðак `GROUP BY` обÑабаÑÑÐ²Ð°ÐµÑ Ð·Ð½Ð°Ñение `NULL`?](#Ðак-group-by-обÑабаÑÑваеÑ-знаÑение-null)
+ [Ð Ñем ÑазниÑа Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð¿ÐµÑаÑоÑами `GROUP BY` и `DISTINCT`?](#Ð-Ñем-ÑазниÑа-междÑ-опеÑаÑоÑами-group-by-и-distinct)
+ [ÐеÑеÑиÑлиÑе оÑновнÑе агÑегаÑнÑе ÑÑнкÑии.](#ÐеÑеÑиÑлиÑе-оÑновнÑе-агÑегаÑнÑе-ÑÑнкÑии)
+ [Ð Ñем ÑазниÑа Ð¼ÐµÐ¶Ð´Ñ `COUNT(*)` и `COUNT({column})`?](#Ð-Ñем-ÑазниÑа-междÑ-count-и-countcolumn)
+ [ЧÑо Ð´ÐµÐ»Ð°ÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `EXISTS`?](#ЧÑо-делаеÑ-опеÑаÑоÑ-exists)
+ [ÐÐ»Ñ Ñего иÑполÑзÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ `IN`, `BETWEEN`, `LIKE`?](#ÐлÑ-Ñего-иÑполÑзÑÑÑÑÑ-опеÑаÑоÑÑ-in-between-like)
+ [ÐÐ»Ñ Ñего пÑименÑеÑÑÑ ÐºÐ»ÑÑевое Ñлово `UNION`?](#ÐлÑ-Ñего-пÑименÑеÑÑÑ-клÑÑевое-Ñлово-union)
+ [Ðакие огÑаниÑÐµÐ½Ð¸Ñ Ð½Ð° ÑелоÑÑноÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
ÑÑÑеÑÑвÑÑÑ Ð² SQL?](#Ðакие-огÑаниÑениÑ-на-ÑелоÑÑноÑÑÑ-даннÑÑ
-ÑÑÑеÑÑвÑÑÑ-в-sql)
+ [Ðакие оÑлиÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð³ÑаниÑениÑми `PRIMARY` и `UNIQUE`?](#Ðакие-оÑлиÑиÑ-междÑ-огÑаниÑениÑми-primary-и-unique)
+ [ÐÐ¾Ð¶ÐµÑ Ð»Ð¸ знаÑение в ÑÑолбÑе, на коÑоÑÑй наложено огÑаниÑение `FOREIGN KEY`, ÑавнÑÑÑÑÑ `NULL`?](#ÐожеÑ-ли-знаÑение-в-ÑÑолбÑе-на-коÑоÑÑй-наложено-огÑаниÑение-foreign-key-ÑавнÑÑÑÑÑ-null)
+ [Ðак ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ?](#Ðак-ÑоздаÑÑ-индекÑ)
+ [ЧÑо Ð´ÐµÐ»Ð°ÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `MERGE`?](#ЧÑо-делаеÑ-опеÑаÑоÑ-merge)
+ [Ð Ñем оÑлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð¿ÐµÑаÑоÑами `DELETE` и `TRUNCATE`?](#Ð-Ñем-оÑлиÑие-междÑ-опеÑаÑоÑами-delete-и-truncate)
+ [ЧÑо Ð´ÐµÐ»Ð°ÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `EXPLAIN`?](#ЧÑо-делаеÑ-опеÑаÑоÑ-merge)
+ [ЧÑо Ñакое _«RETURNING»_?](#ЧÑо-Ñакое-RETURNING»)
+ [ЧÑо Ñакое _«Ñ
ÑÐ°Ð½Ð¸Ð¼Ð°Ñ Ð¿ÑоÑедÑÑа»_?](#ЧÑо-Ñакое-Ñ
ÑанимаÑ-пÑоÑедÑÑа)
+ [ЧÑо Ñакое _«ÑÑиггеÑ»_?](#ЧÑо-Ñакое-ÑÑиггеÑ)
+ [ЧÑо Ñакое _«кÑÑÑоÑ»_?](#ЧÑо-Ñакое-кÑÑÑоÑ)
+ [ÐпиÑиÑе ÑазниÑÑ Ñипов даннÑÑ
`DATETIME` и `TIMESTAMP`.](#ÐпиÑиÑе-ÑазниÑÑ-Ñипов-даннÑÑ
-datetime-и-timestamp)
+ [ÐÐ»Ñ ÐºÐ°ÐºÐ¸Ñ
ÑиÑловÑÑ
Ñипов недопÑÑÑимо иÑполÑзоваÑÑ Ð¾Ð¿ÐµÑаÑии ÑложениÑ/вÑÑиÑаниÑ?](#ÐлÑ-какиÑ
-ÑиÑловÑÑ
-Ñипов-недопÑÑÑимо-иÑполÑзоваÑÑ-опеÑаÑии-ÑложениÑвÑÑиÑаниÑ)
+ [Ðакое назнаÑение Ñ Ð¾Ð¿ÐµÑаÑоÑов `PIVOT` и `UNPIVOT` в Transact-SQL?](#Ðакое-назнаÑение-Ñ-опеÑаÑоÑов-pivot-и-unpivot-в-transact-sql)
+ [РаÑÑкажиÑе об оÑновнÑÑ
ÑÑнкÑиÑÑ
ÑанжиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² Transact-SQL.](#РаÑÑкажиÑе-об-оÑновнÑÑ
-ÑÑнкÑиÑÑ
-ÑанжиÑованиÑ-в-transact-sql)
+ [ÐÐ»Ñ Ñего иÑполÑзÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ `INTERSECT`, `EXCEPT` в Transact-SQL?](#ÐлÑ-Ñего-иÑполÑзÑÑÑÑÑ-опеÑаÑоÑÑ-intersect-except-в-transact-sql)
+ [ÐапиÑиÑе запÑоÑ...](#ÐапиÑиÑе-запÑоÑ)
## ЧÑо Ñакое _«SQL»_?
SQL, Structured query language («ÑзÑк ÑÑÑÑкÑÑÑиÑованнÑÑ
запÑоÑов») â ÑоÑмалÑнÑй непÑоÑедÑÑнÑй ÑзÑк пÑогÑаммиÑованиÑ, пÑименÑемÑй Ð´Ð»Ñ ÑозданиÑ, модиÑикаÑии и ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñми в пÑоизволÑной ÑелÑÑионной базе даннÑÑ
, ÑпÑавлÑемой ÑооÑвеÑÑÑвÑÑÑей ÑиÑÑемой ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ даннÑÑ
(СУÐÐ).
ФоÑмалÑнÑй - множеÑÑво конеÑнÑÑ
Ñлов (ÑÑÑок, ÑепоÑек) над конеÑнÑм алÑавиÑом. РазлиÑаÑÑ ÑзÑки еÑÑеÑÑвеннÑе, на коÑоÑÑÑ
обÑаÑÑÑÑ Ð»Ñди, и иÑкÑÑÑÑвеннÑе (или ÑоÑмалÑнÑе).
ÐепÑоÑедÑÑнÑй - каждÑй опеÑаÑÐ¾Ñ Ð²ÑÐ´Ð°ÐµÑ ÑезÑлÑÑаÑ, ÑооÑвеÑÑÑвÑÑÑий запÑаÑÐ¸Ð²Ð°ÐµÐ¼Ð¾Ð¼Ñ Ð²ÑÑ
одÑ. ÐÑвеÑÑÑвенноÑÑÑ Ð·Ð° Ñо, как добиÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑего вÑÑ
ода, лежиÑ, в знаÑиÑелÑной ÑÑепени, на моÑоÑе (движке) Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.
[к оглавлениÑ](#sql)
## Ðакие ÑÑÑеÑÑвÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ SQL?
__опеÑаÑоÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
(Data Definition Language, DDL)__:
+ `CREATE` ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð¾Ð±ÑÐµÐºÑ ÐÐ (базÑ, ÑаблиÑÑ, пÑедÑÑавление, полÑзоваÑÐµÐ»Ñ Ð¸ Ñ. д.),
+ `ALTER` изменÑÐµÑ Ð¾Ð±ÑекÑ,
+ `DROP` ÑдалÑÐµÑ Ð¾Ð±ÑекÑ,
+ `TRUNCATE` - ÑдалÑÐµÑ ÑаблиÑÑ Ð¸ ÑÐ¾Ð·Ð´Ð°ÐµÑ ÐµÐµ заново. ÐÑиÑем еÑли на ÑÑÑ ÑаблиÑÑ ÐµÑÑÑ ÑÑÑлки `FOREGIN KEY` или ÑаблиÑа иÑполÑзÑеÑÑÑ Ð² ÑепликаÑии, Ñо пеÑеÑоздаÑÑ ÑакÑÑ ÑаблиÑÑ Ð½Ðµ полÑÑиÑÑÑ.
+ `RENAME` пеÑеименовÑÑÐ²Ð°ÐµÑ Ð¾Ð±ÑекÑ;
__опеÑаÑоÑÑ Ð¼Ð°Ð½Ð¸Ð¿ÑлÑÑии даннÑми (Data Manipulation Language, DML)__:
+ `SELECT` вÑбиÑÐ°ÐµÑ Ð´Ð°Ð½Ð½Ñе, ÑдовлеÑвоÑÑÑÑие заданнÑм ÑÑловиÑм,
+ `INSERT` добавлÑÐµÑ Ð½Ð¾Ð²Ñе даннÑе,
+ `UPDATE` изменÑÐµÑ ÑÑÑеÑÑвÑÑÑие даннÑе,
+ `DELETE` ÑдалÑÐµÑ Ð´Ð°Ð½Ð½Ñе;
__опеÑаÑоÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпа к даннÑм (Data Control Language, DCL)__:
+ `GRANT` пÑедоÑÑавлÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ (гÑÑппе) ÑазÑеÑÐµÐ½Ð¸Ñ Ð½Ð° опÑеделеннÑе опеÑаÑии Ñ Ð¾Ð±ÑекÑом,
+ `REVOKE` оÑзÑÐ²Ð°ÐµÑ Ñанее вÑданнÑе ÑазÑеÑениÑ,
+ `DENY` Ð·Ð°Ð´Ð°ÐµÑ Ð·Ð°Ð¿ÑеÑ, имеÑÑий пÑиоÑиÑÐµÑ Ð½Ð°Ð´ ÑазÑеÑением;
__опеÑаÑоÑÑ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑанзакÑиÑми (Transaction Control Language, TCL)__:
+ `COMMIT` пÑименÑÐµÑ ÑÑанзакÑиÑ,
+ `ROLLBACK` оÑкаÑÑÐ²Ð°ÐµÑ Ð²Ñе изменениÑ, ÑделаннÑе в конÑекÑÑе ÑекÑÑей ÑÑанзакÑии,
+ `SAVEPOINT` ÑÐ°Ð·Ð±Ð¸Ð²Ð°ÐµÑ ÑÑанзакÑÐ¸Ñ Ð½Ð° более мелкие.
[к оглавлениÑ](#sql)
## ЧÑо ознаÑÐ°ÐµÑ `NULL` в SQL?
`NULL` - ÑпеÑиалÑное знаÑение (пÑевдознаÑение), коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¿Ð¸Ñано в поле ÑаблиÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. NULL ÑооÑвеÑÑÑвÑÐµÑ Ð¿Ð¾Ð½ÑÑÐ¸Ñ Â«Ð¿ÑÑÑое поле», Ñо еÑÑÑ Â«Ð¿Ð¾Ð»Ðµ, не ÑодеÑжаÑее никакого знаÑениÑ».
`NULL` ознаÑÐ°ÐµÑ Ð¾ÑÑÑÑÑÑвие, неизвеÑÑноÑÑÑ Ð¸Ð½ÑоÑмаÑии. ÐнаÑение `NULL` не ÑвлÑеÑÑÑ Ð·Ð½Ð°Ñением в полном ÑмÑÑле Ñлова: по опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ð½Ð¾ ознаÑÐ°ÐµÑ Ð¾ÑÑÑÑÑÑвие знаÑÐµÐ½Ð¸Ñ Ð¸ не пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð½Ð¸ Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐоÑÑÐ¾Ð¼Ñ `NULL` не Ñавно ни логиÑеÑÐºÐ¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ `FALSE`, ни _пÑÑÑой ÑÑÑоке_, ни `0`. ÐÑи ÑÑавнении `NULL` Ñ Ð»ÑбÑм знаÑением бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑен ÑезÑлÑÑÐ°Ñ `NULL`, а не `FALSE` и не `0`. Ðолее Ñого, `NULL` не Ñавно `NULL`!
[к оглавлениÑ](#sql)
## ЧÑо Ñакое _«вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑаблиÑа»_? ÐÐ»Ñ Ñего она иÑполÑзÑеÑÑÑ?
__ÐÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑаблиÑа__ - ÑÑо обÑÐµÐºÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, коÑоÑÑй Ñ
ÑаниÑÑÑ Ð¸ ÑпÑавлÑеÑÑÑ ÑиÑÑемой Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
на вÑеменной оÑнове. Ðни могÑÑ Ð±ÑÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑми или глобалÑнÑми. ÐÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑов вÑзова Ñ
Ñанимой пÑоÑедÑÑÑ, ÑменÑÑение ÑиÑла ÑÑÑок пÑи ÑоединениÑÑ
, агÑегиÑование даннÑÑ
из ÑазлиÑнÑÑ
иÑÑоÑников или как замена кÑÑÑоÑов и паÑамеÑÑизованнÑÑ
пÑедÑÑавлений.
[к оглавлениÑ](#sql)
## ЧÑо Ñакое _«пÑедÑÑавление» (view)_ и Ð´Ð»Ñ Ñего оно пÑименÑеÑÑÑ?
__ÐÑедÑÑавление__, View - виÑÑÑалÑÐ½Ð°Ñ ÑаблиÑа, пÑедÑÑавлÑÑÑÐ°Ñ Ð´Ð°Ð½Ð½Ñе одной или более ÑÐ°Ð±Ð»Ð¸Ñ Ð°Ð»ÑÑеÑнаÑивнÑм обÑазом. ÐÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑиÑоко иÑполÑзÑÑÑÑÑ ÐºÐ¾Ð³Ð´Ð° необÑ
одимо пÑедÑÑавиÑÑ ÑÑÑÑкÑÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
в Ñдобном Ð´Ð»Ñ Ð²Ð¾ÑпÑиÑÑÐ¸Ñ Ñеловеком виде, а Ñак же в ÑообÑажениÑÑ
безопаÑноÑÑи, пÑедоÑÑавлÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑм возможноÑÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº даннÑм, но не ÑазÑеÑÐ°Ñ Ð¸Ð¼ доÑÑÑп к иÑÑ
однÑм ÑаблиÑам.
РдейÑÑвиÑелÑноÑÑи пÑедÑÑавление â вÑего лиÑÑ ÑезÑлÑÑÐ°Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа `SELECT`, коÑоÑÑй Ñ
ÑаниÑÑÑ Ð² ÑÑÑÑкÑÑÑе памÑÑи, напоминаÑÑей SQL ÑаблиÑÑ. Ðни ÑабоÑаÑÑ Ð² запÑоÑаÑ
и опеÑаÑоÑаÑ
DML ÑоÑно Ñакже как и оÑновнÑе ÑаблиÑÑ, но не ÑодеÑÐ¶Ð°Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
ÑобÑÑвеннÑÑ
даннÑÑ
. ÐÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑиÑелÑно ÑаÑÑиÑÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñми. ÐÑо ÑпоÑоб даÑÑ Ð¿ÑблиÑнÑй доÑÑÑп к некоÑоÑой (но не вÑей) инÑоÑмаÑии в ÑаблиÑе.
ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ SQL CREATE и ÑинÑакÑÐ¸Ñ Ð²ÑглÑÐ´Ð¸Ñ ÑледÑÑÑим обÑазом:
```java
CREATE VIEW view_name
AS SELECT column_name
FROM table_name
WHERE condition
```
[к оглавлениÑ](#sql)
## Ðаков обÑий ÑинÑакÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑоÑа `SELECT`?
`SELECT` - опеÑаÑÐ¾Ñ DML SQL, возвÑаÑаÑÑий Ð½Ð°Ð±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ
(вÑбоÑкÑ) из Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, ÑдовлеÑвоÑÑÑÑиÑ
Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑловиÑ. ÐÐ¼ÐµÐµÑ ÑледÑÑÑÑÑ ÑÑÑÑкÑÑÑÑ:
```sql
SELECT
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
FROM table_references
[WHERE where_definition]
[GROUP BY {unsigned_integer | column | formula}]
[HAVING where_definition]
[ORDER BY {unsigned_integer | column | formula} [ASC | DESC], ...]
```
[к оглавлениÑ](#sql)
## ЧÑо Ñакое `JOIN`?
__JOIN__ - опеÑаÑÐ¾Ñ ÑзÑка SQL, коÑоÑÑй ÑвлÑеÑÑÑ ÑеализаÑией опеÑаÑии ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑелÑÑионной алгебÑÑ. ÐÑедназнаÑен Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð²ÑбоÑки даннÑÑ
из двÑÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð¸ вклÑÑÐµÐ½Ð¸Ñ ÑÑиÑ
даннÑÑ
в один ÑезÑлÑÑиÑÑÑÑий набоÑ.
ÐÑобенноÑÑÑми опеÑаÑии ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑвлÑÑÑÑÑ ÑледÑÑÑее:
+ в ÑÑ
ÐµÐ¼Ñ ÑаблиÑÑ-ÑезÑлÑÑаÑа вÑ
одÑÑ ÑÑолбÑÑ Ð¾Ð±ÐµÐ¸Ñ
иÑÑ
однÑÑ
ÑÐ°Ð±Ð»Ð¸Ñ (ÑаблиÑ-опеÑандов), Ñо еÑÑÑ ÑÑ
ема ÑезÑлÑÑаÑа ÑвлÑеÑÑÑ Â«ÑÑеплением» ÑÑ
ем опеÑандов;
+ ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑÑока ÑаблиÑÑ-ÑезÑлÑÑаÑа ÑвлÑеÑÑÑ Â«ÑÑеплением» ÑÑÑоки из одной ÑаблиÑÑ-опеÑанда Ñо ÑÑÑокой вÑоÑой ÑаблиÑÑ-опеÑанда;
+ пÑи необÑ
одимоÑÑи ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ двÑÑ
, а неÑколÑкиÑ
ÑаблиÑ, опеÑаÑÐ¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿ÑименÑеÑÑÑ Ð½ÐµÑколÑко Ñаз (поÑледоваÑелÑно).
```sql
SELECT
field_name [,... n]
FROM
Table1
{INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN
Table2
{ON | USING (field_name [,... n])}
```
[к оглавлениÑ](#sql)
## Ðакие ÑÑÑеÑÑвÑÑÑ ÑÐ¸Ð¿Ñ `JOIN`?
__(INNER) JOIN__
РезÑлÑÑаÑом обÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ ÑвлÑÑÑÑÑ Ð·Ð°Ð¿Ð¸Ñи, обÑие Ð´Ð»Ñ Ð»ÐµÐ²Ð¾Ð¹ и пÑавой ÑаблиÑ. ÐоÑÑдок ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа не важен, поÑколÑÐºÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑвлÑеÑÑÑ ÑиммеÑÑиÑнÑм.
__LEFT (OUTER) JOIN__
ÐÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ð²ÑÐ±Ð¾Ñ Ð²ÑеÑ
запиÑей пеÑвой ÑаблиÑÑ Ð¸ ÑооÑвеÑÑÑвÑÑÑиÑ
им запиÑей вÑоÑой ÑаблиÑÑ. ÐÑли запиÑи во вÑоÑой ÑаблиÑе не найденÑ, Ñо вмеÑÑо ниÑ
подÑÑавлÑеÑÑÑ Ð¿ÑÑÑой ÑезÑлÑÑÐ°Ñ (`NULL`). ÐоÑÑдок ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа важен, поÑколÑÐºÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð½Ðµ ÑвлÑеÑÑÑ ÑиммеÑÑиÑнÑм.
__RIGHT (OUTER) JOIN__
`LEFT JOIN` Ñ Ð¾Ð¿ÐµÑандами, ÑаÑÑÑавленнÑми в обÑаÑном поÑÑдке. ÐоÑÑдок ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа важен, поÑколÑÐºÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð½Ðµ ÑвлÑеÑÑÑ ÑиммеÑÑиÑнÑм.
__FULL (OUTER) JOIN__
РезÑлÑÑаÑом обÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ ÑвлÑÑÑÑÑ Ð²Ñе запиÑи, коÑоÑÑе пÑиÑÑÑÑÑвÑÑÑ Ð² ÑаблиÑаÑ
. ÐоÑÑдок ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа не важен, поÑколÑÐºÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑвлÑеÑÑÑ ÑиммеÑÑиÑнÑм.
__CROSS JOIN (декаÑÑово пÑоизведение)__
ÐÑи вÑбоÑе ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑÑока одной ÑаблиÑÑ Ð¾Ð±ÑединÑеÑÑÑ Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑокой вÑоÑой ÑаблиÑÑ, Ð´Ð°Ð²Ð°Ñ Ñем ÑамÑм вÑе возможнÑе ÑоÑеÑÐ°Ð½Ð¸Ñ ÑÑÑок двÑÑ
ÑаблиÑ. ÐоÑÑдок ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа не важен, поÑколÑÐºÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑвлÑеÑÑÑ ÑиммеÑÑиÑнÑм.
[к оглавлениÑ](#sql)
## ЧÑо лÑÑÑе иÑполÑзоваÑÑ `JOIN` или подзапÑоÑÑ?
ÐбÑÑно лÑÑÑе иÑполÑзоваÑÑ `JOIN`, поÑколÑÐºÑ Ð² болÑÑинÑÑве ÑлÑÑаев он более понÑÑен и лÑÑÑе опÑимизиÑÑеÑÑÑ Ð¡Ð£ÐÐ (но 100% ÑÑого гаÑанÑиÑоваÑÑ Ð½ÐµÐ»ÑзÑ). Так же `JOIN` Ð¸Ð¼ÐµÐµÑ Ð·Ð°Ð¼ÐµÑное пÑеимÑÑеÑÑво над подзапÑоÑами в ÑлÑÑае, когда ÑпиÑок вÑбоÑа `SELECT` ÑодеÑÐ¶Ð¸Ñ ÑÑолбÑÑ Ð±Ð¾Ð»ÐµÐµ Ñем из одной ÑаблиÑÑ.
ÐодзапÑоÑÑ Ð»ÑÑÑе иÑполÑзоваÑÑ Ð² ÑлÑÑаÑÑ
, когда нÑжно вÑÑиÑлÑÑÑ Ð°Ð³ÑегаÑнÑе знаÑÐµÐ½Ð¸Ñ Ð¸ иÑполÑзоваÑÑ Ð¸Ñ
Ð´Ð»Ñ ÑÑавнений во внеÑниÑ
запÑоÑаÑ
.
[к оглавлениÑ](#sql)
## ÐÐ»Ñ Ñего иÑполÑзÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `HAVING`?
`HAVING` иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑилÑÑÑаÑии ÑезÑлÑÑаÑа `GROUP BY` по заданнÑм логиÑеÑким ÑÑловиÑм.
[к оглавлениÑ](#sql)
## Ð Ñем ÑазлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð¿ÐµÑаÑоÑами `HAVING` и `WHERE`?
`WHERE` - ÑÑо огÑаниÑиваÑÑее вÑÑажение. Ðно вÑполнÑеÑÑÑ Ð´Ð¾ Ñого, как бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑен ÑезÑлÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑии. WHERE ÑлÑÐ¶Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑного ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð²ÑбоÑки, опеÑаÑий вÑÑавки, ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей. УÑловие (condition) Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð² ÑÐµÐ±Ñ Ð¿ÑедикаÑÑ AND, OR, NOT, LIKE, BETWEEN, IS, IN, клÑÑевое Ñлово NULL, опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¸ ÑавенÑÑва (<, >, =).
```java
SELECT * FROM Planets WHERE Radius BETWEEN 3000 AND 9000
```
`HAVING` - ÐпеÑаÑÐ¾Ñ SQL HAVING ÑвлÑеÑÑÑ ÑказаÑелем на ÑезÑлÑÑÐ°Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð°Ð³ÑегаÑнÑÑ
ÑÑнкÑий. ÐгÑегаÑной ÑÑнкÑией в ÑзÑке SQL назÑваеÑÑÑ ÑÑнкÑиÑ, возвÑаÑаÑÑÐ°Ñ ÐºÐ°ÐºÐ¾Ðµ-либо одно знаÑение по набоÑÑ Ð·Ð½Ð°Ñений ÑÑолбÑа. Такими ÑÑнкÑиÑми ÑвлÑÑÑÑÑ: SQL COUNT(), SQL MIN(), SQL MAX(), SQL AVG(), SQL SUM().
```java
SELECT Singer, SUM(Sale)
FROM Artists
GROUP BY Singer
HAVING SUM(Sale) > 2000000
```
ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ WHERE иÑполÑзÑÑÑÑÑ Ð²Ð¼ÐµÑÑе Ñ Ð¾Ð¿ÐµÑаÑиÑми SELECT, UPDATE, DELETE, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº HAVING ÑолÑко Ñ SELECT и пÑедложением GROUP BY.
[к оглавлениÑ](#sql)
## ÐÐ»Ñ Ñего иÑполÑзÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `ORDER BY`?
__ORDER BY__ ÑпоÑÑдоÑÐ¸Ð²Ð°ÐµÑ Ð²Ñвод запÑоÑа ÑоглаÑно знаÑениÑм в Ñом или ином колиÑеÑÑве вÑбÑаннÑÑ
ÑÑолбÑов. ÐногоÑиÑленнÑе ÑÑолбÑÑ ÑпоÑÑдоÑиваÑÑÑÑ Ð¾Ð´Ð¸Ð½ внÑÑÑи дÑÑгого. Ðозможно опÑеделÑÑÑ Ð²Ð¾Ð·ÑаÑÑание `ASC` или ÑбÑвание `DESC` Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÑановлено - возÑаÑÑание.
[к оглавлениÑ](#sql)
## ÐÐ»Ñ Ñего иÑполÑзÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `GROUP BY`?
`GROUP BY` иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð°Ð³ÑегаÑии запиÑей ÑезÑлÑÑаÑа по Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ.
[к оглавлениÑ](#sql)
## Ðак `GROUP BY` обÑабаÑÑÐ²Ð°ÐµÑ Ð·Ð½Ð°Ñение `NULL`?
ÐÑи иÑполÑзовании `GROUP BY` вÑе знаÑÐµÐ½Ð¸Ñ `NULL` ÑÑиÑаÑÑÑÑ ÑавнÑми.
[к оглавлениÑ](#sql)
## Ð Ñем ÑазниÑа Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð¿ÐµÑаÑоÑами `GROUP BY` и `DISTINCT`?
`DISTINCT` ÑказÑваеÑ, ÑÑо Ð´Ð»Ñ Ð²ÑÑиÑлений иÑполÑзÑÑÑÑÑ ÑолÑко ÑникалÑнÑе знаÑÐµÐ½Ð¸Ñ ÑÑолбÑа. `NULL` ÑÑиÑаеÑÑÑ ÐºÐ°Ðº оÑделÑное знаÑение. DISTINCT наÑел ÑиÑокое пÑименение в опеÑаÑоÑе SQL SELECT, Ð´Ð»Ñ Ð²ÑбоÑки ÑникалÑнÑÑ
знаÑений. Так же иÑполÑзÑеÑÑÑ Ð² агÑегаÑнÑÑ
ÑÑнкÑиÑÑ
.
```java
SELECT DISTINCT column_name FROM table_name
```
`GROUP BY` иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑов вÑбоÑки по Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð»Ð¸ неÑколÑким ÑÑолбÑам. ÑÐ¾Ð·Ð´Ð°ÐµÑ Ð¾ÑделÑнÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð´Ð»Ñ Ð²ÑеÑ
возможнÑÑ
знаÑений (вклÑÑÐ°Ñ Ð·Ð½Ð°Ñение `NULL`).
ÐÑли нÑжно ÑдалиÑÑ ÑолÑко дÑбликаÑÑ Ð»ÑÑÑе иÑполÑзоваÑÑ `DISTINCT`, `GROUP BY` лÑÑÑе иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð³ÑÑпп запиÑей, к коÑоÑÑм могÑÑ Ð¿ÑименÑÑÑÑÑ Ð°Ð³ÑегаÑнÑе ÑÑнкÑии.
[к оглавлениÑ](#sql)
## ÐеÑеÑиÑлиÑе оÑновнÑе агÑегаÑнÑе ÑÑнкÑии.
__ÐгÑегаÑнÑÑ
ÑÑнкÑии__ - ÑÑнкÑии, коÑоÑÑе беÑÑÑ Ð³ÑÑÐ¿Ð¿Ñ Ð·Ð½Ð°Ñений и ÑводÑÑ Ð¸Ñ
к одиноÑÐ½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ.
SQL пÑедоÑÑавлÑÐµÑ Ð½ÐµÑколÑко агÑегаÑнÑÑ
ÑÑнкÑий:
`COUNT` - пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ð´ÑÑÐµÑ Ð·Ð°Ð¿Ð¸Ñей, ÑдовлеÑвоÑÑÑÑиÑ
ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð°Ð¿ÑоÑа;
`SUM` - вÑÑиÑлÑÐµÑ Ð°ÑиÑмеÑиÑеÑкÑÑ ÑÑÐ¼Ð¼Ñ Ð²ÑеÑ
знаÑений колонки;
`AVG` - вÑÑиÑлÑÐµÑ ÑÑеднее аÑиÑмеÑиÑеÑкое вÑеÑ
знаÑений;
`MAX` - опÑеделÑÐµÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑÑее из вÑеÑ
вÑбÑаннÑÑ
знаÑений;
`MIN` - опÑеделÑÐµÑ Ð½Ð°Ð¸Ð¼ÐµÐ½ÑÑее из вÑеÑ
вÑбÑаннÑÑ
знаÑений.
[к оглавлениÑ](#sql)
## Ð Ñем ÑазниÑа Ð¼ÐµÐ¶Ð´Ñ `COUNT(*)` и `COUNT({column})`?
`COUNT (*)` подÑÑиÑÑÐ²Ð°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво запиÑей в ÑаблиÑе, не игноÑиÑÑÑ Ð·Ð½Ð°Ñение NULL, поÑколÑÐºÑ ÑÑа ÑÑнкÑÐ¸Ñ Ð¾Ð¿ÐµÑиÑÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑми, а не ÑÑолбÑами.
`COUNT ({column})` подÑÑиÑÑÐ²Ð°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво знаÑений в `{column}`. ÐÑи подÑÑеÑе колиÑеÑÑва знаÑений ÑÑолбÑа ÑÑа ÑоÑма ÑÑнкÑии `COUNT` не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð²Ð¾ внимание знаÑение `NULL`.
[к оглавлениÑ](#sql)
## ЧÑо Ð´ÐµÐ»Ð°ÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `EXISTS`?
`EXISTS` беÑÐµÑ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑ, как аÑгÑменÑ, и оÑÐµÐ½Ð¸Ð²Ð°ÐµÑ ÐµÐ³Ð¾ как `TRUE`, еÑли подзапÑÐ¾Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÐºÐ°ÐºÐ¸Ðµ-либо запиÑи и `FALSE`, еÑли неÑ.
[к оглавлениÑ](#sql)
## ÐÐ»Ñ Ñего иÑполÑзÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ `IN`, `BETWEEN`, `LIKE`?
`IN` - опÑеделÑÐµÑ Ð½Ð°Ð±Ð¾Ñ Ð·Ð½Ð°Ñений.
```sql
SELECT * FROM Persons WHERE name IN ('Ivan','Petr','Pavel');
```
`BETWEEN` опÑеделÑÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ знаÑений. РоÑлиÑие Ð¾Ñ `IN`, `BETWEEN` ÑÑвÑÑвиÑелен к поÑÑдкÑ, и пеÑвое знаÑение в пÑедложении должно бÑÑÑ Ð¿ÐµÑвÑм по алÑавиÑÐ½Ð¾Ð¼Ñ Ð¸Ð»Ð¸ ÑиÑÐ»Ð¾Ð²Ð¾Ð¼Ñ Ð¿Ð¾ÑÑдкÑ.
```sql
SELECT * FROM Persons WHERE age BETWEEN 20 AND 25;
```
`LIKE` пÑименим ÑолÑко к полÑм Ñипа `CHAR` или `VARCHAR`, Ñ ÐºÐ¾ÑоÑÑми он иÑполÑзÑеÑÑÑ ÑÑÐ¾Ð±Ñ Ð½Ð°Ñ
одиÑÑ Ð¿Ð¾Ð´ÑÑÑоки. РкаÑеÑÑве ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑполÑзÑÑÑÑÑ _ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ÑаблонизаÑии (wildkards_) - ÑпеÑиалÑнÑе ÑимволÑ, коÑоÑÑе могÑÑ ÑооÑвеÑÑÑвоваÑÑ ÑемÑ-нибÑдÑ:
+ `_` замеÑÐ°ÐµÑ Ð»Ñбой одиноÑнÑй Ñимвол. ÐапÑимеÑ, `'b_t'` бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ Ñловам `'bat'` или `'bit'`, но не бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ `'brat'`.
+ `%` замеÑÐ°ÐµÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð»Ñбого ÑиÑла Ñимволов. ÐапÑÐ¸Ð¼ÐµÑ `'%p%t'` бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ Ñловам `'put'`, `'posit'`, или `'opt'`, но не `'spite'`.
```sql
SELECT * FROM UNIVERSITY WHERE NAME LIKE '%o';
```
[к оглавлениÑ](#sql)
## ÐÐ»Ñ Ñего пÑименÑеÑÑÑ ÐºÐ»ÑÑевое Ñлово `UNION`?
Ð ÑзÑке SQL клÑÑевое Ñлово `UNION` пÑименÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑов двÑÑ
SQL-запÑоÑов в единÑÑ ÑаблиÑÑ, ÑоÑÑоÑÑÑÑ Ð¸Ð· ÑÑ
ожиÑ
запиÑей. Ðба запÑоÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ðµ ÑиÑло ÑÑолбÑов и ÑовмеÑÑимÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
в ÑооÑвеÑÑÑвÑÑÑиÑ
ÑÑолбÑаÑ
. ÐеобÑ
одимо оÑмеÑиÑÑ, ÑÑо `UNION` Ñам по Ñебе не гаÑанÑиÑÑÐµÑ Ð¿Ð¾ÑÑдок запиÑей. ÐапиÑи из вÑоÑого запÑоÑа могÑÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð² наÑале, в конÑе или вообÑе пеÑемеÑаÑÑÑÑ Ñ Ð·Ð°Ð¿Ð¸ÑÑми из пеÑвого запÑоÑа. Ð ÑлÑÑаÑÑ
, когда ÑÑебÑеÑÑÑ Ð¾Ð¿ÑеделеннÑй поÑÑдок, необÑ
одимо иÑполÑзоваÑÑ `ORDER BY`.
С Ñдалением дÑблей:
```sql
SELECT * FROM имÑ_ÑаблиÑÑ1 WHERE ÑÑловие
UNION SELECT * FROM имÑ_ÑаблиÑÑ2 WHERE ÑÑловие
```
Ðез ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´Ñблей:
```sql
SELECT * FROM имÑ_ÑаблиÑÑ1 WHERE ÑÑловие
UNION ALL SELECT * FROM имÑ_ÑаблиÑÑ2 WHERE ÑÑловие
```
Ðожно обÑединÑÑÑ Ð½Ðµ две ÑаблиÑÑ, а ÑÑи или более:
```sql
SELECT * FROM имÑ_ÑаблиÑÑ1 WHERE ÑÑловие
UNION SELECT * FROM имÑ_ÑаблиÑÑ2 WHERE ÑÑловие
UNION SELECT * FROM имÑ_ÑаблиÑÑ3 WHERE ÑÑловие
UNION SELECT * FROM имÑ_ÑаблиÑÑ4 WHERE ÑÑлови
```
[к оглавлениÑ](#sql)
## Ðакие огÑаниÑÐµÐ½Ð¸Ñ Ð½Ð° ÑелоÑÑноÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
ÑÑÑеÑÑвÑÑÑ Ð² SQL?
__sql constraint__
`PRIMARY KEY` - Ð½Ð°Ð±Ð¾Ñ Ð¿Ð¾Ð»ÐµÐ¹ (1 или более), знаÑÐµÐ½Ð¸Ñ ÐºÐ¾ÑоÑÑÑ
обÑазÑÑÑ ÑникалÑнÑÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°ÑÐ¸Ñ Ð¸ иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñной иденÑиÑикаÑии запиÑи в ÑаблиÑе. ÐÐ»Ñ ÑаблиÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñоздано ÑолÑко одно Ñакое огÑаниÑение. Ðанное огÑаниÑение иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи ÑÑÑноÑÑи, коÑоÑÐ°Ñ Ð¾Ð¿Ð¸Ñана ÑаблиÑей.
`CHECK` иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва знаÑений, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð¼ÐµÑÐµÐ½Ñ Ð² даннÑй ÑÑолбеÑ. ÐÑо огÑаниÑение иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи пÑедмеÑной облаÑÑи, коÑоÑÑÑ Ð¾Ð¿Ð¸ÑÑваÑÑ ÑаблиÑÑ Ð² базе.
`UNIQUE` обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð¾ÑÑÑÑÑÑвие дÑбликаÑов в ÑÑолбÑе или набоÑе ÑÑолбÑов.
`FOREIGN KEY` заÑиÑÐ°ÐµÑ Ð¾Ñ Ð´ÐµÐ¹ÑÑвий, коÑоÑÑе могÑÑ Ð½Ð°ÑÑÑиÑÑ ÑвÑзи Ð¼ÐµÐ¶Ð´Ñ ÑаблиÑами. `FOREIGN KEY` в одной ÑаблиÑе ÑказÑÐ²Ð°ÐµÑ Ð½Ð° `PRIMARY KEY` в дÑÑгой. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ð¾Ðµ огÑаниÑение наÑелено на Ñо, ÑÑÐ¾Ð±Ñ Ð½Ðµ бÑло запиÑей `FOREIGN KEY`, коÑоÑÑм не оÑвеÑаÑÑ Ð·Ð°Ð¿Ð¸Ñи `PRIMARY KEY`.
[к оглавлениÑ](#sql)
## Ðакие оÑлиÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð³ÑаниÑениÑми `PRIMARY` и `UNIQUE`?
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð³ÑаниÑение `PRIMARY` ÑÐ¾Ð·Ð´Ð°ÐµÑ ÐºÐ»Ð°ÑÑеÑнÑй Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð° ÑÑолбÑе, а `UNIQUE` - неклаÑÑеÑнÑй. ÐÑÑгим оÑлиÑием ÑвлÑеÑÑÑ Ñо, ÑÑо `PRIMARY` не ÑазÑеÑÐ°ÐµÑ `NULL` запиÑей, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº `UNIQUE` ÑазÑеÑÐ°ÐµÑ Ð¾Ð´Ð½Ñ (а в некоÑоÑÑÑ
СУÐРнеÑколÑко) `NULL` запиÑÑ.
[к оглавлениÑ](#sql)
## ÐÐ¾Ð¶ÐµÑ Ð»Ð¸ знаÑение в ÑÑолбÑе, на коÑоÑÑй наложено огÑаниÑение `FOREIGN KEY`, ÑавнÑÑÑÑÑ `NULL`?
ÐожеÑ, еÑли на даннÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð½Ðµ наложено огÑаниÑение `NOT NULL`.
[к оглавлениÑ](#sql)
## Ðак ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ?
ÐÐ½Ð´ÐµÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑоздаÑÑ Ð»Ð¸Ð±Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ `CREATE INDEX`:
```sql
CREATE INDEX index_name ON table_name (column_name)
```
либо Ñказав огÑаниÑение ÑелоÑÑноÑÑи в виде ÑникалÑного `UNIQUE` или пеÑвиÑного `PRIMARY` клÑÑа в опеÑаÑоÑе ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑаблиÑÑ `CREATE TABLE`.
[к оглавлениÑ](#sql)
## ЧÑо Ð´ÐµÐ»Ð°ÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `MERGE`?
`MERGE` позволÑÐµÑ Ð¾ÑÑÑеÑÑвиÑÑ ÑлиÑние даннÑÑ
одной ÑаблиÑÑ Ñ Ð´Ð°Ð½Ð½Ñми дÑÑгой ÑаблиÑÑ. ÐÑи ÑлиÑнии ÑÐ°Ð±Ð»Ð¸Ñ Ð¿ÑовеÑÑеÑÑÑ ÑÑловие, и еÑли оно иÑÑинно, Ñо вÑполнÑеÑÑÑ `UPDATE`, а еÑли Ð½ÐµÑ - `INSERT`. ÐÑи ÑÑом изменÑÑÑ Ð¿Ð¾Ð»Ñ ÑаблиÑÑ Ð² ÑекÑии `UPDATE`, по коÑоÑÑм Ð¸Ð´ÐµÑ ÑвÑзÑвание двÑÑ
ÑаблиÑ, нелÑзÑ.
[к оглавлениÑ](#sql)
## Ð Ñем оÑлиÑие Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð¿ÐµÑаÑоÑами `DELETE` и `TRUNCATE`?
`DELETE` - опеÑаÑÐ¾Ñ DML, ÑдалÑÐµÑ Ð·Ð°Ð¿Ð¸Ñи из ÑаблиÑÑ, коÑоÑÑе ÑдовлеÑвоÑÑÑÑ ÐºÑиÑеÑÐ¸Ñ `WHERE` пÑи ÑÑом задейÑÑвÑÑÑÑÑ ÑÑиггеÑÑ, огÑаниÑÐµÐ½Ð¸Ñ Ð¸ Ñ.д.
`TRUNCATE` - DDL опеÑаÑоÑ. ÑдалÑÐµÑ ÑаблиÑÑ (Ð´Ð»Ñ Ð¼Ð³Ð½Ð¾Ð²ÐµÐ½Ð½Ð¾Ð¹ оÑиÑÑки вÑеÑ
ÑÑÑок) и ÑÐ¾Ð·Ð´Ð°ÐµÑ ÐµÐµ заново. ÐÑиÑем еÑли на ÑÑÑ ÑаблиÑÑ ÐµÑÑÑ ÑÑÑлки `FOREGIN KEY` или ÑаблиÑа иÑполÑзÑеÑÑÑ Ð² ÑепликаÑии, Ñо пеÑеÑоздаÑÑ ÑакÑÑ ÑаблиÑÑ Ð½Ðµ полÑÑиÑÑÑ.
+ ÐпеÑаÑÐ¾Ñ SQL TRUNCATE не Ð²ÐµÐ´ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¾Ð± ÑдаленнÑÑ
даннÑÑ
в жÑÑнал ÑобÑÑий.
+ SQL DELETE оÑÑÑеÑÑвлÑÐµÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð¿Ð¾ÑÑÑоÑно, опеÑаÑÐ¾Ñ SQL TRUNCATE по вÑей ÑÑÑаниÑе Ñеликом. ÐÑледÑÑвие ÑÑого, опеÑаÑÐ¾Ñ SQL TRUNCATE не возвÑаÑÐ°ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð³Ð¾ знаÑениÑ, SQL DELETE же, возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑдаленнÑÑ
ÑÑÑок.
+ ÐоÑле пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа SQL DELETE возможно ÑделаÑÑ Ð¾ÑÐºÐ°Ñ Ð¾Ð¿ÐµÑаÑии и воÑÑÑановиÑÑ ÑдаленнÑе даннÑе (команда ROLLBACK). ÐÑи пÑименении опеÑаÑоÑа SQL TRUNCATE ÑÑого ÑделаÑÑ Ð½ÐµÐ»ÑзÑ, однако в СУÐÐ MS SQL Server, опеÑаÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑÑанзакÑиÑÑ
.
[к оглавлениÑ](#sql)
## ЧÑо Ð´ÐµÐ»Ð°ÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ `EXPLAIN`?
```java
EXPLAIN имÑ_ÑаблиÑÑ
EXPLAIN SELECT опÑии_вÑбоÑки
```
ÐÑли опеÑаÑÐ¾Ñ SELECT пÑедваÑÑеÑÑÑ ÐºÐ»ÑÑевÑм Ñловом EXPLAIN, MySQL ÑообÑÐ¸Ñ Ð¾ Ñом, как бÑÐ´ÐµÑ Ð¿ÑоизводиÑÑÑÑ Ð¾Ð±ÑабоÑка SELECT, и пÑедоÑÑÐ°Ð²Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ поÑÑдке и меÑоде ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ ÑаблиÑ.
ÐÑи помоÑи EXPLAIN можно вÑÑÑниÑÑ, когда ÑÑÐ¾Ð¸Ñ ÑнабдиÑÑ ÑаблиÑÑ Ð¸Ð½Ð´ÐµÐºÑами, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð¾Ð»ÐµÐµ бÑÑÑÑÑÑ Ð²ÑбоÑкÑ, иÑполÑзÑÑÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка запиÑей. ÐÑоме Ñого, можно пÑовеÑиÑÑ, наÑколÑко ÑдаÑнÑй поÑÑдок ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð±Ñл вÑбÑан опÑимизаÑоÑом. ÐаÑÑавиÑÑ Ð¾Ð¿ÑимизаÑÐ¾Ñ ÑвÑзÑваÑÑ ÑаблиÑÑ Ð² заданном поÑÑдке можно пÑи помоÑи ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ STRAIGHT_JOIN.
ÐÐ»Ñ Ð½ÐµÐ¿ÑоÑÑÑÑ
Ñоединений EXPLAIN возвÑаÑÐ°ÐµÑ ÑÑÑÐ¾ÐºÑ Ð¸Ð½ÑоÑмаÑии о каждой из иÑполÑзованнÑÑ
в ÑабоÑе опеÑаÑоÑа SELECT ÑаблиÑ. ТаблиÑÑ Ð¿ÐµÑеÑиÑлÑÑÑÑÑ Ð² Ñом поÑÑдке, в коÑоÑом они бÑдÑÑ ÑÑиÑÑваÑÑÑÑ. MySQL вÑполнÑÐµÑ Ð²Ñе ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ Ð·Ð° один пÑоÑ
од (меÑод назÑваеÑÑÑ "single-sweep multi-join"). ÐелаеÑÑÑ ÑÑо Ñак: MySQL ÑиÑÐ°ÐµÑ ÑÑÑÐ¾ÐºÑ Ð¸Ð· пеÑвой ÑаблиÑÑ, наÑ
Ð¾Ð´Ð¸Ñ ÑовпадаÑÑÑÑ ÑÑÑÐ¾ÐºÑ Ð²Ð¾ вÑоÑой ÑаблиÑе, заÑем - в ÑÑеÑÑей, и Ñак далее. Ðогда обÑабоÑка вÑеÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ, MySQL вÑÐ´Ð°ÐµÑ Ð²ÑбÑаннÑе ÑÑолбÑÑ Ð¸ обÑ
Ð¾Ð´Ð¸Ñ Ð² обÑаÑном поÑÑдке ÑпиÑок ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð¾ ÑеÑ
поÑ, пока не бÑÐ´ÐµÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ð° ÑаблиÑа Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑÑим Ñовпадением ÑÑÑок. СледÑÑÑÐ°Ñ ÑÑÑока ÑÑиÑÑваеÑÑÑ Ð¸Ð· ÑÑой ÑаблиÑÑ Ð¸ пÑоÑеÑÑ Ð¿ÑодолжаеÑÑÑ Ð² ÑледÑÑÑей ÑаблиÑе.
```java
********************** 1. row **********************
id: 1
select_type: SIMPLE
table: categories
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4
Extra:
1 row in set (0.00 sec)
```
+ id â поÑÑдковÑй Ð½Ð¾Ð¼ÐµÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ SELECTâа внÑÑÑи запÑоÑа (когда имееÑÑÑ Ð½ÐµÑколÑко подзапÑоÑов)
select_type â Ñип запÑоÑа SELECT.
+ SIMPLE â ÐÑоÑÑой запÑÐ¾Ñ SELECT без подзапÑоÑов или UNIONâов
+ PRIMARY â даннÑй SELECT â ÑамÑй внеÑний запÑÐ¾Ñ Ð² JOINâе
+ DERIVED â даннÑй SELECT ÑвлÑеÑÑÑ ÑаÑÑÑÑ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑа внÑÑÑи FROM
+ SUBQUERY â пеÑвÑй SELECT в подзапÑоÑе
+ DEPENDENT SUBQUERY â подзапÑоÑ, коÑоÑÑй завиÑÐ¸Ñ Ð¾Ñ Ð²Ð½ÐµÑнего запÑоÑа
+ UNCACHABLE SUBQUERY â не кеÑиÑÑемÑй подзапÑÐ¾Ñ (ÑÑÑеÑÑвÑÑÑ Ð¾Ð¿ÑеделеннÑе ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑÐ¾Ñ ÐºÐµÑиÑовалÑÑ)
+ UNION â вÑоÑой или поÑледÑÑÑий SELECT в UNIONâе
+ DEPENDENT UNION â вÑоÑой или поÑледÑÑÑий SELECT в UNIONâе, завиÑимÑй Ð¾Ñ Ð²Ð½ÐµÑнего запÑоÑа
+ UNION RESULT â ÑезÑлÑÑÐ°Ñ UNIONâа
+ Table â ÑаблиÑа, к коÑоÑой оÑноÑиÑÑÑ Ð²ÑÐ²Ð¾Ð´Ð¸Ð¼Ð°Ñ ÑÑÑока
+ Type â ÑказÑÐ²Ð°ÐµÑ Ð½Ð° Ñо, как MySQL ÑвÑзÑÐ²Ð°ÐµÑ Ð¸ÑполÑзÑемÑе ÑаблиÑÑ. ÐÑо одно из наиболее полезнÑÑ
полей в вÑводе поÑомÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑообÑаÑÑ Ð¾Ð± оÑÑÑÑÑÑвÑÑÑиÑ
индекÑаÑ
или поÑÐµÐ¼Ñ Ð½Ð°Ð¿Ð¸ÑаннÑй запÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¿ÐµÑеÑмоÑÑен и пеÑепиÑан.
ÐозможнÑе знаÑениÑ:
+ System â ÑаблиÑа Ð¸Ð¼ÐµÐµÑ ÑолÑко Ð¾Ð´Ð½Ñ ÑÑÑокÑ
+ Const â ÑаблиÑа Ð¸Ð¼ÐµÐµÑ ÑолÑко Ð¾Ð´Ð½Ñ ÑооÑвеÑÑÑвÑÑÑÑÑ ÑÑÑокÑ, коÑоÑÐ°Ñ Ð¿ÑоиндекÑиÑована. ÐÑо наиболее бÑÑÑÑÑй Ñип ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑомÑ, ÑÑо ÑаблиÑа ÑиÑаеÑÑÑ ÑолÑко один Ñаз и знаÑение ÑÑÑоки Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾ÑпÑинимаÑÑÑÑ Ð¿Ñи далÑнейÑиÑ
ÑоединениÑÑ
как конÑÑанÑа.
+ Eq_ref â вÑе ÑаÑÑи индекÑа иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ ÑвÑзÑваниÑ. ÐÑполÑзÑемÑе индекÑÑ: PRIMARY KEY или UNIQUE NOT NULL. ÐÑо еÑе один наилÑÑÑий возможнÑй Ñип ÑвÑзÑваниÑ.
+ Ref â вÑе ÑооÑвеÑÑÑвÑÑÑие ÑÑÑоки индекÑного ÑÑолбÑа ÑÑиÑÑваÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ комбинаÑии ÑÑÑок из пÑедÑдÑÑей ÑаблиÑÑ. ÐÑÐ¾Ñ Ñип ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑиÑованнÑÑ
ÑÑолбÑов вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº иÑполÑзование опеÑаÑоÑов = или < = >
+ Fulltext â Ñоединение иÑполÑзÑÐµÑ Ð¿Ð¾Ð»Ð½Ð¾ÑекÑÑовÑй Ð¸Ð½Ð´ÐµÐºÑ ÑаблиÑÑ
+ Ref_or_null â Ñо же Ñамое, ÑÑо и ref, но Ñакже ÑодеÑÐ¶Ð¸Ñ ÑÑÑоки Ñо знаÑением null Ð´Ð»Ñ ÑÑолбÑа
+ Index_merge â Ñоединение иÑполÑзÑÐµÑ ÑпиÑок индекÑов Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑезÑлÑÑиÑÑÑÑего набоÑа. СÑÐ¾Ð»Ð±ÐµÑ key вÑвода ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ EXPLAIN бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑпиÑок иÑполÑзованнÑÑ
индекÑов.
+ Unique_subquery â подзапÑÐ¾Ñ IN возвÑаÑÐ°ÐµÑ ÑолÑко один ÑезÑлÑÑÐ°Ñ Ð¸Ð· ÑаблиÑÑ Ð¸ иÑполÑзÑÐµÑ Ð¿ÐµÑвиÑнÑй клÑÑ.
+ Index_subquery â Ñоже, ÑÑо и пÑедÑдÑÑий, но возвÑаÑÐ°ÐµÑ Ð±Ð¾Ð»ÐµÐµ одного ÑезÑлÑÑаÑа.
+ Range â индекÑ, иÑполÑзованнÑй Ð´Ð»Ñ Ð½Ð°Ñ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑей ÑÑÑоки в опÑеделенном диапазоне, обÑÑно, когда клÑÑевой ÑÑÐ¾Ð»Ð±ÐµÑ ÑÑавниваеÑÑÑ Ñ ÐºÐ¾Ð½ÑÑанÑой, иÑполÑзÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð²Ñоде: BETWEEN, IN, >, >=, etc.
+ Index â ÑканиÑÑеÑÑÑ Ð²Ñе деÑево индекÑов Ð´Ð»Ñ Ð½Ð°Ñ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑиÑ
ÑÑÑок.
+ All â ÐÐ»Ñ Ð½Ð°Ñ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑиÑ
ÑÑÑок иÑполÑзÑÑÑÑÑ ÑканиÑование вÑей ÑаблиÑÑ. ÐÑо наиÑ
ÑдÑий Ñип ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸ обÑÑно ÑказÑÐ²Ð°ÐµÑ Ð½Ð° оÑÑÑÑÑÑвие подÑ
одÑÑиÑ
индекÑов в ÑаблиÑе.
+ Possible_keys â показÑÐ²Ð°ÐµÑ Ð¸Ð½Ð´ÐµÐºÑÑ, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð½Ð°Ñ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑÑÑок в ÑаблиÑе. Ðа пÑакÑике они могÑÑ Ð¸ÑполÑзоваÑÑÑÑ, а могÑÑ Ð¸ не иÑполÑзоваÑÑÑÑ. ФакÑиÑеÑки, ÑÑÐ¾Ñ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¼Ð¾Ð¶ÐµÑ ÑоÑлÑжиÑÑ Ð´Ð¾Ð±ÑÑÑ ÑлÑÐ¶Ð±Ñ Ð² деле опÑимизаÑии запÑоÑов, Ñ.к знаÑение NULL ÑказÑÐ²Ð°ÐµÑ Ð½Ð° Ñо, ÑÑо не найдено ни одного подÑ
одÑÑего индекÑа .
+ Keyâ ÑказÑÐ²Ð°ÐµÑ Ð½Ð° иÑполÑзованнÑй индекÑ. ÐÑÐ¾Ñ ÑÑÐ¾Ð»Ð±ÐµÑ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¸Ð½Ð´ÐµÐºÑ, не ÑказаннÑй в ÑÑолбÑе possible_keys. РпÑоÑеÑÑе ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð¾Ð¿ÑимизаÑÐ¾Ñ Ð¸ÑÐµÑ Ð½Ð°Ð¸Ð»ÑÑÑие ваÑианÑÑ Ð¸ Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°Ð¹Ñи клÑÑи, коÑоÑÑе не оÑобÑÐ°Ð¶ÐµÐ½Ñ Ð² possible_keys, но ÑвлÑÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ опÑималÑнÑми Ð´Ð»Ñ Ð¸ÑполÑзованиÑ.
+ Key_len â длина индекÑа, коÑоÑÑÑ Ð¾Ð¿ÑимизаÑÐ¾Ñ MySQL вÑбÑал Ð´Ð»Ñ Ð¸ÑполÑзованиÑ. ÐапÑимеÑ, знаÑение key_len, Ñавное 4, ознаÑаеÑ, ÑÑо памÑÑи ÑÑебÑеÑÑÑ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ 4 знаков. Ðа ÑÑÑ ÑÐµÐ¼Ñ Ð²Ð¾Ñ cÑÑлка
+ Ref â ÑказÑваÑÑÑÑ ÑÑолбÑÑ Ð¸Ð»Ð¸ конÑÑанÑÑ, коÑоÑÑе ÑÑавниваÑÑÑÑ Ñ Ð¸Ð½Ð´ÐµÐºÑом, ÑказаннÑм в поле key. MySQL вÑбеÑÐµÑ Ð»Ð¸Ð±Ð¾ знаÑение конÑÑанÑÑ Ð´Ð»Ñ ÑÑавнениÑ, либо Ñамо поле, оÑновÑваÑÑÑ Ð½Ð° плане вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа.
+ Rows â оÑобÑÐ°Ð¶Ð°ÐµÑ ÑиÑло запиÑей, обÑабоÑаннÑÑ
Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð²ÑÑ
однÑÑ
даннÑÑ
. ÐÑо еÑе одно оÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð¾Ðµ поле, коÑоÑое Ð´Ð°ÐµÑ Ð¿Ð¾Ð²Ð¾Ð´ опÑимизиÑоваÑÑ Ð·Ð°Ð¿ÑоÑÑ, оÑобенно Ñе, коÑоÑÑе иÑполÑзÑÑÑ JOINâÑ Ð¸ подзапÑоÑÑ.
+ Extra â ÑодеÑÐ¶Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, оÑноÑÑÑÑÑÑÑ Ðº Ð¿Ð»Ð°Ð½Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. Такие знаÑÐµÐ½Ð¸Ñ ÐºÐ°Ðº âUsing temporaryâ, âUsing filesortâ и Ñ.д могÑÑ Ð±ÑÑÑ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑоÑом пÑоблемного запÑоÑа. С полнÑм ÑпиÑком возможнÑÑ
знаÑений Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ознакомиÑÑÑÑ Ð·Ð´ÐµÑÑ
[к оглавлениÑ](#sql)
## ЧÑо Ñакое _«RETURNING»_?
Ðногда бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ полÑÑаÑÑ Ð´Ð°Ð½Ð½Ñе из модиÑиÑиÑÑемÑÑ
ÑÑÑок в пÑоÑеÑÑе иÑ
обÑабоÑки. ÐÑо возможно Ñ Ð¸ÑполÑзованием пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ RETURNING, коÑоÑое можно задаÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ INSERT, UPDATE и DELETE. ÐÑименение RETURNING позволÑÐµÑ Ð¾Ð±Ð¾Ð¹ÑиÑÑ Ð±ÐµÐ· дополниÑелÑного запÑоÑа к базе Ð´Ð»Ñ ÑбоÑа даннÑÑ
и ÑÑо оÑобенно Ñенно, когда как-Ñо инаÑе ÑÑÑдно полÑÑиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑннÑе ÑÑÑоки надÑжнÑм обÑазом.
ТоÑно ÑабоÑÐ°ÐµÑ Ð² PostgreSQL
```java
INSERT INTO users (firstname, lastname) VALUES ('Joe', 'Cool') RETURNING id;
Ркоманде UPDATE даннÑе, вÑдаваемÑе в RETURNING, обÑазÑÑÑÑÑ Ð½Ð¾Ð²Ñм ÑодеÑжимÑм изменÑнной ÑÑÑоки. ÐапÑимеÑ:
UPDATE products SET price = price * 1.10
WHERE price <= 99.99
RETURNING name, price AS new_price;
Ркоманде DELETE даннÑе, вÑдаваемÑе в RETURNING, обÑазÑÑÑÑÑ ÑодеÑжимÑм ÑдалÑнной ÑÑÑоки. ÐапÑимеÑ:
DELETE FROM products
WHERE obsoletion_date = 'today'
RETURNING *;
```
[к оглавлениÑ](#sql)
## ЧÑо Ñакое _«Ñ
ÑÐ°Ð½Ð¸Ð¼Ð°Ñ Ð¿ÑоÑедÑÑа»_?
__Ð¥ÑÐ°Ð½Ð¸Ð¼Ð°Ñ Ð¿ÑоÑедÑÑа__ â обÑÐµÐºÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, пÑедÑÑавлÑÑÑий Ñобой Ð½Ð°Ð±Ð¾Ñ SQL-инÑÑÑÑкÑий, коÑоÑÑй Ñ
ÑаниÑÑÑ Ð½Ð° ÑеÑвеÑе. Ð¥ÑанимÑе пÑоÑедÑÑÑ Ð¾ÑÐµÐ½Ñ Ð¿Ð¾Ñ
ожи на обÑкновеннÑе пÑоÑедÑÑÑ ÑзÑков вÑÑокого ÑÑовнÑ, Ñ Ð½Ð¸Ñ
могÑÑ Ð±ÑÑÑ Ð²Ñ
однÑе и вÑÑ
однÑе паÑамеÑÑÑ Ð¸ локалÑнÑе пеÑеменнÑе, в ниÑ
могÑÑ Ð¿ÑоизводиÑÑÑÑ ÑиÑловÑе вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¸ опеÑаÑии над ÑимволÑнÑми даннÑми, ÑезÑлÑÑаÑÑ ÐºÐ¾ÑоÑÑÑ
могÑÑ Ð¿ÑиÑваиваÑÑÑÑ Ð¿ÐµÑеменнÑм и паÑамеÑÑам. Ð Ñ
ÑанимÑÑ
пÑоÑедÑÑаÑ
могÑÑ Ð²ÑполнÑÑÑÑÑ ÑÑандаÑÑнÑе опеÑаÑии Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ даннÑÑ
(как DDL, Ñак и DML). ÐÑоме Ñого, в Ñ
ÑанимÑÑ
пÑоÑедÑÑаÑ
Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑÐ¸ÐºÐ»Ñ Ð¸ веÑвлениÑ, Ñо еÑÑÑ Ð² ниÑ
могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¸Ð½ÑÑÑÑкÑии ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÑоÑеÑÑом иÑполнениÑ.
Ð¥ÑанимÑе пÑоÑедÑÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð¿Ð¾Ð²ÑÑиÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ, ÑаÑÑиÑÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ поддеÑживаÑÑ ÑÑнкÑии безопаÑноÑÑи даннÑÑ
. РболÑÑинÑÑве СУÐРпÑи пеÑвом запÑÑке Ñ
Ñанимой пÑоÑедÑÑÑ Ð¾Ð½Ð° компилиÑÑеÑÑÑ (вÑполнÑеÑÑÑ ÑинÑакÑиÑеÑкий анализ и генеÑиÑÑеÑÑÑ Ð¿Ð»Ð°Ð½ доÑÑÑпа к даннÑм) и в далÑнейÑем ÐµÑ Ð¾Ð±ÑабоÑка оÑÑÑеÑÑвлÑеÑÑÑ Ð±ÑÑÑÑее.
[к оглавлениÑ](#sql)
## ЧÑо Ñакое _«ÑÑиггеÑ»_?
__ТÑÐ¸Ð³Ð³ÐµÑ (trigger)__ â ÑÑо Ñ
ÑÐ°Ð½Ð¸Ð¼Ð°Ñ Ð¿ÑоÑедÑÑа оÑобого Ñипа, коÑоÑÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð½Ðµ вÑзÑÐ²Ð°ÐµÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно, а иÑполнение коÑоÑой обÑÑловлено дейÑÑвием по модиÑикаÑии даннÑÑ
: добавлением, Ñдалением или изменением даннÑÑ
в заданной ÑаблиÑе ÑелÑÑионной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ТÑиггеÑÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи даннÑÑ
и ÑеализаÑии Ñложной бизнеÑ-логики. ТÑÐ¸Ð³Ð³ÐµÑ Ð·Ð°Ð¿ÑÑкаеÑÑÑ ÑеÑвеÑом авÑомаÑиÑеÑки и вÑе пÑоизводимÑе им модиÑикаÑии даннÑÑ
ÑаÑÑмаÑÑиваÑÑÑÑ ÐºÐ°Ðº вÑполнÑемÑе в ÑÑанзакÑии, в коÑоÑой вÑполнено дейÑÑвие, вÑзвавÑее ÑÑабаÑÑвание ÑÑиггеÑа. СооÑвеÑÑÑвенно, в ÑлÑÑае обнаÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¾Ñибки или наÑÑÑÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи даннÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизойÑи оÑÐºÐ°Ñ ÑÑой ÑÑанзакÑии.
ÐÐ¾Ð¼ÐµÐ½Ñ Ð·Ð°Ð¿ÑÑка ÑÑиггеÑа опÑеделÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»ÑÑевÑÑ
Ñлов `BEFORE` (ÑÑÐ¸Ð³Ð³ÐµÑ Ð·Ð°Ð¿ÑÑкаеÑÑÑ Ð´Ð¾ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑвÑзанного Ñ Ð½Ð¸Ð¼ ÑобÑÑиÑ) или `AFTER` (поÑле ÑобÑÑиÑ). Ð ÑлÑÑае, еÑли ÑÑÐ¸Ð³Ð³ÐµÑ Ð²ÑзÑваеÑÑÑ Ð´Ð¾ ÑобÑÑиÑ, он Ð¼Ð¾Ð¶ÐµÑ Ð²Ð½ÐµÑÑи Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² модиÑиÑиÑÑемÑÑ ÑобÑÑием запиÑÑ. ÐÑоме Ñого, ÑÑиггеÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿ÑивÑÐ·Ð°Ð½Ñ Ð½Ðµ к ÑаблиÑе, а к пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (VIEW). Ð ÑÑом ÑлÑÑае Ñ Ð¸Ñ
помоÑÑÑ ÑеализÑеÑÑÑ Ð¼ÐµÑ
анизм «обновлÑемого пÑедÑÑавлениÑ». Ð ÑÑом ÑлÑÑае клÑÑевÑе Ñлова `BEFORE` и `AFTER` влиÑÑÑ Ð»Ð¸ÑÑ Ð½Ð° поÑледоваÑелÑноÑÑÑ Ð²Ñзова ÑÑиггеÑов, Ñак как ÑобÑÑвенно ÑобÑÑие (Ñдаление, вÑÑавка или обновление) не пÑоиÑÑ
одиÑ.
[к оглавлениÑ](#sql)
## ЧÑо Ñакое _«кÑÑÑоÑ»_?
__ÐÑÑÑоÑ__ â ÑÑо обÑÐµÐºÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, коÑоÑÑй позволÑÐµÑ Ð¿ÑиложениÑм ÑабоÑаÑÑ Ñ Ð·Ð°Ð¿Ð¸ÑÑми «по-одной», а не ÑÑÐ°Ð·Ñ Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвом, как ÑÑо делаеÑÑÑ Ð² обÑÑнÑÑ
SQL командаÑ
.
ÐоÑÑдок ÑабоÑÑ Ñ ÐºÑÑÑоÑом Ñакой:
+ ÐпÑеделиÑÑ ÐºÑÑÑÐ¾Ñ (`DECLARE`)
+ ÐÑкÑÑÑÑ ÐºÑÑÑÐ¾Ñ (`OPEN`)
+ ÐолÑÑиÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸Ð· кÑÑÑоÑа (`FETCH`)
+ ÐбÑабоÑаÑÑ Ð·Ð°Ð¿Ð¸ÑÑ...
+ ÐакÑÑÑÑ ÐºÑÑÑÐ¾Ñ (`CLOSE`)
+ УдалиÑÑ ÑÑÑÐ»ÐºÑ ÐºÑÑÑоÑа (`DEALLOCATE`). Ðогда ÑдалÑеÑÑÑ Ð¿Ð¾ÑледнÑÑ ÑÑÑлка кÑÑÑоÑа, SQL оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
, ÑоÑÑавлÑÑÑие кÑÑÑоÑ.
[к оглавлениÑ](#sql)
## ÐпиÑиÑе ÑазниÑÑ Ñипов даннÑÑ
`DATETIME` и `TIMESTAMP`.
`DATETIME` пÑедназнаÑен Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ñелого ÑиÑла: `YYYYMMDDHHMMSS`. Ð ÑÑо вÑÐµÐ¼Ñ Ð½Ðµ завиÑÐ¸Ñ Ð¾Ñ Ð²Ñеменной Ð·Ð¾Ð½Ñ Ð½Ð°ÑÑÑоенной на ÑеÑвеÑе.
РазмеÑ: 8 байÑ
`TIMESTAMP` Ñ
ÑÐ°Ð½Ð¸Ñ Ð·Ð½Ð°Ñение Ñавное колиÑеÑÑÐ²Ñ ÑекÑнд, пÑоÑедÑиÑ
Ñ Ð¿Ð¾Ð»ÑноÑи 1 ÑнваÑÑ 1970 года по ÑÑÑеднÑÐ½Ð½Ð¾Ð¼Ñ Ð²Ñемени ÐÑинвиÑа. ÐÑи полÑÑении из Ð±Ð°Ð·Ñ Ð¾ÑобÑажаеÑÑÑ Ñ ÑÑÑÑом ÑаÑового поÑÑа. РазмеÑ: 4 байÑа
[к оглавлениÑ](#sql)
## ÐÐ»Ñ ÐºÐ°ÐºÐ¸Ñ
ÑиÑловÑÑ
Ñипов недопÑÑÑимо иÑполÑзоваÑÑ Ð¾Ð¿ÐµÑаÑии ÑложениÑ/вÑÑиÑаниÑ?
РкаÑеÑÑве опеÑандов опеÑаÑий ÑÐ»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸ вÑÑиÑÐ°Ð½Ð¸Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð¸ÑполÑзоваÑÑ ÑиÑловой Ñип `BIT`.
[к оглавлениÑ](#sql)
## Ðакое назнаÑение Ñ Ð¾Ð¿ÐµÑаÑоÑов `PIVOT` и `UNPIVOT` в Transact-SQL?
`PIVOT` и `UNPIVOT` ÑвлÑÑÑÑÑ Ð½ÐµÑÑандаÑÑнÑми ÑелÑÑионнÑми опеÑаÑоÑами, коÑоÑÑе поддеÑживаÑÑÑÑ Transact-SQL.
ÐпеÑаÑÐ¾Ñ `PIVOT` ÑазвоÑаÑÐ¸Ð²Ð°ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑее ÑаблиÑное знаÑение вÑÑажение, пÑеобÑазÑÑ ÑникалÑнÑе знаÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² неÑколÑко вÑÑ
однÑÑ
ÑÑолбÑов, а Ñакже, в ÑлÑÑае необÑ
одимоÑÑи, обÑединÑÐµÑ Ð¾ÑÑавÑиеÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑиеÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑÑолбÑа и оÑобÑÐ°Ð¶Ð°ÐµÑ Ð¸Ñ
в вÑÑ
однÑÑ
даннÑÑ
. ÐпеÑаÑÐ¾Ñ `UNPIVOT` пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ð´ÐµÐ¹ÑÑвиÑ, обÑаÑнÑе `PIVOT`, пÑеобÑазÑÑ ÑÑолбÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑего ÑаблиÑное знаÑение вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² знаÑÐµÐ½Ð¸Ñ ÑÑолбÑа.
[к оглавлениÑ](#sql)
## РаÑÑкажиÑе об оÑновнÑÑ
ÑÑнкÑиÑÑ
ÑанжиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² Transact-SQL.
РанжиÑÑÑÑие ÑÑнкÑии - ÑÑо ÑÑнкÑии, коÑоÑÑе возвÑаÑаÑÑ Ð·Ð½Ð°Ñение Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи гÑÑÐ¿Ð¿Ñ Ð² ÑезÑлÑÑиÑÑÑÑем набоÑе даннÑÑ
. Ðа пÑакÑике они могÑÑ Ð±ÑÑÑ Ð¸ÑполÑзованÑ, напÑимеÑ, Ð´Ð»Ñ Ð¿ÑоÑÑой нÑмеÑаÑии ÑпиÑка, ÑоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑейÑинга или поÑÑÑаниÑной навигаÑии.
`ROW_NUMBER` â ÑÑнкÑÐ¸Ñ Ð½ÑмеÑаÑии в Transact-SQL, коÑоÑÐ°Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¿ÑоÑÑо Ð½Ð¾Ð¼ÐµÑ Ð·Ð°Ð¿Ð¸Ñи.
`RANK` возвÑаÑÐ°ÐµÑ Ñанг каждой запиÑи. Рданном ÑлÑÑае, в оÑлиÑие Ð¾Ñ `ROW_NUMBER`, Ð¸Ð´ÐµÑ Ñже анализ знаÑений и в ÑлÑÑае наÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²ÑÑ
возвÑаÑÐ°ÐµÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñй Ñанг Ñ Ð¿ÑопÑÑком ÑледÑÑÑего.
`DENSE_RANK` Ñак же возвÑаÑÐ°ÐµÑ Ñанг каждой запиÑи, но в оÑлиÑие Ð¾Ñ `RANK` в ÑлÑÑае наÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²ÑÑ
знаÑений возвÑаÑÐ°ÐµÑ Ñанг без пÑопÑÑка ÑледÑÑÑего.
`NTILE` â ÑÑнкÑÐ¸Ñ Transact-SQL, коÑоÑÐ°Ñ Ð´ÐµÐ»Ð¸Ñ ÑезÑлÑÑиÑÑÑÑий Ð½Ð°Ð±Ð¾Ñ Ð½Ð° гÑÑÐ¿Ð¿Ñ Ð¿Ð¾ опÑÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ.
[к оглавлениÑ](#sql)
## ÐÐ»Ñ Ñего иÑполÑзÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ `INTERSECT`, `EXCEPT` в Transact-SQL?
ÐпеÑаÑÐ¾Ñ `EXCEPT` возвÑаÑÐ°ÐµÑ ÑникалÑнÑе запиÑи из левого вÑ
одного запÑоÑа, коÑоÑÑе не вÑводÑÑÑÑ Ð¿ÑавÑм вÑ
однÑм запÑоÑом.
ÐпеÑаÑÐ¾Ñ `INTERSECT` возвÑаÑÐ°ÐµÑ ÑникалÑнÑе запиÑи, вÑводимÑе левÑм и пÑавÑм вÑ
однÑми запÑоÑами.
[к оглавлениÑ](#sql)
## ÐапиÑиÑе запÑоÑ...
```sql
CREATE TABLE table (
id BIGINT(20) NOT NULL AUTO_INCREMENT,
created TIMESTAMP NOT NULL DEFAULT 0,
PRIMARY KEY (id)
);
```
ТÑебÑеÑÑÑ Ð½Ð°Ð¿Ð¸ÑаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ ÐºÐ¾ÑоÑÑй веÑÐ½ÐµÑ Ð¼Ð°ÐºÑималÑное знаÑение `id` и знаÑение `created` Ð´Ð»Ñ ÑÑого `id`:
```sql
SELECT id, created FROM table where id = (SELECT MAX(id) FROM table);
```
---
```sql
CREATE TABLE track_downloads (
download_id BIGINT(20) NOT NULL AUTO_INCREMENT,
track_id INT NOT NULL,
user_id BIGINT(20) NOT NULL,
download_time TIMESTAMP NOT NULL DEFAULT 0,
PRIMARY KEY (download_id)
);
```
ÐапиÑиÑе SQL-запÑоÑ, возвÑаÑаÑÑий вÑе паÑÑ `(download_count, user_count)`, ÑдовлеÑвоÑÑÑÑие ÑледÑÑÑÐµÐ¼Ñ ÑÑловиÑ: `user_count` â обÑее ненÑлевое ÑиÑло полÑзоваÑелей, ÑделавÑиÑ
Ñовно `download_count` ÑкаÑиваний `19 ноÑбÑÑ 2010 года`:
```sql
SELECT DISTINCT download_count, COUNT(*) AS user_count
FROM (
SELECT COUNT(*) AS download_count
FROM track_downloads WHERE download_time="2010-11-19"
GROUP BY user_id)
AS download_count
GROUP BY download_count;
```
[к оглавлениÑ](#sql)
# ÐÑÑоÑники
+ [ÐикипедиÑ](https://ru.wikipedia.org/wiki/SQL)
+ [Quizful](http://www.quizful.net/interview/sql)
[ÐопÑоÑÑ Ð´Ð»Ñ ÑобеÑедованиÑ](README.md)