Учебник по языку sql (ddl, dml) на примере диалекта ms sql server. часть третья
Содержание:
- SQL Предикат существования EXISTS
- ОграниченияLimitations and Restrictions
- Задание псевдонимов для столбцов запроса
- Основные арифметические операторы SQL
- Выражение CASE – условный оператор языка SQL
- SELECT для выбора столбцов таблицы
- SQL Учебник
- SQL запрос Union (объединение)
- Практическое упражнение №3
- Как написать электронное письмо (email) на английском
- Условие выборки – оператор WHERE
- SQL References
- SQL References
- Б.B. Использование SELECT с заголовками столбцов и вычислениямиUsing SELECT with column headings and calculations
- Сеть видеокамер в Стамбуле распознаёт 15 000 лиц в секунду
- Соединения (джойны)
- 5. Агрегирование
- 6. Подзапросы
- См. также:See Also
- Правовая информация
- Пример выборки всех полей из одной таблицы
- Итог
SQL Предикат существования EXISTS
В языке SQL есть средства для выполнения операций пересечения и разности запросов — предложение (пересечение) и предложение (разность). Эти предложения работают подобно тому, как работает : в результирующий набор попадают только те строки, которые присутствуют в обоих запросах — , или только те строки первого запроса, которые отсутствуют во втором — . Но беда в том, что многие СУБД не поддерживают эти предложения. Но выход есть — использование предиката .
Пример: Найти тех производителей компьютеров, которые производят также и ноутбуки
Решение:
1 2 3 4 5 6 7 8 9 |
SELECT DISTINCT Производитель FROM product AS pc_product WHERE Тип = "Компьютер" AND EXISTS ( SELECT Производитель FROM product WHERE Тип = "Ноутбук" AND Производитель = pc_product.Производитель ) |
Результат:
SQL Exists 1. Найти тех производителей компьютеров, которые не производят принтеров
ОграниченияLimitations and Restrictions
В качестве новой таблицы нельзя указывать табличную переменную или возвращающий табличное значение параметр.You cannot specify a table variable or table-valued parameter as the new table.
Инструкцию нельзя использовать для создания секционированной таблицы, даже если исходная таблица является секционированной.You cannot use to create a partitioned table, even when the source table is partitioned. Инструкция не использует схему секционирования исходной таблицы. Вместо этого новая таблица создается в файловой группе по умолчанию. does not use the partition scheme of the source table; instead, the new table is created in the default filegroup. Для вставки строк в секционированную таблицу необходимо сначала создать секционированную таблицу, а затем использовать инструкцию .To insert rows into a partitioned table, you must first create the partitioned table and then use the statement.
Индексы, ограничения и триггеры, определенные в исходной таблице, не переносятся в новую таблицу, их также нельзя указывать в инструкции .Indexes, constraints, and triggers defined in the source table are not transferred to the new table, nor can they be specified in the statement. Если эти объекты нужны для дальнейшей работы, их можно создать после выполнения инструкции .If these objects are required, you can create them after executing the statement.
Указание предложения не гарантирует, что строки будут вставлены в указанном порядке.Specifying an clause does not guarantee the rows are inserted in the specified order.
Если в список выбора входит разреженный столбец, то свойство разреженного столбца не передается столбцу в новой таблице.When a sparse column is included in the select list, the sparse column property does not transfer to the column in the new table. Если это свойство необходимо в новой таблице, измените определение столбца после выполнения инструкции SELECT…INTO для включения этого свойства.If this property is required in the new table, alter the column definition after executing the SELECT…INTO statement to include this property.
Если в список выбора входит вычисляемый столбец, соответствующий столбец новой таблицы не будет вычисляемым.When a computed column is included in the select list, the corresponding column in the new table is not a computed column. Значениями нового столбца становятся значения, вычисленные при выполнении инструкции .The values in the new column are the values that were computed at the time was executed.
Задание псевдонимов для столбцов запроса
ФИО | Дата приема | Дата рождения | ZP |
---|---|---|---|
Иванов Иван Иванович | 2015-04-08 | 1955-02-19 | 5000 |
Петров Петр Петрович | 2015-04-08 | 1983-12-03 | 1500 |
NULL | 2015-04-08 | 1976-06-07 | 2500 |
NULL | 2015-04-08 | 1982-04-17 | 2000 |
FullName1 | FullName2 | FullName3 |
---|---|---|
Иванов Иван Иванович | Иванов Иван Иванович | Иванов Иван Иванович |
Петров Петр Петрович | Петров Петр Петрович | Петров Петр Петрович |
NULL | Сидоров Сидор | Сидоров Сидор |
NULL | Андреев Андрей | Андреев Андрей |
Основные арифметические операторы SQL
Оператор | Действие |
---|---|
+ | Сложение (x+y) или унарный плюс (+x) |
— | Вычитание (x-y) или унарный минус (-x) |
* | Умножение (x*y) |
Деление (x/y) | |
% | Остаток от деления (x%y). Для примера 15%10 даст 5 |
ID | Name | Result1 | Result2 | Result3 |
---|---|---|---|---|
1000 | Иванов И.И. | 2500 | 2500 | 2500 |
1001 | Петров П.П. | 225 | 225 | 225 |
1002 | Сидоров С.С. | NULL | ||
1003 | Андреев А.А. | 600 | 600 | 600 |
1004 | Николаев Н.Н. | NULL | ||
1005 | Александров А.А. | NULL |
ID | Name |
---|---|
1000 | Иванов И.И. |
1004 | Николаев Н.Н. |
1002 | Сидоров С.С. |
Выражение CASE – условный оператор языка SQL
Первая форма: | Вторая форма: |
---|---|
CASE WHEN условие_1 THEN возвращаемое_значение_1 … WHEN условие_N THEN возвращаемое_значение_N END |
CASE проверяемое_значение WHEN сравниваемое_значение_1 THEN возвращаемое_значение_1 … WHEN сравниваемое_значение_N THEN возвращаемое_значение_N END |
Разберем на примере первую форму CASE:
ID | Name | Salary | SalaryTypeWithELSE | SalaryTypeWithoutELSE |
---|---|---|---|---|
1000 | Иванов И.И. | 5000 | ЗП >= 3000 | ЗП >= 3000 |
1001 | Петров П.П. | 1500 | ЗП < 2000 | NULL |
1002 | Сидоров С.С. | 2500 | 2000 <= ЗП < 3000 | 2000 <= ЗП < 3000 |
1003 | Андреев А.А. | 2000 | 2000 <= ЗП < 3000 | 2000 <= ЗП < 3000 |
1004 | Николаев Н.Н. | 1500 | ЗП < 2000 | NULL |
1005 | Александров А.А. | 2000 | 2000 <= ЗП < 3000 | 2000 <= ЗП < 3000 |
Разберем на примере вторую форму CASE:
- Сотрудникам ИТ-отдела выдать по 15% от ЗП;
- Сотрудникам Бухгалтерии по 10% от ЗП;
- Всем остальным по 5% от ЗП.
ID | Name | Salary | DepartmentID | NewYearBonusPercent | BonusAmount |
---|---|---|---|---|---|
1000 | Иванов И.И. | 5000 | 1 | 5% | 250 |
1001 | Петров П.П. | 1500 | 3 | 15% | 225 |
1002 | Сидоров С.С. | 2500 | 2 | 10% | 250 |
1003 | Андреев А.А. | 2000 | 3 | 15% | 300 |
1004 | Николаев Н.Н. | 1500 | 3 | 15% | 225 |
1005 | Александров А.А. | 2000 | NULL | 5% | 100 |
- Первым делом ЗП должны получить сотрудники у кого оклад меньше 2500
- Те сотрудники у кого оклад больше или равен 2500, получают ЗП во вторую очередь
- Внутри этих двух групп нужно упорядочить строки по ФИО (поле Name)
ID | Name | Salary |
---|---|---|
1005 | Александров А.А. | 2000 |
1003 | Андреев А.А. | 2000 |
1004 | Николаев Н.Н. | 1500 |
1001 | Петров П.П. | 1500 |
1000 | Иванов И.И. | 5000 |
1002 | Сидоров С.С. | 2500 |
ID | Name | Salary | DepartmentID | NewYearBonusPercent1 | NewYearBonusPercent2 |
---|---|---|---|---|---|
1000 | Иванов И.И. | 5000 | 1 | 5% | 5% |
1001 | Петров П.П. | 1500 | 3 | 15% | 15% |
1002 | Сидоров С.С. | 2500 | 2 | 10% | 10% |
1003 | Андреев А.А. | 2000 | 3 | 15% | 15% |
1004 | Николаев Н.Н. | 1500 | 3 | 15% | 15% |
1005 | Александров А.А. | 2000 | NULL | — | 5% |
SELECT для выбора столбцов таблицы
Запрос с оператором SELECT для выбора всех столбцов таблицы имеет следующий синтаксис:
SELECT * FROM ИМЯ_ТАБЛИЦЫ
То есть для выбора всех столбцов таблицы после слова SELECT нужно ставить звёздочку.
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД
не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.
Работать будем с базой данных фирмы — Company1. Скрипт для создания этой базы данных, её таблиц и заполения таблиц данными —
в файле по этой ссылке.
Пример 1. Итак, есть база данных фирмы — Company1. В ней есть таблица
Org (Структура фирмы) и Staff (Сотрудники). Требуется выбрать из таблиц все столбцы. Соответствующий
запрос для выбора всех столбцов из таблицы Org выглядит следующим образом (на MS SQL Server — с предваряющей конструкцией USE company1;):
SELECT * FROM Org
Этот запрос вернёт следующее (для увеличения картинки щёлкнуть по ней левой кнопкой мыши):
Запрос для выбора всех столбцов из таблицы Staff выглядит следующим образом (на MS SQL Server — с предваряющей конструкцией USE company1;):
SELECT * FROM Staff
Этот запрос вернёт следующее:
Для выбора определённых столбцов таблицы нам потребуется вместо звёздочки перечислить через запятую названия
всех столбцов, которые требуется выбрать:
SELECT ВЫБИРАЕМЫЕ_СТОЛБЦЫ FROM ИМЯ_ТАБЛИЦЫ
Пример 2. Пусть требуется из таблицы Org выбрать столбцы Depnumb и
Deptname, в которых содержатся данные соответственно о номерах отделов фирмы и об их названиях. Запрос для получения такой
выборки будет следующим (на MS SQL Server — с предваряющей конструкцией USE company1;):
SELECT Deptnumb, Deptname, FROM Org
А из таблицы Staff нужно выбрать столбцы Dept, Name, Job, в которых содержатся
соответственно данные о номере отдела, в котором трудится сотрудник, его имени и должности (на MS SQL Server — с предваряющей конструкцией USE company1;):
SELECT Dept, Name, Job FROM Staff
SQL Учебник
SQL ГлавнаяSQL ВведениеSQL СинтаксисSQL SELECTSQL SELECT DISTINCTSQL WHERESQL AND, OR, NOTSQL ORDER BYSQL INSERT INTOSQL Значение NullSQL Инструкция UPDATESQL Инструкция DELETESQL SELECT TOPSQL MIN() и MAX()SQL COUNT(), AVG() и …SQL Оператор LIKESQL ПодстановочныйSQL Оператор INSQL Оператор BETWEENSQL ПсевдонимыSQL JOINSQL JOIN ВнутриSQL JOIN СлеваSQL JOIN СправаSQL JOIN ПолноеSQL JOIN СамSQL Оператор UNIONSQL GROUP BYSQL HAVINGSQL Оператор ExistsSQL Операторы Any, AllSQL SELECT INTOSQL INSERT INTO SELECTSQL Инструкция CASESQL Функции NULLSQL ХранимаяSQL Комментарии
SQL запрос Union (объединение)
Над множеством можно выполнять операции объединения, разности и декартова произведения. Те же операции можно использовать и в sql запросах (выполнять операции с запросами).
Использование оператора требует выполнения нескольких условий:
- количество выходных столбцов каждого из запросов должно быть одинаковым;
- выходные столбцы каждого из запросов должны быть сравнимы между собой по типам данных (в порядке их очередности);
- в итоговом наборе используются имена столбцов, заданные в первом запросе;
- может быть использовано только в конце составного запроса, так как оно применяетя к результату объединения.
Пример: Вывести цены на компьютеры и ноутбуки, а также их номера (т.е. произвести выгрузку из двух разных таблиц в одном запросе)
Решение:
1 2 3 4 5 6 |
SELECT `Номер` , `Цена` FROM pc UNION SELECT `Номер` , `Цена` FROM notebook ORDER BY `Цена` |
Результат:
Рассмотрим более сложный пример с объединением inner join:
Пример: Найти тип продукции, номер и цену компьютеров и ноутбуков
Решение:
1 2 3 4 5 6 7 8 |
SELECT product.`Тип` , pc.`Номер` , `Цена` FROM pc INNER JOIN product ON pc.`Номер` = product.`Номер` UNION SELECT product.`Тип` , notebook.`Номер` , `Цена` FROM notebook INNER JOIN product ON notebook.`Номер` = product.`Номер` ORDER BY `Цена` |
Результат:
SQL Union 1. Найти производителя, номер и цену всех ноутбуков и принтеров
SQL Union 2. Найти номера и цены всех продуктов, выпущенных производителем Россия
Практическое упражнение №3
На основании таблиц suppliers и orders ниже, выберите поля supplier_id и supplier_name из таблицы suppliers, и выберите поле order_date из таблицы orders, где значение поля supplier_id в таблице suppliers соответствует значению поля supplier_id в таблице orders. Сортировать результаты по supplier_id в порядке убывания.
Oracle PL/SQL
—создаем таблицу suppliers
CREATE TABLE suppliers
( supplier_id int NOT NULL,
supplier_name char(50) NOT NULL,
city char(50),
state char(25),
CONSTRAINT suppliers_pk PRIMARY KEY (supplier_id)
);
—вставляем записи в таблицу suppliers
insert into suppliers values (1,’Mari’,’Houston’,’Texas’);
insert into suppliers values (2,’Frida’,’ Melbourne’, ‘Florida’);
insert into suppliers values (3,’Madlen’,’Phoenix’,’Arizona’);
insert into suppliers values (4,’Valentina’,’San Diego’,’California’);
insert into suppliers values (5,’Amba’,’Jacksonville’,’Florida’);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
—создаем таблицу suppliers CREATETABLEsuppliers supplier_namechar(50)NOTNULL, citychar(50), statechar(25), CONSTRAINTsuppliers_pkPRIMARYKEY(supplier_id) insertintosuppliersvalues(1,’Mari’,’Houston’,’Texas’); insertintosuppliersvalues(2,’Frida’,’ Melbourne’,’Florida’); insertintosuppliersvalues(3,’Madlen’,’Phoenix’,’Arizona’); insertintosuppliersvalues(4,’Valentina’,’San Diego’,’California’); insertintosuppliersvalues(5,’Amba’,’Jacksonville’,’Florida’); |
Содержимое таблицы suppliers:
supplier_id | supplier_name | city | state |
---|---|---|---|
1 | Mari | Houston | Texas |
2 | Frida | Philadelphia | Pennsylvania |
3 | Madlen | Phoenix | Arizona |
4 | Valentina | SanDiego | California |
5 | Amba | Jacksonville | Florida |
Oracle PL/SQL
—создаем таблицу orders
CREATE TABLE orders
( order_id int NOT NULL,
supplier_id int NOT NULL,
order_date date NOT NULL,
quantity int,
CONSTRAINT orders_pk PRIMARY KEY (order_id)
);
—вставляем записи в таблицу orders
insert into orders values (1,1,’05.05.2014′,100);
insert into orders values (2,3,’12.02.2015′,300);
insert into orders values (3,5,’12.01.2016′,500);
1 2 3 4 5 6 7 8 9 10 11 12 |
—создаем таблицу orders CREATETABLEorders supplier_idintNOTNULL, order_datedateNOTNULL, quantityint, CONSTRAINTorders_pkPRIMARYKEY(order_id) insertintoordersvalues(1,1,’05.05.2014′,100); insertintoordersvalues(2,3,’12.02.2015′,300); insertintoordersvalues(3,5,’12.01.2016′,500); |
Содержимое таблицы orders:
order_id | supplier_id | order_date | quantity |
---|---|---|---|
1 | 1 | 05.05.2014 | 100 |
2 | 3 | 12.02.2015 | 300 |
3 | 5 | 12.01.2016 | 500 |
Как написать электронное письмо (email) на английском
Условие выборки – оператор WHERE
В процессе выборке достаточно часто нам требуется отфильтровать данные по определенному условию, т.е. не все данные, а только те, которые соответствуют условию, в конструкции SELECT для этого можно использовать оператор WHERE.
SELECT price FROM Table WHERE price > 100
где, WHERE и есть условие, т.е. мы отображаем только те строки, которые соответствуют нашему условию (цена больше 100).
Операторы сравнения в SQL
- «>» – больше чего-либо;
- «<» – меньше чего-нибудь;
- «=» – равно;
- «<>» – не равно;
- «>=» – больше или равно;
- «<=» – меньше или равно.
Также можно указывать в условии ключевое слово BETWEEN, т.е. попадает или не попадает значение в определенный промежуток, например
SELECT price FROM table WHERE price BETWEEN 400 AND 600
где, мы указываем, что цена должна быть в промежутке от 400 до 600.
Для проверки, входит ли значение проверяемого выражения в какой-то определенный набор значений, можно использовать предикат IN.
SELECT price FROM table WHERE price IN (400, 600)
В данном случае мы хотим получить только цену со стоимостью 400 и 600.
Если нам нужно получить только уникальные строки источника, можно указать ключевое слово DISTINCT, например
SELECT DISTINCT price FROM Table WHERE price > 100
Примечание! Язык SQL не чувствителен к регистру, запросы можно писать как в одну строку, так и разбивать их на несколько. Например, следующие два запроса абсолютно одинаковые.
SELECT price FROM Table
и
Select price From Table
SQL References
SQL Keywords
ADD
ADD CONSTRAINT
ALTER
ALTER COLUMN
ALTER TABLE
ALL
AND
ANY
AS
ASC
BACKUP DATABASE
BETWEEN
CASE
CHECK
COLUMN
CONSTRAINT
CREATE
CREATE DATABASE
CREATE INDEX
CREATE OR REPLACE VIEW
CREATE TABLE
CREATE PROCEDURE
CREATE UNIQUE INDEX
CREATE VIEW
DATABASE
DEFAULT
DELETE
DESC
DISTINCT
DROP
DROP COLUMN
DROP CONSTRAINT
DROP DATABASE
DROP DEFAULT
DROP INDEX
DROP TABLE
DROP VIEW
EXEC
EXISTS
FOREIGN KEY
FROM
FULL OUTER JOIN
GROUP BY
HAVING
IN
INDEX
INNER JOIN
INSERT INTO
INSERT INTO SELECT
IS NULL
IS NOT NULL
JOIN
LEFT JOIN
LIKE
LIMIT
NOT
NOT NULL
OR
ORDER BY
OUTER JOIN
PRIMARY KEY
PROCEDURE
RIGHT JOIN
ROWNUM
SELECT
SELECT DISTINCT
SELECT INTO
SELECT TOP
SET
TABLE
TOP
TRUNCATE TABLE
UNION
UNION ALL
UNIQUE
UPDATE
VALUES
VIEW
WHERE
MySQL Functions
String Functions
ASCII
CHAR_LENGTH
CHARACTER_LENGTH
CONCAT
CONCAT_WS
FIELD
FIND_IN_SET
FORMAT
INSERT
INSTR
LCASE
LEFT
LENGTH
LOCATE
LOWER
LPAD
LTRIM
MID
POSITION
REPEAT
REPLACE
REVERSE
RIGHT
RPAD
RTRIM
SPACE
STRCMP
SUBSTR
SUBSTRING
SUBSTRING_INDEX
TRIM
UCASE
UPPER
Numeric Functions
ABS
ACOS
ASIN
ATAN
ATAN2
AVG
CEIL
CEILING
COS
COT
COUNT
DEGREES
DIV
EXP
FLOOR
GREATEST
LEAST
LN
LOG
LOG10
LOG2
MAX
MIN
MOD
PI
POW
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SUM
TAN
TRUNCATE
Date Functions
ADDDATE
ADDTIME
CURDATE
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURTIME
DATE
DATEDIFF
DATE_ADD
DATE_FORMAT
DATE_SUB
DAY
DAYNAME
DAYOFMONTH
DAYOFWEEK
DAYOFYEAR
EXTRACT
FROM_DAYS
HOUR
LAST_DAY
LOCALTIME
LOCALTIMESTAMP
MAKEDATE
MAKETIME
MICROSECOND
MINUTE
MONTH
MONTHNAME
NOW
PERIOD_ADD
PERIOD_DIFF
QUARTER
SECOND
SEC_TO_TIME
STR_TO_DATE
SUBDATE
SUBTIME
SYSDATE
TIME
TIME_FORMAT
TIME_TO_SEC
TIMEDIFF
TIMESTAMP
TO_DAYS
WEEK
WEEKDAY
WEEKOFYEAR
YEAR
YEARWEEK
Advanced Functions
BIN
BINARY
CASE
CAST
COALESCE
CONNECTION_ID
CONV
CONVERT
CURRENT_USER
DATABASE
IF
IFNULL
ISNULL
LAST_INSERT_ID
NULLIF
SESSION_USER
SYSTEM_USER
USER
VERSION
SQL Server Functions
String Functions
ASCII
CHAR
CHARINDEX
CONCAT
Concat with +
CONCAT_WS
DATALENGTH
DIFFERENCE
FORMAT
LEFT
LEN
LOWER
LTRIM
NCHAR
PATINDEX
QUOTENAME
REPLACE
REPLICATE
REVERSE
RIGHT
RTRIM
SOUNDEX
SPACE
STR
STUFF
SUBSTRING
TRANSLATE
TRIM
UNICODE
UPPER
Numeric Functions
ABS
ACOS
ASIN
ATAN
ATN2
AVG
CEILING
COUNT
COS
COT
DEGREES
EXP
FLOOR
LOG
LOG10
MAX
MIN
PI
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SQUARE
SUM
TAN
Date Functions
CURRENT_TIMESTAMP
DATEADD
DATEDIFF
DATEFROMPARTS
DATENAME
DATEPART
DAY
GETDATE
GETUTCDATE
ISDATE
MONTH
SYSDATETIME
YEAR
Advanced Functions
CAST
COALESCE
CONVERT
CURRENT_USER
IIF
ISNULL
ISNUMERIC
NULLIF
SESSION_USER
SESSIONPROPERTY
SYSTEM_USER
USER_NAME
MS Access Functions
String Functions
Asc
Chr
Concat with &
CurDir
Format
InStr
InstrRev
LCase
Left
Len
LTrim
Mid
Replace
Right
RTrim
Space
Split
Str
StrComp
StrConv
StrReverse
Trim
UCase
Numeric Functions
Abs
Atn
Avg
Cos
Count
Exp
Fix
Format
Int
Max
Min
Randomize
Rnd
Round
Sgn
Sqr
Sum
Val
Date Functions
Date
DateAdd
DateDiff
DatePart
DateSerial
DateValue
Day
Format
Hour
Minute
Month
MonthName
Now
Second
Time
TimeSerial
TimeValue
Weekday
WeekdayName
Year
Other Functions
CurrentUser
Environ
IsDate
IsNull
IsNumeric
SQL Quick Ref
SQL References
SQL Keywords
ADD
ADD CONSTRAINT
ALTER
ALTER COLUMN
ALTER TABLE
ALL
AND
ANY
AS
ASC
BACKUP DATABASE
BETWEEN
CASE
CHECK
COLUMN
CONSTRAINT
CREATE
CREATE DATABASE
CREATE INDEX
CREATE OR REPLACE VIEW
CREATE TABLE
CREATE PROCEDURE
CREATE UNIQUE INDEX
CREATE VIEW
DATABASE
DEFAULT
DELETE
DESC
DISTINCT
DROP
DROP COLUMN
DROP CONSTRAINT
DROP DATABASE
DROP DEFAULT
DROP INDEX
DROP TABLE
DROP VIEW
EXEC
EXISTS
FOREIGN KEY
FROM
FULL OUTER JOIN
GROUP BY
HAVING
IN
INDEX
INNER JOIN
INSERT INTO
INSERT INTO SELECT
IS NULL
IS NOT NULL
JOIN
LEFT JOIN
LIKE
LIMIT
NOT
NOT NULL
OR
ORDER BY
OUTER JOIN
PRIMARY KEY
PROCEDURE
RIGHT JOIN
ROWNUM
SELECT
SELECT DISTINCT
SELECT INTO
SELECT TOP
SET
TABLE
TOP
TRUNCATE TABLE
UNION
UNION ALL
UNIQUE
UPDATE
VALUES
VIEW
WHERE
MySQL Functions
String Functions
ASCII
CHAR_LENGTH
CHARACTER_LENGTH
CONCAT
CONCAT_WS
FIELD
FIND_IN_SET
FORMAT
INSERT
INSTR
LCASE
LEFT
LENGTH
LOCATE
LOWER
LPAD
LTRIM
MID
POSITION
REPEAT
REPLACE
REVERSE
RIGHT
RPAD
RTRIM
SPACE
STRCMP
SUBSTR
SUBSTRING
SUBSTRING_INDEX
TRIM
UCASE
UPPER
Numeric Functions
ABS
ACOS
ASIN
ATAN
ATAN2
AVG
CEIL
CEILING
COS
COT
COUNT
DEGREES
DIV
EXP
FLOOR
GREATEST
LEAST
LN
LOG
LOG10
LOG2
MAX
MIN
MOD
PI
POW
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SUM
TAN
TRUNCATE
Date Functions
ADDDATE
ADDTIME
CURDATE
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURTIME
DATE
DATEDIFF
DATE_ADD
DATE_FORMAT
DATE_SUB
DAY
DAYNAME
DAYOFMONTH
DAYOFWEEK
DAYOFYEAR
EXTRACT
FROM_DAYS
HOUR
LAST_DAY
LOCALTIME
LOCALTIMESTAMP
MAKEDATE
MAKETIME
MICROSECOND
MINUTE
MONTH
MONTHNAME
NOW
PERIOD_ADD
PERIOD_DIFF
QUARTER
SECOND
SEC_TO_TIME
STR_TO_DATE
SUBDATE
SUBTIME
SYSDATE
TIME
TIME_FORMAT
TIME_TO_SEC
TIMEDIFF
TIMESTAMP
TO_DAYS
WEEK
WEEKDAY
WEEKOFYEAR
YEAR
YEARWEEK
Advanced Functions
BIN
BINARY
CASE
CAST
COALESCE
CONNECTION_ID
CONV
CONVERT
CURRENT_USER
DATABASE
IF
IFNULL
ISNULL
LAST_INSERT_ID
NULLIF
SESSION_USER
SYSTEM_USER
USER
VERSION
SQL Server Functions
String Functions
ASCII
CHAR
CHARINDEX
CONCAT
Concat with +
CONCAT_WS
DATALENGTH
DIFFERENCE
FORMAT
LEFT
LEN
LOWER
LTRIM
NCHAR
PATINDEX
QUOTENAME
REPLACE
REPLICATE
REVERSE
RIGHT
RTRIM
SOUNDEX
SPACE
STR
STUFF
SUBSTRING
TRANSLATE
TRIM
UNICODE
UPPER
Numeric Functions
ABS
ACOS
ASIN
ATAN
ATN2
AVG
CEILING
COUNT
COS
COT
DEGREES
EXP
FLOOR
LOG
LOG10
MAX
MIN
PI
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SQUARE
SUM
TAN
Date Functions
CURRENT_TIMESTAMP
DATEADD
DATEDIFF
DATEFROMPARTS
DATENAME
DATEPART
DAY
GETDATE
GETUTCDATE
ISDATE
MONTH
SYSDATETIME
YEAR
Advanced Functions
CAST
COALESCE
CONVERT
CURRENT_USER
IIF
ISNULL
ISNUMERIC
NULLIF
SESSION_USER
SESSIONPROPERTY
SYSTEM_USER
USER_NAME
MS Access Functions
String Functions
Asc
Chr
Concat with &
CurDir
Format
InStr
InstrRev
LCase
Left
Len
LTrim
Mid
Replace
Right
RTrim
Space
Split
Str
StrComp
StrConv
StrReverse
Trim
UCase
Numeric Functions
Abs
Atn
Avg
Cos
Count
Exp
Fix
Format
Int
Max
Min
Randomize
Rnd
Round
Sgn
Sqr
Sum
Val
Date Functions
Date
DateAdd
DateDiff
DatePart
DateSerial
DateValue
Day
Format
Hour
Minute
Month
MonthName
Now
Second
Time
TimeSerial
TimeValue
Weekday
WeekdayName
Year
Other Functions
CurrentUser
Environ
IsDate
IsNull
IsNumeric
SQL Quick Ref
Б.B. Использование SELECT с заголовками столбцов и вычислениямиUsing SELECT with column headings and calculations
В ходе выполнения следующего примера возвращаются все строки таблицы .The following examples return all rows from the table. В результате выполнения первого примера выдаются все объемы продаж и скидки по всем продуктам.The first example returns total sales and the discounts for each product. Во втором примере вычисляется годовой доход от продажи каждого вида продукции.In the second example, the total revenue is calculated for each product.
Данный запрос вычисляет доход от продажи по каждому виду продукции для каждого заказа.This is the query that calculates the revenue for each product in each sales order.
Сеть видеокамер в Стамбуле распознаёт 15 000 лиц в секунду
Соединения (джойны)
Теперь мы хотим увидеть названия (не обязательно уникальные) всех книг Дэна Брауна, которые были взяты из библиотеки, и когда эти книги нужно вернуть:
Результат:
Title | Return Date |
---|---|
The Lost Symbol | 2016-03-23 00:00:00 |
Inferno | 2016-04-13 00:00:00 |
The Lost Symbol | 2016-04-19 00:00:00 |
По большей части запрос похож на предыдущий за исключением секции . Это означает, что мы запрашиваем данные из другой таблицы. Мы не обращаемся ни к таблице “books”, ни к таблице “borrowings”. Вместо этого мы обращаемся к новой таблице, которая создалась соединением этих двух таблиц.
— это, считай, новая таблица, которая была сформирована комбинированием всех записей из таблиц «books» и «borrowings», в которых значения совпадают. Результатом такого слияния будет:
А потом мы делаем запрос к этой таблице так же, как в примере выше. Это значит, что при соединении таблиц нужно заботиться только о том, как провести это соединение. А потом запрос становится таким же понятным, как в случае с «простым запросом» из пункта 3.
Давайте попробуем чуть более сложное соединение с двумя таблицами.
Теперь мы хотим получить имена и фамилии людей, которые взяли из библиотеки книги автора “Dan Brown”.
На этот раз давайте пойдем снизу вверх:
Шаг Step 1 — откуда берем данные? Чтобы получить нужный нам результат, нужно соединить таблицы “member” и “books” с таблицей “borrowings”. Секция JOIN будет выглядеть так:
Шаг 2 — какие данные показываем? Нас интересуют только те данные, где автор книги — “Dan Brown”
Шаг 3 — как показываем данные? Теперь, когда данные получены, нужно просто вывести имя и фамилию тех, кто взял книги:
Супер! Осталось лишь объединить три составные части и сделать нужный нам запрос:
Что даст нам:
First Name | Last Name |
---|---|
Mike | Willis |
Ellen | Horton |
Ellen | Horton |
Отлично! Но имена повторяются (они не уникальны). Мы скоро это исправим.
5. Агрегирование
Грубо говоря, агрегирования нужны для конвертации нескольких строк в одну. При этом, во время агрегирования для разных колонок используется разная логика.
Давайте продолжим наш пример, в котором появляются повторяющиеся имена. Видно, что Ellen Horton взяла больше одной книги, но это не самый лучший способ показать эту информацию. Можно сделать другой запрос:
Что даст нам нужный результат:
First Name | Last Name | Number of books borrowed |
---|---|---|
Mike | Willis | 1 |
Ellen | Horton | 2 |
Почти все агрегации идут вместе с выражением . Эта штука превращает таблицу, которую можно было бы получить запросом, в группы таблиц. Каждая группа соответствует уникальному значению (или группе значений) колонки, которую мы указали в . В нашем примере мы конвертируем результат из прошлого упражнения в группу строк. Мы также проводим агрегирование с , которая конвертирует несколько строк в целое значение (в нашем случае это количество строк). Потом это значение приписывается каждой группе.
Каждая строка в результате представляет собой результат агрегирования каждой группы.
Можно прийти к логическому выводу, что все поля в результате должны быть или указаны в , или по ним должно производиться агрегирование. Потому что все другие поля могут отличаться друг от друга в разных строках, и если выбирать их ‘ом, то непонятно, какие из возможных значений нужно брать.
В примере выше функция обрабатывала все строки (так как мы считали количество строк). Другие функции вроде или обрабатывают только указанные строки. Например, если мы хотим узнать количество книг, написанных каждым автором, то нужен такой запрос:
Результат:
author | sum |
---|---|
Robin Sharma | 4 |
Dan Brown | 6 |
John Green | 3 |
Amish Tripathi | 2 |
Здесь функция обрабатывает только колонку и считает сумму всех значений в каждой группе.
6. Подзапросы
Подзапросы это обычные SQL-запросы, встроенные в более крупные запросы. Они делятся на три вида по типу возвращаемого результата.
См. также:See Also
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL) CREATE VIEW (Transact-SQL) CREATE VIEW (Transact-SQL) DELETE (Transact-SQL) DELETE (Transact-SQL) EXECUTE (Transact-SQL) EXECUTE (Transact-SQL) Выражения (Transact-SQL) Expressions (Transact-SQL) INSERT (Transact-SQL) INSERT (Transact-SQL) LIKE (Transact-SQL) LIKE (Transact-SQL) UNION (Transact-SQL) UNION (Transact-SQL) EXCEPT и INTERSECT (Transact-SQL) EXCEPT and INTERSECT (Transact-SQL) UPDATE (Transact-SQL) UPDATE (Transact-SQL) WHERE (Transact-SQL) WHERE (Transact-SQL) PathName (Transact-SQL) PathName (Transact-SQL) Предложение INTO (Transact-SQL)INTO Clause (Transact-SQL)
Правовая информация
Пример выборки всех полей из одной таблицы
Итог
Если не можете выслать сообщение, то стоит проверить различные версии, описанные в нашей статье. В большинстве случаев удается обнаружить причину и оперативно устранить ее.
Так и не смогли выявить проблему? С большой вероятностью это серверный сбой. Попробуйте повторить действия через 10-30 минут. Если ошибка остается, то свяжитесь со службой поддержки. Специалисты рассмотрят обращение и предоставят квалифицированную помощь.