Примеры использования инструкции select (transact-sql)select examples (transact-sql)

Пример

Пример процедуры, в которой используется исключительная ситуация определенная программистом:


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 в порядке возрастания.


С этим читают