Содержание
- 1 Пример
- 2 Пример с одним выражением
- 3 Пример условия EXISTS с оператором UPDATE
- 4 Пример с одним expressions
- 5 How to do a SQL intersect with 3 or more tables
- 6 Добавление данных. Команда Insert
- 7 Пример использования ORDER BY
- 8 Пример использования ORDER BY
- 9 Пример — использование условия IN с символьными значениями
- 10 Пример
- 11 Синтаксис
- 12 About Daniel Calbimonte
- 13 Пример — сортировка результатов по убыванию
- 14 Пример с несколькими выражениями
- 15 Differences between SQL intersect and SQL INNER join
- 16 Синтаксис
- 17 Пример — сортировка результатов по относительной позиции
- 18 Пример — использование атрибутов ASC и DESC
Пример
Пример процедуры, в которой используется исключительная ситуация определенная программистом:
Oracle PL/SQL
CREATE OR REPLACE PROCEDURE add_new_order (order_id_in IN NUMBER, sales_in IN NUMBER) IS no_sales EXCEPTION; BEGIN IF sales_in = 0 THEN RAISE no_sales; ELSE INSERT INTO orders (order_id, total_sales ) VALUES ( order_id_in, sales_in ); END IF; EXCEPTION WHEN no_sales THEN raise_application_error (-20001,’У вас должны быть продажи по заказу, для закрытия заказа.’); WHEN OTHERS THEN raise_application_error (-20002,’Произошла ошибка при добавлении заказа.’); END;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
CREATEORREPLACEPROCEDUREadd_new_order (order_id_inINNUMBER,sales_inINNUMBER) IS no_salesEXCEPTION; BEGIN IFsales_in=0THEN RAISEno_sales; ELSE INSERTINTOorders(order_id,total_sales) VALUES(order_id_in,sales_in); ENDIF; EXCEPTION WHENno_salesTHEN raise_application_error(-20001,’У вас должны быть продажи по заказу, для закрытия заказа.’); WHENOTHERSTHEN raise_application_error(-20002,’Произошла ошибка при добавлении заказа.’); END; |
В этом примере объявили исключительную ситуацию no_sales объявленную следующим кодом:
no_sales EXCEPTION;
Вызываем исключение в выполняемой части кода:
IF sales_in = 0 THEN RAISE no_sales;
Теперь, если переменная sales_in содержит нуль, то наш выполнение кода перейдет к исключительной ситуации no_sales.
Наконец, мы указываем нашей процедуре, что делать, когда исключительная ситуация no_sales включается в оператор WHEN:
WHEN no_sales THEN raise_application_error (-20001,’У вас должны быть продажи по заказу, для закрытия заказа.’);
Мы также используем оператор WHEN OTHERS для перехвата всех остальных исключений:
WHEN OTHERS THEN raise_application_error (-20002,’Произошла ошибка при добавлении заказа.’);
Пример с одним выражением
Во-первых, давайте рассмотрим, как имитировать запрос INTERSECT в MySQL, который имеет одно поле с тем же типом данных. Если база данных поддерживала оператор INTERSECT (чего нет у MySQL), так вы бы использовали оператор INTERSECT для возврата общих значений category_id между таблицами products и inventory.
MySQL
SELECT category_id FROM products INTERSECT SELECT category_id FROM inventory;
1 2 3 4 5 |
SELECTcategory_id FROMproducts INTERSECT SELECTcategory_id FROMinventory; |
Поскольку вы не можете использовать оператор INTERSECT в MySQL, вы будете использовать оператор IN для имитации запроса INTERSECT следующим образом:
MySQL
SELECT products.category_id FROM products WHERE products.category_id IN (SELECT inventory.category_id FROM inventory);
1 2 3 |
SELECTproducts.category_id FROMproducts WHEREproducts.category_idIN(SELECTinventory.category_idFROMinventory); |
В этом простом примере вы можете использовать оператор IN для возврата всех значений category_id, которые существуют как в products, так и в таблицах inventory.
Теперь давайте усложним наш пример, добавив условия WHERE к запросу INTERSECT.
Например, так выглядит INTERSECT с условиями WHERE:
MySQL
SELECT category_id FROM products WHERE category_id < 100 INTERSECT SELECT category_id FROM inventory WHERE quantity > 0;
1 2 3 4 5 6 7 |
SELECTcategory_id FROMproducts WHEREcategory_id<100 INTERSECT SELECTcategory_id FROMinventory WHEREquantity>0; |
Вот как вы могли бы моделировать запрос INTERSECT с помощью оператора IN и включать условия WHERE:
MySQL
SELECT products.category_id FROM products WHERE products.category_id < 100 AND products.category_id IN (SELECT inventory.category_id FROM inventory WHERE inventory.quantity > 0);
1 2 3 4 5 6 7 |
SELECTproducts.category_id FROMproducts WHEREproducts.category_id<100 ANDproducts.category_idIN (SELECTinventory.category_id FROMinventory WHEREinventory.quantity>0); |
В этом примере были добавлены предложения WHERE, которые фильтруют как таблицу products, так и результаты из таблицы inventory.
Пример условия EXISTS с оператором UPDATE
Давайте рассмотрим пример, в котором используется условие EXISTS в операторе UPDATE. В этом примере у нас есть таблица products со следующими данными:
product_id | product_name | category_id |
---|---|---|
1 | Pear | 50 |
2 | Banana | 50 |
3 | Orange | 50 |
4 | Apple | 50 |
5 | Bread | 75 |
6 | Sliced Ham | 25 |
7 | Kleenex | NULL |
И таблица с именем summary_data со следующими данными:
product_id | current_category |
---|---|
1 | 10 |
2 | 10 |
3 | 10 |
4 | 10 |
5 | 10 |
Теперь давайте обновим таблицу summary_data значениями из таблицы products. Введите следующий SQL оператор:
PgSQL
UPDATE summary_data SET current_category = (SELECT category_id FROM products WHERE products.product_id = summary_data.product_id) WHERE EXISTS (SELECT category_id FROM products WHERE products.product_id = summary_data.product_id);
1 2 3 4 5 6 7 |
UPDATEsummary_data SETcurrent_category=(SELECTcategory_id FROMproducts WHEREproducts.product_id=summary_data.product_id) WHEREEXISTS(SELECTcategory_id FROMproducts WHEREproducts.product_id=summary_data.product_id); |
Будет обновлено 5 записей. Снова выберите данные из таблицы summary_data:
PgSQL
SELECT * FROM summary_data;
1 2 |
SELECT* FROMsummary_data; |
Вот результаты, которые вы получите:
product_id | current_category |
---|---|
1 | 50 |
2 | 50 |
3 | 50 |
4 | 50 |
5 | 75 |
8 | 10 |
В этом примере будет обновлено поле current_category в таблице summary_data данными category_id из таблицы products, где значения product_id совпадают. Первые 5 записей в таблице summary_data были обновлены.
Подсказка: Если бы мы не включили условие EXISTS, запрос UPDATE обновил бы поле current_category на NULL в 6-й строке таблицы summary_data (поскольку таблица products не имеет записи, где product_id = 8).
Пример с одним expressions
Рассмотрим пример запроса INTERSECT в SQL Server (Transact-SQL), который возвращает один столбец с тем же типом данных. Например:
Transact-SQL
SELECT product_id FROM products INTERSECT SELECT product_id FROM inventory;
1 2 3 4 5 |
SELECTproduct_id FROMproducts INTERSECT SELECTproduct_id FROMinventory; |
В этом примере INTERSECT, если product_id появился как в таблице products, так и в таблице inventory, он появится в вашем результирующем наборе для этого запроса INTERSECT.
Теперь давайте усложним наш пример, добавив условия WHERE к запросу INTERSECT.
Transact-SQL
SELECT product_id FROM products WHERE product_id >= 30 INTERSECT SELECT product_id FROM inventory WHERE quantity > 10;
1 2 3 4 5 6 7 |
SELECTproduct_id FROMproducts WHEREproduct_id>=30 INTERSECT SELECTproduct_id FROMinventory WHEREquantity>10; |
В этом примере к каждому набору данных добавлены предложения WHERE. Первый набор данных был отфильтрован таким образом, что возвращаются только записи из таблицы products, где product_id больше или равно 30. Второй набор данных был отфильтрован таким образом, чтобы возвращались только записи из таблицы inventory, где quantity больше 10.
How to do a SQL intersect with 3 or more tables
The following example, will create 2 extra tables for this example:
1 2 |
selecttop5*intodbo.table1fromdbo.FactInternetSales selecttop7*intodbo.table2fromdbo.FactInternetSales |
The query is creating 2 tables named table1 and table2 based on the top 5 and top 7 rows of the dbo.FactInternetSales.
Once that we have the tables, let’s run the example:
1 2 3 4 5 6 7 |
selectCurrencykeyfromdbo.FactInternetSales intersect selectcurrencykeyfromDimCurrency intersect selectcurrencykeyfromdbo.table1 intersect selectcurrencykeyfromdbo.table2 |
This example will show all the common currency keys between the tables dbo.Facinternetsales, dimcurrency, table1 and table2.
Добавление данных. Команда Insert
Последнее обновление: 13.07.2017
Для добавления данных применяется команда INSERT, которая имеет следующий формальный синтаксис:
INSERT имя_таблицы VALUES (значение1, значение2, ... значениеN)
Вначале идет выражение INSERT INTO, затем в скобках можно указать список столбцов через запятую, в которые надо добавлять данные, и в конце после слова VALUES скобках перечисляют добавляемые для столбцов значения.
Например, пусть ранее была создана следующая база данных:
CREATE DATABASE productsdb; GO USE productsdb; CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL )
Добавим в нее одну строку с помощью команды INSERT:
INSERT Products VALUES ('iPhone 7', 'Apple', 5, 52000)
После удачного выполнения в SQL Server Management Studio в поле сообщений должно появиться сообщение «1 row(s) affected»:
Стоит учитывать, что значения для столбцов в скобках после ключевого слова VALUES передаются по порядку их объявления. Например, в выражении CREATE TABLE выше можно увидеть, что первым столбцом идет Id. Но так как для него задан атрибут IDENTITY, то значение этого столбца автоматически генерируется, и его можно не указывать. Второй столбец представляет ProductName, поэтому первое значение — строка «iPhone 7» будет передано именно этому столбцу. Второе значение — строка «Apple» будет передана третьему столбцу Manufacturer и так далее. То есть значения передаются столбцам следующим образом:
ProductName: ‘iPhone 7’
Manufacturer: ‘Apple’
ProductCount: 5
Price: 52000
Также при вводе значений можно указать непосредственные столбцы, в которые будут добавляться значения:
INSERT INTO Products (ProductName, Price, Manufacturer) VALUES ('iPhone 6S', 41000, 'Apple')
Здесь значение указывается только для трех столбцов. Причем теперь значения передаются в порядке следования столбцов:
ProductName: ‘iPhone 6S’
Manufacturer: ‘Apple’
Price: 41000
Для неуказанных столбцов (в данном случае ProductCount) будет добавляться значение по умолчанию, если задан атрибут DEFAULT, или значение NULL. При этом неуказанные столбцы должны допускать значение NULL или иметь атрибут DEFAULT.
Также мы можем добавить сразу несколько строк:
INSERT INTO Products VALUES ('iPhone 6', 'Apple', 3, 36000), ('Galaxy S8', 'Samsung', 2, 46000), ('Galaxy S8 Plus', 'Samsung', 1, 56000)
В данном случае в таблицу будут добавлены три строки.
Также при добавлении мы можем указать, чтобы для столбца использовалось значение по умолчанию с помощью ключевого слова DEFAULT или значение NULL:
INSERT INTO Products (ProductName, Manufacturer, ProductCount, Price) VALUES ('Mi6', 'Xiaomi', DEFAULT, 28000)
В данном случае для столбца ProductCount будет использовано значение по умолчанию (если оно установлено, если его нет — то NULL).
Если все столбцы имеют атрибут DEFAULT, определяющий значение по умолчанию, или допускают значение NULL, то можно для всех столбцов вставить значения по умолчанию:
INSERT INTO Products DEFAULT VALUES
Но если брать таблицу Products, то подобная команда завершится с ошибкой, так как несколько полей не имеют атрибута DEFAULT и при этом не допускают значение NULL.
НазадВперед
Пример использования ORDER BY
Наконец, давайте рассмотрим, как использовать предложение ORDER BY в запросе EXCEPT в SQL Server (Transact-SQL). Например:
Transact-SQL
SELECT supplier_id, supplier_name FROM suppliers WHERE state = ‘Nevada’ EXCEPT SELECT company_id, company_name FROM companies WHERE company_id <= 300 ORDER BY 2;
1 2 3 4 5 6 7 8 9 |
SELECTsupplier_id, supplier_name FROMsuppliers WHEREstate=’Nevada’ EXCEPT SELECTcompany_id,company_name FROMcompanies WHEREcompany_id<=300 ORDERBY2; |
В этом примере EXCEPT, поскольку имена столбцов различаются между двумя операторами SELECT, более выгодно ссылаться на столбцы в предложении ORDER BY по их позиции в наборе результатов. В этом примере мы отсортировали результаты по supplier_name / company_name в порядке возрастания, как обозначено . В поле supplier_name / company_name находятся позиции № 2 в результирующем наборе.
Пример использования ORDER BY
Наконец, давайте рассмотрим, как использовать предложение ORDER BY в запросе INTERSECT в SQL Server (Transact-SQL). Например:
Transact-SQL
SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 500 INTERSECT SELECT company_id, company_name FROM companies WHERE company_name in ( ‘Apple’, ‘Microsoft’, ‘SQL Server’ ) ORDER BY 2;
1 2 3 4 5 6 7 8 |
SELECTsupplier_id,supplier_name FROMsuppliers WHEREsupplier_id>500 INTERSECT SELECTcompany_id,company_name FROMcompanies WHEREcompany_namein(‘Apple’,’Microsoft’,’SQL Server’) ORDERBY2; |
Поскольку имена столбцов различаются между двумя операторами SELECT, более выгодно ссылаться на столбцы в предложении ORDER BY по их позиции в наборе результатов. В этом примере мы отсортировали результаты по supplier_name / company_name в порядке возрастания, как обозначено ORDER BY 2. В поле supplier_name / company_name находятся позиции № 2 в результирующем наборе.
Пример — использование условия IN с символьными значениями
Условие IN может использоваться с любым типом данных в SQL. Давайте посмотрим, как использовать условие IN с символьными (строковыми) значениями. В этом примере у нас есть таблица suppliers со следующими данными:
supplier_id | supplier_name | city | state |
---|---|---|---|
100 | Yandex | Moscow | Russian |
200 | Lansing | Michigan | |
300 | Oracle | Redwood City | California |
400 | Bing | Redmond | Washington |
500 | Yahoo | Sunnyvale | Washington |
600 | DuckDuckGo | Paoli | Pennsylvania |
700 | Qwant | Paris | France |
800 | Menlo Park | California | |
900 | Electronic Arts | San Francisco | California |
Введите следующий SQL оператор:
PgSQL
SELECT * FROM suppliers WHERE supplier_name IN (‘Yandex’, ‘Oracle’, ‘Facebook’);
1 2 3 |
SELECT* FROMsuppliers WHEREsupplier_nameIN(‘Yandex’,’Oracle’,); |
Будет выбрано 3 записи. Вот результаты, которые вы должны получить:
supplier_id | supplier_name | city | state |
---|---|---|---|
100 | Yandex | Moscow | Russian |
300 | Oracle | Redwood City | California |
800 | Menlo Park | California |
В этом примере будут возвращены все строки из таблицы suppliers, где supplier_name — Yandex, Oracle или Facebook. Поскольку в SELECT используется , то все поля из таблицы suppliers будут отображаться в наборе результатов.
Это эквивалентно следующему оператору SQL:
PgSQL
SELECT * FROM suppliers WHERE supplier_name = ‘Yandex’ OR supplier_name = ‘Oracle’ OR supplier_name = ‘Facebook’;
1 2 3 4 5 |
SELECT* FROMsuppliers WHEREsupplier_name=’Yandex’ ORsupplier_name=’Oracle’ ORsupplier_name=; |
Как вы можете видеть, использование условия IN облегчает чтение оператора и делает его более эффективным, чем использование нескольких условий OR.
Пример
В PostgreSQL усечение таблицы является быстрым способом удаления записей из таблицы, поскольку для этого не нужно сканировать таблицу. Усечение таблицы также намного проще, чем удаление таблицы и ее воссоздание. Рассмотрим пример использования оператора TRUNCATE TABLE в PostgreSQL. Например:
PgSQL
TRUNCATE ONLY products;
1 | TRUNCATEONLYproducts; |
В этом примере будет усечена таблица с именем products и удалены все записи из этой таблицы. Это было бы эквивалентно следующему оператору DELETE в PostgreSQL:
PgSQL
DELETE FROM products;
1 | DELETEFROMproducts; |
Оба этих оператора приведут к удалению всех данных из таблицы products, и поскольку ключевое слово ONLY было использовано в команде TRUNCATE, никакие таблицы-потомки не будут усечены. Всегда безопаснее указывать ключевое слово ONLY, чтобы случайно не усечь таблицы-потомки.
Несколько таблиц
Далее давайте посмотрим, как усечь несколько таблиц одновременно. Например:
PgSQL
TRUNCATE ONLY products, inventory;
1 | TRUNCATEONLYproducts,inventory; |
В этом примере будут усечены таблицы с именами products и inventory. Опять же, мы включили ключевое слово ONLY, чтобы никакие таблицы-потомки не усекались.
Сброс столбцов идентификаторов
По умолчанию, когда вы усекаете таблицу, столбцы идентификаторов продолжают нумерацию с того места, где она остановилась. Вы можете указать PostgreSQL автоматически сбрасывать все столбцы идентификаторов при усечении таблицы, включив опцию RESTART IDENTITY. Например:
PgSQL
TRUNCATE ONLY inventory RESTART IDENTITY;
1 2 |
TRUNCATEONLYinventory RESTARTIDENTITY; |
В этом примере столбцы идентификаторов в таблице inventory будут возвращены к своим начальным значениям. Это полезно, если у вас есть поле первичного ключа, которое вы хотите перезапустить с 1.
Синтаксис
Синтаксис для оператора ORDER BY в SQL.
SELECT expressions FROM tables ORDER BY expression ;
Параметры или аргумент
- expressions
- Столбцы или расчеты, которые вы хотите получить
- tables
- Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица
- WHERE conditions
- Необязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны
- ASC
- Необязательный. ASC сортирует результирующий набор в порядке возрастания по expressions. Это поведение по умолчанию, если модификатор не указан.
- DESC
- Необязательный. DESC сортирует результирующий набор в порядке убывания по expressions
About Daniel Calbimonte
Daniel Calbimonte is a Microsoft Most Valuable Professional, Microsoft Certified Trainer and Microsoft Certified IT Professional for SQL Server. He is an accomplished SSIS author, teacher at IT Academies and has over 13 years of experience working with different databases.
He has worked for the government, oil companies, web sites, magazines and universities around the world. Daniel also regularly speaks at SQL Servers conferences and blogs. He writes SQL Server training materials for certification exams.
He also helps with translating SQLShack articles to Spanish
View all posts by Daniel Calbimonte
Пример — сортировка результатов по убыванию
При сортировке набора результатов в порядке убывания вы используете атрибут DESC в предложении ORDER BY. Давайте внимательнее посмотрим. В этом примере у нас есть таблица suppliers со следующими данными:
supplier_id | supplier_name | city | state |
---|---|---|---|
100 | Yandex | Moscow | Russian |
200 | Lansing | Michigan | |
300 | Oracle | Redwood City | California |
400 | Bing | Redmond | Washington |
500 | Yahoo | Sunnyvale | Washington |
600 | DuckDuckGo | Paoli | Pennsylvania |
700 | Qwant | Paris | France |
800 | Menlo Park | California | |
900 | Electronic Arts | San Francisco | California |
Введите следующий SQL оператор.
PgSQL
SELECT * FROM suppliers WHERE supplier_id > 40 ORDER BY supplier_id DESC;
1 2 3 4 |
SELECT* FROMsuppliers WHEREsupplier_id>40 ORDERBYsupplier_idDESC; |
Будет выбрано 5 записей. Вот результаты, которые вы должны получить.
supplier_id | supplier_name | city | state |
---|---|---|---|
900 | Electronic Arts | San Francisco | California |
800 | Menlo Park | California | |
700 | Qwant | Paris | France |
600 | DuckDuckGo | Paoli | Pennsylvania |
500 | Yahoo | Sunnyvale | Washington |
В этом примере будет отсортирован набор результатов по полю supplier_id в порядке убывания.
Пример с несколькими выражениями
Затем давайте посмотрим, как имитировать запрос INTERSECT в MySQL, который возвращает более одного столбца.
Во-первых, так вы должны использовать оператор INTERSECT для возврата нескольких выражений.
MySQL
SELECT contact_id, last_name, first_name FROM contacts WHERE contact_id < 100 INTERSECT SELECT customer_id, last_name, first_name FROM customers WHERE last_name <> ‘Johnson’;
1 2 3 4 5 6 7 |
SELECTcontact_id,last_name,first_name FROMcontacts WHEREcontact_id<100 INTERSECT SELECTcustomer_id,last_name,first_name FROMcustomers WHERElast_name<>’Johnson’; |
Опять же, поскольку вы не можете использовать оператор INTERSECT в MySQL, вы можете использовать предложение EXISTS в более сложных ситуациях для имитации запроса INTERSECT следующим образом:
MySQL
SELECT contacts.contact_id, contacts.last_name, contacts.first_name FROM contacts WHERE contacts.contact_id < 100 AND EXISTS (SELECT * FROM customers WHERE customers.last_name <> ‘Markoski’ AND customers.customer_id = contacts.contact_id AND customers.last_name = contacts.last_name AND customers.first_name = contacts.first_name);
1 2 3 4 5 6 7 8 9 |
SELECTcontacts.contact_id,contacts.last_name,contacts.first_name FROMcontacts WHEREcontacts.contact_id<100 ANDEXISTS(SELECT* FROMcustomers WHEREcustomers.last_name<>’Markoski’ ANDcustomers.customer_id=contacts.contact_id ANDcustomers.last_name=contacts.last_name ANDcustomers.first_name=contacts.first_name); |
В этом более сложном примере вы можете использовать предложение EXISTS для возврата нескольких выражений, которые существуют как в таблице contacts, где contact_id меньше 100, так и в таблице customers, где last_name не равно ‘Markoski’.
Поскольку вы выполняете INTERSECT, вам необходимо соединить пересекающиеся поля следующим образом:
AND customers.customer_id = contacts.contact_id AND customers.last_name = contacts.last_name AND customers.first_name = contacts.first_name
Это соединение выполняется для того, чтобы поля customer_id, last_name и first_name из таблицы customers пересекались бы с полями contact_id, last_name и first_name из таблицы contacts.
Differences between SQL intersect and SQL INNER join
For some scenarios, both options can be used. The way the results is displayed are different. If you are not familiar with inner join we strongly recommend to check our link related:
A step-by-step walkthrough of SQL Inner Join
The inner join will show common values between
Let’s take a look at the results of the intersect first:
1 2 3 |
selectCurrencykeyfromdbo.FactInternetSales intersect selectcurrencykeyfromDimCurrency |
The result of the previous query is the following:
Now, let’s take a look at the inner join:
1 2 3 |
selectf.Currencykeyfromdbo.FactInternetSalesf innerjoindimcurrencyd onf.currencykey=d.currencykey |
The result of the inner join is the following:
The main visible difference is that intersect does not show repeated values. That may imply a big difference in the performance.
If we run a select distinct with the inner join, we may have the same value that we have got using the intersect clause.
1 2 3 |
selectdistinctf.Currencykeyfromdbo.FactInternetSalesf innerjoindimcurrencyd onf.currencykey=d.currencykey |
Синтаксис
Cинтаксис Oracle PL/SQL WITH с одним подзапросом:
WITH query_name AS (SELECT expressions FROM table_A) SELECT column_list FROM query_name
или
Cинтаксис Oracle PL/SQL WITH с с несколькими подзапросами:
WITH query_name_A AS (SELECT expressions FROM table_A), query_name_B AS ( | ) SELECT column_list FROM query_name_A, query_name_B
expressions — поля или расчеты подзапроса.column_list — поля или расчеты основного запроса.table_A, table_B, table_X, table_Z — таблицы или соединения для подзапросов.query_name_A, query_name_B — псевдоним подзапроса. Если подзапросов несколько, то они перечисляются через запятую.WHERE conditions — условия которые должны быть выполнены для основных запросов.
Пример — сортировка результатов по относительной позиции
Вы также можете использовать SQL оператор ORDER BY для сортировки по относительной позиции в наборе результатов, где первое поле в наборе результатов равно 1, второе поле равно 2, третье поле равно 3 и т.д. В этом примере у нас есть таблица products со следующими данными:
product_id | product_name | category_id |
---|---|---|
1 | Pear | 50 |
2 | Banana | 50 |
3 | Orange | 50 |
4 | Apple | 50 |
5 | Bread | 75 |
6 | Sliced Ham | 25 |
7 | Kleenex | NULL |
Теперь введите следующий SQL оператор.
PgSQL
SELECT product_id, product_name FROM products WHERE product_name <> ‘Bread’ ORDER BY 1 DESC;
1 2 3 4 5 |
SELECTproduct_id, product_name FROMproducts WHEREproduct_name<>’Bread’ ORDERBY1DESC; |
Будет выбрано 6 записей. Вот результаты, которые вы должны получить.
product_id | product_name |
---|---|
7 | Kleenex |
6 | Sliced Ham |
4 | Apple |
3 | Orange |
2 | Banana |
1 | Pear |
В этом примере результаты сортируются по полю product_id в порядке убывания, поскольку поле product_id находится в позиции № 1 в наборе результатов и будет эквивалентно следующему SQL оператору ORDER BY.
PgSQL
SELECT product_id, product_name FROM products WHERE product_name <> ‘Bread’ ORDER BY product_id DESC;
1 2 3 4 5 |
SELECTproduct_id, product_name FROMproducts WHEREproduct_name<>’Bread’ ORDERBYproduct_idDESC; |
Пример — использование атрибутов ASC и DESC
При сортировке набора результатов с помощью SQL предложения ORDER BY вы можете использовать атрибуты ASC и DESC в одном операторе SELECT. В этом примере давайте использовать ту же таблицу products, что и в предыдущем примере.
product_id | product_name | category_id |
---|---|---|
1 | Pear | 50 |
2 | Banana | 50 |
3 | Orange | 50 |
4 | Apple | 50 |
5 | Bread | 75 |
6 | Sliced Ham | 25 |
7 | Kleenex | NULL |
Теперь введите следующий SQL оператор.
PgSQL
SELECT * FROM products WHERE product_id <> ORDER BY category_id DESC, product_name ASC;
1 2 3 4 5 |
SELECT* FROMproducts WHEREproduct_id<> ORDERBYcategory_idDESC, product_nameASC; |
Будет выбрано 6 записей. Вот результаты, которые вы должны получить.
product_id | product_name | category_id |
---|---|---|
5 | Bread | 75 |
4 | Apple | 50 |
2 | Banana | 50 |
3 | Orange | 50 |
1 | Pear | 50 |
6 | Sliced Ham | 25 |
В этом примере возвращаются записи, отсортированные по полю category_id в порядке убывания, а вторичная сортировка — по полю product_name в порядке возрастания.
С этим читают
- Select (transact-sql)select (transact-sql)
- Обзор основных sql запросов
- Команда union
- Identity (функция) (transact-sql)identity (function) (transact-sql)
- Select distinct from (dmx)
- Обновление sql server с помощью мастера установки (программа установки)upgrade sql server using the installation wizard (setup)
- Sql server express localdb
- Что такое субд
- Удаление базы данныхdelete a database
- Download sql server management studio (ssms)