Sql урок 3. запросы sql inner join (объединение таблиц)
Содержание:
- MySQL LEFT JOIN examples
- Внешнее соединение
- JOIN и соединение более двух таблиц
- INNER JOIN
- CROSS JOIN (перекрестное соединение)
- SQL OUTER JOIN – left outer join
- Демо база данных
- SQL Учебник
- SQL INNER JOIN (simple join)
- Introduction to MySQL LEFT JOIN
- Полное множество
- SQL References
- SQL JOIN
- SQL FULL OUTER JOIN Example
MySQL LEFT JOIN examples
Let’s take some examples of using the clause.
1) Using MySQL clause to join two tables
See the following tables and in the sample database.
Each customer can have zero or more orders while each order must belong to one customer.
This query uses the clause to find all customers and their orders:
Alternatively, you can save some typing by using table aliases:
In this example:
- The is the left table and is the right table.
- The clause returns all customers including the customers who have no order. If a customer has no order, the values in the column and are .
Because both table customers and orders have the same column name ( ) in the join condition with the equal operator, you can use the USING syntax as follows:
The following clauses are equivalent:
And
If you replace the clause by the clause, you will get the only customers who have at least one order.
2) Using MySQL clause to find unmatched rows
The clause is very useful when you want to find rows in a table that doesn’t have a matching row from another table.
The following example uses the to find customers who have no order:
3) Using MySQL to join three tables
See the following three tables , , and :
This example uses two clauses to join the three tables: , , and .
This picture shows the partial output:
How it works.
- The first returns all employees and customers who represented each employee or if the employee does not in charge of any customer.
- The second returns payments of each customer represented by an employee or if the customer has no payment.
Внешнее соединение
В предшествующих примерах естественного соединения, результирующий набор содержал только те строки с одной таблицы, для которых имелись соответствующие строки в другой таблице. Но иногда кроме совпадающих строк бывает необходимым извлечь из одной или обеих таблиц строки без совпадений. Такая операция называется внешним соединением (outer join).
В примере ниже показана выборка всей информации для сотрудников, которые проживают и работают в одном и том же городе. Здесь используется таблица EmployeeEnh, которую мы создали в статье «Инструкция SELECT: расширенные возможности» при обсуждении оператора UNION.
Результат выполнения этого запроса:
В этом примере получение требуемых строк осуществляется посредством естественного соединения. Если бы в этот результат потребовалось включить сотрудников, проживающих в других местах, то нужно было применить левое внешнее соединение. Данное внешнее соединение называется левым потому, что оно возвращает все строки из таблицы с левой стороны оператора сравнения, независимо от того, имеются ли совпадающие строки в таблице с правой стороны. Иными словами, данное внешнее соединение возвратит строку с левой таблицы, даже если для нее нет совпадения в правой таблице, со значением NULL соответствующего столбца для всех строк с несовпадающим значением столбца другой, правой, таблицы. Для выполнения операции левого внешнего соединения компонент Database Engine использует оператор LEFT OUTER JOIN.
Операция правого внешнего соединения аналогична левому, но возвращаются все строки таблицы с правой части выражения. Для выполнения операции правого внешнего соединения компонент Database Engine использует оператор RIGHT OUTER JOIN.
В этом примере происходит выборка сотрудников (с включением полной информации) для таких городов, в которых сотрудники или только проживают (столбец City в таблице EmployeeEnh), или проживают и работают. Результат выполнения этого запроса:
Как можно видеть в результате выполнения запроса, когда для строки из левой таблицы (в данном случае EmployeeEnh) нет совпадающей строки в правой таблице (в данном случае Department), операция левого внешнего соединения все равно возвращает эту строку, заполняя значением NULL все ячейки соответствующего столбца для несовпадающего значения столбца правой таблицы. Применение правого внешнего соединения показано в примере ниже:
В этом примере происходит выборка отделов (с включением полной информации о них) для таких городов, в которых сотрудники или только работают, или проживают и работают. Результат выполнения этого запроса:
Кроме левого и правого внешнего соединения, также существует полное внешнее соединение, которое является объединением левого и правого внешних соединений. Иными словами, результирующий набор такого соединения состоит из всех строк обеих таблиц. Если для строки одной из таблиц нет соответствующей строки в другой таблице, всем ячейкам строки второй таблицы присваивается значение NULL. Для выполнения операции полного внешнего соединения используется оператор FULL OUTER JOIN.
Любую операцию внешнего соединения можно эмулировать, используя оператор UNION совместно с функцией NOT EXISTS. Таким образом, запрос, показанный в примере ниже, эквивалентен запросу левого внешнего соединения, показанному ранее. В данном запросе осуществляется выборка сотрудников (с включением полной информации) для таких городов, в которых сотрудники или только проживают или проживают и работают:
Первая инструкция SELECT объединения определяет естественное соединение таблиц EmployeeEnh и Department по столбцам соединения City и Location. Эта инструкция возвращает все города для всех сотрудников, в которых сотрудники и проживают и работают. Дополнительно, вторая инструкция SELECT объединения возвращает все строки таблицы EmployeeEnh, которые не отвечают условию в естественном соединении.
JOIN и соединение более двух таблиц
Реляционные базы данных должны подчиняться требованиям целостности и неизбыточности данных,
в связи с чем данные об одном бизнес-процессе могут содержаться не только в одной, двух, но и в трёх и более
таблицах. В этих случаях для анализа данных используются цепочки соединённых таблиц: например, в одной (первой)
таблице содержится некоторый количественный показатель, вторую таблицу с первой и третьей связывают
внешние ключи — данные пересекаются, но только третья таблица содержит условие, в зависимости от которого
может быть выведен количественный показатель из первой таблицы. И таблиц может быть ещё больше. При помощи оператора
SQL JOIN в одном запросе можно соединить большое число таблиц. В таких запросах за одной секцией соединения
следует другая, причём каждый следующий JOIN соединяет со следующей таблицей таблицу, которая была второй
в предыдущем звене цепочки. Таким образом, синтаксис SQL запроса для соединения более двух таблиц следующий:
SELECT ИМЕНА_СТОЛБЦОВ (1..N)
FROM ИМЯ_ТАБЛИЦЫ_1 JOIN ИМЯ_ТАБЛИЦЫ_2
ON УСЛОВИЕ
JOIN ИМЯ_ТАБЛИЦЫ_3
ON УСЛОВИЕ
…
JOIN ИМЯ_ТАБЛИЦЫ_M
ON УСЛОВИЕ
Пример 8. База данных — та же, что и в предыдущих примерах. К таблицам
Categories и Parts в этом примере добавится таблица Ads, содержащая данные об опубликованных на портале объявлениях.
Приведём фрагмент таблицы Ads, в котором среди записей есть записи о тех объявлениях, срок публикации которых
истекает 2018-04-02.
A_Id | Part_ID | Date_start | Date_end | Text |
21 | 1 | ‘2018-02-11’ | ‘2018-04-20’ | «Продаю…» |
22 | 1 | ‘2018-02-11’ | ‘2018-05-12’ | «Продаю…» |
… | … | … | … | … |
27 | 1 | ‘2018-02-11’ | ‘2018-04-02’ | «Продаю…» |
28 | 2 | ‘2018-02-11’ | ‘2018-04-21’ | «Продаю…» |
29 | 2 | ‘2018-02-11’ | ‘2018-04-02’ | «Продаю…» |
30 | 3 | ‘2018-02-11’ | ‘2018-04-22’ | «Продаю…» |
31 | 4 | ‘2018-02-11’ | ‘2018-05-02’ | «Продаю…» |
32 | 4 | ‘2018-02-11’ | ‘2018-04-13’ | «Продаю…» |
33 | 3 | ‘2018-02-11’ | ‘2018-04-12’ | «Продаю…» |
34 | 4 | ‘2018-02-11’ | ‘2018-04-23’ | «Продаю…» |
Представим, что сегодня ‘2018-04-02’, то есть это значение принимает функция CURDATE() —
текущая дата. Требуется узнать, к каким категориям принадлежат объявления, срок публикации которых
истекает сегодня. Названия категорий есть только в таблице CATEGORIES, а даты истечения срока публикации объявлений
— только в таблице ADS. В таблице PARTS — части категорий (или проще, подкатегории) опубликованных объявлений.
Но внешним ключом Cat_ID таблица PARTS связана с таблицей CATEGORIES, а таблица ADS связана внешним
ключом Part_ID с таблицей PARTS. Поэтому соединяем в одном запросе три таблицы и этот запрос можно
с максимальной корректностью назвать цепочкой.
Запрос будет следующим:
SELECT C.Cat_name FROM Categories C JOIN Parts P
ON P.Cat=C.Catnumb JOIN ads A ON A.Part_id=P.Part_id
WHERE A.Date_end=CURDATE()
Результат запроса — таблица, содержащая названия двух категорий — «Недвижимость» и
«Транспорт»:
Cat_name |
Недвижимость |
Транспорт |
INNER JOIN
Давайте сразу пример.
Итак, создадим две одинаковых таблицы с одной колонкой id, в каждой из этих таблиц пусть будет по две строки со значением 1 и еще что-нибудь.
Давайте, их, что ли, поджойним
Если бы это было «пересечение множеств», или хотя бы «пересечение таблиц», то мы бы увидели две строки с единицами.
На практике ответ будет такой:
| id | id | | --- | --- | | 1 | 1 | | 1 | 1 | | 1 | 1 | | 1 | 1 |
Но как??
Для начала рассмотрим, что такое CROSS JOIN. Вдруг кто-то не в курсе.
CROSS JOIN — это просто все возможные комбинации соединения строк двух таблиц. Например, есть две таблицы, в одной из них 3 строки, в другой — 2:
id ---- 1 2 3
id ---- 4 5
Тогда CROSS JOIN будет порождать 6 строк.
id | id ----+---- 1 | 4 1 | 5 2 | 4 2 | 5 3 | 4 3 | 5
Так вот, вернемся к нашим баранам.
Конструкция
— это, можно сказать, всего лишь синтаксический сахар к
Т.е. по сути — это все комбинации соединений строк с неким фильтром . В общем-то, можно это представлять по разному, кому как удобнее, но точно не как пересечение каких-то там кругов.
Небольшой disclaimer: хотя inner join логически эквивалентен cross join с фильтром, это не значит, что база будет делать именно так, в тупую: генерить все комбинации и фильтровать. На самом деле там более интересные алгоритмы.
CROSS JOIN (перекрестное соединение)
Использование оператора SQL CROSS JOIN в наиболее простой форме — без условия соединения —
реализует операцию .
Результатом такого соединения будет сцепление каждой строки первой таблицы с каждой строкой второй таблицы. Таблицы
могут быть записаны в запросе либо через оператор CROSS JOIN, либо через запятую между ними.
Пример 9. База данных — всё та же, таблицы — Categories и Parts.
Реализовать операцию декартова произведения этих двух таблиц.
Запрос будет следующим:
SELECT (*) Categories CROSS JOIN Parts
Или без явного указания CROSS JOIN — через запятую:
SELECT (*) Categories, Parts
Запрос вернёт таблицу из 5 * 5 = 25 строк, фрагмент которой приведён ниже:
Catnumb | Cat_name | Price | Part_ID | Part | Cat |
10 | Стройматериалы | 105,00 | 1 | Квартиры | 505 |
10 | Стройматериалы | 105,00 | 2 | Автомашины | 205 |
10 | Стройматериалы | 105,00 | 3 | Доски | 10 |
10 | Стройматериалы | 105,00 | 4 | Шкафы | 30 |
10 | Стройматериалы | 105,00 | 5 | Книги | 160 |
… | … | … | … | … | … |
45 | Техника | 65,00 | 1 | Квартиры | 505 |
45 | Техника | 65,00 | 2 | Автомашины | 205 |
45 | Техника | 65,00 | 3 | Доски | 10 |
45 | Техника | 65,00 | 4 | Шкафы | 30 |
45 | Техника | 65,00 | 5 | Книги | 160 |
Как видно из примера, если результат такого запроса и имеет какую-либо ценность, то
это, возможно, наглядная ценность в некоторых случаях, когда не требуется вывести структурированную информацию,
тем более, даже самую простейшую аналитическую выборку. Кстати, можно указать выводимые столбцы из каждой
таблицы, но и тогда информационная ценность такого запроса не повысится.
Но для CROSS JOIN можно задать условие соединения! Результат будет совсем иным. При
использовании оператора «запятая» вместо явного указания CROSS JOIN условие соединения задаётся не
словом ON, а словом WHERE.
Пример 10. Та же база данных портала объявлений, таблицы Categories и Parts.
Используя перекрестное соединение, соединить таблицы так, чтобы данные полностью пересекались по
условию. Условие — совпадение идентификатора категории в таблице Categories и ссылки на категорию в таблице Parts.
Запрос будет следующим:
SELECT P.Part, C.Catnumb AS Cat, C.Price
FROM Parts P, Categories C
WHERE P.Cat = C.Cat_ID
Запрос вернёт то же самое, что и запрос в примере 1:
Part | Cat | Price |
Квартиры | 505 | 210,00 |
Автомашины | 205 | 160,00 |
Доски | 10 | 105,00 |
Шкафы | 30 | 77,00 |
И это совпадение не случайно. Запрос c перекрестным соединением по условию соединения полностью
аналогичен запросу с внутренним соединением — INNER JOIN — или, учитывая, что слово INNER — не обязательное,
просто JOIN.
Таким образом, какой вариант запроса использовать — вопрос стиля или даже привычки
специалиста по работе с базой данных. Возможно, перекрёстное соединение с условием для двух таблиц
может представляться более компактным. Но преимущество перекрестного соединения для более чем двух
таблиц (это также возможно) весьма спорно. В этом случае WHERE-условия пересечения перечисляются через
слово AND. Такая конструкция может быть громоздкой и трудной для чтения, если в конце запроса есть
также секция WHERE с условиями выборки.
Поделиться с друзьями
Реляционные базы данных и язык SQL
SQL OUTER JOIN – left outer join
SQL left outer join is also known as SQL left join. Suppose, we want to join two tables: A and B. SQL left outer join returns all rows in the left table (A) and all the matching rows found in the right table (B). It means the result of the SQL left join always contains the rows in the left table.
The following illustrate SQL left outer syntax of joining 2 tables: table_A and table_B:
1 2 3 4 |
SELECTcolumn1,column2… FROMtable_A LEFTJOINtable_BONjoin_condition WHERErow_condition |
SQL OUTER JOIN – left outer join example
The following query selects all customers and their orders:
1 2 3 4 5 6 |
SELECTc.customerid, c.companyName, orderid FROMcustomersc LEFTJOINordersoONo.customerid=c.customerid ORDERBYorderid |
All rows in the customers table are listed. In case, there is no matching row in the orders table found for the row in the customers table, the orderid column in the orders table is populated with NULL values.
We can use Venn diagram to visualize how SQL LEFT OUTER JOIN works.
Демо база данных
В этом уроке мы будем использовать хорошо известный пример базы данных Northwind.
Ниже приведен выбор из таблицы «Customers»:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
И выбор из таблицы «Orders»:
OrderID | CustomerID | EmployeeID | OrderDate | ShipperID |
---|---|---|---|---|
10308 | 2 | 7 | 1996-09-18 | 3 |
10309 | 37 | 3 | 1996-09-19 | 1 |
10310 | 77 | 8 | 1996-09-20 | 2 |
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 INNER JOIN (simple join)
Chances are, you’ve already written a SQL statement that uses an SQL INNER JOIN. It is the most common type of SQL join. SQL INNER JOINS return all rows from multiple tables where the join condition is met.
Syntax
The syntax for the INNER JOIN in SQL is:
SELECT columns FROM table1 INNER JOIN table2 ON table1.column = table2.column;
Visual Illustration
In this visual diagram, the SQL INNER JOIN returns the shaded area:
The SQL INNER JOIN would return the records where table1 and table2 intersect.
Example
Let’s look at an example of how to use the INNER JOIN in a query.
In this example, we have a table called customers with the following data:
customer_id | last_name | first_name | favorite_website |
---|---|---|---|
4000 | Jackson | Joe | techonthenet.com |
5000 | Smith | Jane | digminecraft.com |
6000 | Ferguson | Samantha | bigactivities.com |
7000 | Reynolds | Allen | checkyourmath.com |
8000 | Anderson | Paige | NULL |
9000 | Johnson | Derek | techonthenet.com |
And a table called orders with the following data:
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2016/04/18 |
2 | 5000 | 2016/04/18 |
3 | 8000 | 2016/04/19 |
4 | 4000 | 2016/04/20 |
5 | NULL | 2016/05/01 |
Enter the following SQL statement:
Try It
SELECT customers.customer_id, orders.order_id, orders.order_date FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id ORDER BY customers.customer_id;
There will be 4 records selected. These are the results that you should see:
customer_id | order_id | order_date |
---|---|---|
4000 | 4 | 2016/04/20 |
5000 | 2 | 2016/04/18 |
7000 | 1 | 2016/04/18 |
8000 | 3 | 2016/04/19 |
This example would return all rows from the customers and orders tables where there is a matching customer_id value in both the customers and orders tables.
The rows where customer_id is equal to 6000 and 9000 in the customers table would be omitted, since they do not exist in both tables. The row where the order_id is 5 from the orders table would be omitted, since the customer_id of NULL does not exist in the customers table.
Old Syntax
As a final note, it is worth mentioning that the INNER JOIN example above could be rewritten using the older implicit syntax as follows (but we still recommend using the INNER JOIN keyword syntax):
Try It
Introduction to MySQL LEFT JOIN
The allows you to query data from two or more tables. Similar to the clause, the is an optional clause of the statement, which appears immediately after the clause.
Suppose that you want to join two tables and .
The following statement shows how to use the clause to join the two tables:
When you use the clause, the concepts of the left table and the right table are introduced.
In the above syntax, is the left table and is the right table.
The clause selects data starting from the left table (). It matches each row from the left table () with every row from the right table() based on the .
If the rows from both tables cause the join condition evaluates to , the combine columns of rows from both tables to a new row and includes this new row in the result rows.
In case the row from the left table () does not match with any row from the right table(), the still combines columns of rows from both tables into a new row and include the new row in the result rows. However, it uses for all the columns of the row from the right table.
In other words, returns all rows from the left table regardless of whether a row from the left table has a matching row from the right table or not. If there is no match, the columns of the row from the right table will contain .
The following Venn diagram helps you visualize how the clause works:
MySQL LEFT JOIN – Venn Diagram
Полное множество
MySQL не знает соединения FULL OUTER JOIN. Что если нужно получить полное множество?
Первый способ — объединение запросов LEFT и RIGHT.
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id)
UNION
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id)
1 |
(SELECTp.id,p.name`Имясотрудника`,ps.id`pos.id`,ps.name`Должность` FROM`persons`p LEFT OUTER JOIN`positions`ps ON ps.id=p.post_id) UNION (SELECTp.id,p.name`Имясотрудника`,ps.id`pos.id`,ps.name`Должность` FROM`persons`p RIGHT OUTER JOIN`positions`ps ON ps.id=p.post_id) |
При таком вызове UNION, после слияния результатов, SQL отсечет дубли (как DISTINCT). Для отсечения дублей SQL прибегает к сортировке. Это может сказываться на быстродействии.
Второй способ — объединение LEFT и RIGHT, но в одном из запросов мы исключаем часть, соответствующую INNER. А объединение задаём как UNION ALL, что позволяет движку SQL обойтись без сортировки.
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
LEFT OUTER JOIN `positions` ps ON ps.id = p.post_id)
UNION ALL
(SELECT p.id, p.name `Имя сотрудника`, ps.id `pos.id`, ps.name `Должность`
FROM `persons` p
RIGHT OUTER JOIN `positions` ps ON ps.id = p.post_id
WHERE p.id IS NULL)
1 |
(SELECTp.id,p.name`Имясотрудника`,ps.id`pos.id`,ps.name`Должность` FROM`persons`p LEFT OUTER JOIN`positions`ps ON ps.id=p.post_id) UNION ALL (SELECTp.id,p.name`Имясотрудника`,ps.id`pos.id`,ps.name`Должность` FROM`persons`p RIGHT OUTER JOIN`positions`ps ON ps.id=p.post_id WHEREp.id ISNULL) |
Этот пример показывает нам как исключить пересечение и получить только левую или правую часть множества.
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 JOIN
Предложение JOIN используется для объединения строк из двух или более таблиц на основе связанного столбца между ними.
Давайте рассмотрим выборку из таблицы «Orders»:
OrderID | CustomerID | OrderDate |
---|---|---|
10308 | 2 | 1996-09-18 |
10309 | 37 | 1996-09-19 |
10310 | 77 | 1996-09-20 |
Затем посмотрите на выборку из таблицы «Customers»:
CustomerID | CustomerName | ContactName | Country |
---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mexico |
Обратите внимание, что столбец «CustomerID» в таблице «Orders» ссылается на «CustomerID» в таблице «Customers».
Связь между двумя приведенными выше таблицами представляет собой столбец «CustomerID». Затем мы можем создать следующий заявление SQL (содержащий внутреннее соединение),
который выбирает записи, имеющие совпадающие значения в обеих таблицах:
Затем мы можем создать следующий заявление SQL (содержащий внутреннее соединение),
который выбирает записи, имеющие совпадающие значения в обеих таблицах:
Пример
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
и он будет производить что-то вроде этого:
OrderID | CustomerName | OrderDate |
---|---|---|
10308 | Ana Trujillo Emparedados y helados | 9/18/1996 |
10365 | Antonio Moreno Taquería | 11/27/1996 |
10383 | Around the Horn | 12/16/1996 |
10355 | Around the Horn | 11/15/1996 |
10278 | Berglunds snabbköp | 8/12/1996 |
SQL FULL OUTER JOIN Example
The following SQL statement selects all customers, and all orders:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;
A selection from the result set may look like this:
CustomerName | OrderID |
---|---|
Alfreds Futterkiste | Null |
Ana Trujillo Emparedados y helados | 10308 |
Antonio Moreno Taquería | Null |
Note: The keyword returns all matching
records from both tables whether the other table matches or not. So, if
there are rows in «Customers» that do not have matches in «Orders», or if there
are rows in «Orders» that do not have matches in «Customers», those rows will be
listed as well.
❮ Previous
Next ❯