Select, select distinct. вывод данных из таблиц в mysql

Параметры или аргументы

dynamic_string
Строковый литерал, переменная или выражение, представляющее один оператор SQL или блок PL/SQL. Он должен иметь тип CHAR или VARCHAR2, а не NCHAR или NVARCHAR2.
BULK COLLECT
Сохраняет значения результатов в одной или нескольких коллекциях для более быстрых запросов, чем циклы с операторами FETCH.
INTO
Используется только для однострочных запросов, в этом разделе указываются переменные или записи, в которые извлекаются значения столбцов. Для каждого значения, полученного запросом, в предложении INTO должна быть соответствующая тип-совместимая переменная или поле.
define_variable
Переменная, в которой сохраняется значение выбранного столбца.
record_name
Пользовательская запись или запись %ROWTYPE, в которой сохраняется выбранная строка.
bind_argument
Выражение, значение которого передается в динамический оператор SQL, или переменная, в которой сохраняется значение, возвращаемое динамическим оператором SQL.
collection_name
Объявленная коллекция, в которую извлекаются значения select_item из dynamic_string. Для каждого select_item должна быть соответствующая, совместимая с типом коллекция в списке.
host_array_name
Массив (объявленный в хост-среде PL/SQL и переданный PL/SQL как переменная связывания), в который извлекаются значения select_item. Для каждого select_item должен быть соответствующий, совместимый с типом массив в списке. Массивы хоста должны начинаться с двоеточия.
USING
По умолчанию — IN. Определяет список входных и/или выходных аргументов привязки.
returning_clause
Возвращает значения из вставленных строк, устраняя необходимость SELECT строки после. Вы можете извлечь значения столбца в переменные или в коллекции. Вы не можете использовать предложение RETURNING для удаленной или параллельной вставки. Если инструкция не влияет ни на какие строки, значения переменных, указанных в предложении RETURNING, не определены.

Пример — использование EXISTS с оператором DELETE

Вы также можете выполнять более сложные удаления.

Вы можете удалить записи в одной таблице на основе значений в другой таблице. Поскольку вы не можете перечислить более одной таблицы в предложении FROM при выполнении удаления, вы можете использовать предложение EXISTS.

В этом примере у нас есть таблица customer со следующими данными:

customer_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
6000  Mila Kunis yahoo.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL
9000 Russell Crowe google.com

И таблица orders со следующими данными:

order_id customer_id order_date
1 7000 2019/06/18
2 5000 2019/06/18
3 8000 2019/06/19
4 4000 2019/06/20
5 NULL 2019/07/01

Введите следующий оператор DELETE:

PgSQL

DELETE FROM orders
WHERE EXISTS
(SELECT *
FROM customers
WHERE customers.customer_id = orders.customer_id
AND customers.last_name = ‘Bieber’);

1
2
3
4
5
6

DELETEFROMorders

WHEREEXISTS

(SELECT*

FROMcustomers

WHEREcustomers.customer_id=orders.customer_id

ANDcustomers.last_name=’Bieber’);

Будет удалена 1 запись. Выберите данные из таблицы orders еще раз:

PgSQL

SELECT * FROM orders;

1 SELECT*FROMorders;

Вот результаты, которые вы должны получить:

order_id customer_id order_date
1 7000 2019/06/18
2 5000 2019/06/18
3 8000 2019/06/19
5 NULL 2019/07/01

В этом примере удаляются все записи из таблицы orders, где в таблице customers есть запись с фамилией ‘Bieber’ и совпадающим значением customer_id в обеих таблицах. В этом примере была удалена запись для order_id = 4.

Execution Plan of SQL Count distinct function

Let’s look at the Actual Execution Plan of the SQL COUNT DISTINCT function. You need to enable the Actual Execution Plan from the SSMS Menu bar as shown below.

Execute the query to get an Actual execution plan. In this execution plan, you can see top resource consuming operators:

  • Sort (Distinct Sort) – Cost 78%
  • Table Scan – Cost 22%

You can hover the mouse over the sort operator, and it opens a tool-tip with the operator details.

In the properties windows, also we get more details around the sort operator including memory allocation, statistics, and the number of rows.

In a table with million records, SQL Count Distinct might cause performance issues because a distinct count operator is a costly operator in the actual execution plan.

SQL Server 2019 improves the performance of SQL COUNT DISTINCT operator using a new Approx_count_distinct function. This new function of SQL Server 2019 provides an approximate distinct count of the rows. There might be a slight difference in the SQL Count distinct and Approx_Count_distinct function output.

You can replace SQL COUNT DISTINCT with the keyword Approx_Count_distinct to use this function from SQL Server 2019.

1
2

SELECTAPPROX_COUNT_DISTINCT(City)

FROMLocation;

You can explore more on this function in The new SQL Server 2019 function Approx_Count_Distinct.

Практическое упражнение №2

На основании таблицы suppliers ниже, выберите уникальные значения city, которые находятся в штате Florida и упорядочить результаты в порядке убывания по city (городам):

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_idintNOTNULL,

supplier_namechar(50)NOTNULL,

citychar(50),

statechar(25),

CONSTRAINTsuppliers_pkPRIMARYKEY(supplier_id)
);
—вставляем записи в таблицу suppliers

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

Пример — DISTINCT ON

Одна вещь, которая уникальна в PostgreSQL, по сравнению с другими базами данных, заключается в том, что у вас есть еще одна опция при использовании оператора DISTINCT, которая называется DISTINCT ON. DISTINCT ON вернет только первую строку для DISTINCT ON (diver_expressions) на основе оператора ORDER BY, предоставленного в запросе. Любые другие поля, перечисленные в операторе SELECT, будут возвращены для этой первой строки. Это похоже на выполнение LIMIT в 1 для каждой комбинации DISTINCT ON (Different_expressions). Давайте подробнее рассмотрим, как использовать DISTINCT ON в операторе DISTINCT и что он возвращает. Таким образом, мы могли бы изменить пример выше :

PgSQL

SELECT DISTINCT ON (last_name) last_name, city, state
FROM contacts
ORDER BY last_name, city, state;

1
2
3

SELECTDISTINCTON(last_name)last_name,city,state

FROMcontacts

ORDERBYlast_name,city,state;

Этот пример DISTINCT, в котором используются ключевые слова DISTINCT ON, вернет все уникальные значения last_name. Но в этом случае для каждого уникального значения last_name он будет возвращать только первую уникальную запись last_name, с которой он сталкивается, на основе оператора ORDER BY вместе с city и state значениями из этой записи. Он не возвращает уникальные комбинации last_name, city и state. По сути, он выполняет LIMIT, равный 1, для каждого DISTINCT ON (last_name) и возвращает соответствующие значения city и state после того, как он выбрал возвращеные записи.

Пример оператора DELETE с одним условием

Если вы запустите оператор DELETE без условий в предложении WHERE, все записи из таблицы будут удалены. В результате вы чаще всего будете включать предложение WHERE, по крайней мере с одним условием, в свой оператор DELETE.

Давайте начнем с простого примера запроса DELETE, который имеет одно условие в предложении WHERE.

В этом примере у нас есть таблица suppliers со следующими данными:

supplier_id supplier_name city state
100 Yandex Moscow Moscow
200 Lansing Michigan
300 Oracle Redwood City California
400 Bing Redmond Washington
500 Yahoo Sunnyvale Washington
600 DuckDuckGo Paoli Pennsylvania
700 Qwant Paris Ile de France
800 Menlo Park California
900 Electronic Arts San Francisco California

Введите следующий оператор DELETE:

PgSQL

DELETE FROM suppliers
WHERE supplier_name = ‘Yandex’;

1
2

DELETEFROMsuppliers

WHEREsupplier_name=’Yandex’;

Будет удалена 1 запись. Снова выберите данные из таблицы поставщиков:

PgSQL

SELECT * FROM suppliers;

1 SELECT*FROMsuppliers;

Вот результаты, которые вы должны получить:

supplier_id supplier_name city state
200 Lansing Michigan
300 Oracle Redwood City California
400 Bing Redmond Washington
500 Yahoo Sunnyvale Washington
600 DuckDuckGo Paoli Pennsylvania
700 Qwant Paris Ile de France
800 Menlo Park California
900 Electronic Arts San Francisco California

В этом примере удаляются все записи из таблицы suppliers, где supplier_name — Yandex.

Вы можете проверить количество строк, которые будут удалены. Вы можете определить количество строк, которые будут удалены, выполнив следующий запрос SELECT перед выполнением удаления:

PgSQL

SELECT COUNT(*)
FROM suppliers
WHERE supplier_name = ‘Yandex’;

1
2
3

SELECTCOUNT(*)

FROMsuppliers

WHEREsupplier_name=’Yandex’;

Этот запрос вернет количество записей, которые будут удалены при выполнении оператора DELETE.

COUNT(*)
1

SQL Count Function

We use SQL Count aggregate function to get the number of rows in the output. Suppose we have a product table that holds records for all products sold by a company. We want to know the count of products sold during the last quarter. We can use SQL Count Function to return the number of rows in the specified condition.

The syntax of the SQL COUNT function:
COUNT ( expression);

By default, SQL Server Count Function uses All keyword. It means that SQL Server counts all records in a table. It also includes the rows having duplicate values as well.

Let’s create a sample table and insert few records in it.

1
2
3
4
5
6
7

CREATETABLE##TestTable (Idintidentity(1,1),Col1char(1)NULL);

INSERTINTO##TestTableVALUES(‘A’);

INSERTINTO##TestTableVALUES(‘A’);

INSERTINTO##TestTableVALUES(‘B’);

INSERTINTO##TestTableVALUES(‘B’);

INSERTINTO##TestTableVALUES(NULL);

INSERTINTO##TestTableVALUES(NULL);

In this table, we have duplicate values and NULL values as well.

In the following screenshot, we can note that:

  • Count (*) includes duplicate values as well as NULL values
  • Count (Col1) includes duplicate values but does not include NULL values

Suppose we want to know the distinct values available in the table. We can use SQL COUNT DISTINCT to do so.

1
2

Selectcount(DISTINCTCOL1)

from##TestTable

In the following output, we get only 2 rows. SQL COUNT Distinct does not eliminate duplicate and NULL values from the result set.

Let’s look at another example. In this example, we have a location table that consists of two columns City and State.

1
2
3
4
5
6
7
8
9

CREATETABLELocation

(CityVARCHAR(30),

StateVARCHAR(20)

);

Insertintolocationvalues(‘Gurgaon’,’Haryana’)

Insertintolocationvalues(‘Gurgaon’,’Rajasthan’)

Insertintolocationvalues(‘Jaipur’,’Rajasthan’)

Insertintolocationvalues(‘Jaipur’,’Haryana’)

Now, execute the following query to find out a count of the distinct city from the table.

1
2

SELECTCOUNT(DISTINCT(City))

FROMLocation;

It returns the count of unique city count 2 (Gurgaon and Jaipur) from our result set.

If we look at the data, we have similar city name present in a different state as well. The combination of city and state is unique, and we do not want that unique combination to be eliminated from the output.

We can use SQL DISTINCT function on a combination of columns as well. It checks for the combination of values and removes if the combination is not unique.

1
2

SELECTDISTINCTCity,State

FROMLocation;

It does not remove the duplicate city names from the output because of a unique combination of values.

Let’s insert one more rows in the location table.

1 Insertintolocationvalues(‘Gurgaon’,’Haryana’)

We have 5 records in the location table. In the data, you can see we have one combination of city and state that is not unique.

Rerun the SELECT DISTINCT function, and it should return only 4 rows this time.

We cannot use SQL COUNT DISTINCT function directly with the multiple columns. You get the following error message.

We can use a temporary table to get records from the SQL DISTINCT function and then use count(*) to check the row counts.

1
2
3
4

SELECTDISTINCTCity,State

into#Temp

FROMLocation;

Selectcount(*)from#Temp

We get the row count 4 in the output.

If we use a combination of columns to get distinct values and any of the columns contain NULL values, it also becomes a unique combination for the SQL Server.

To verify this, let’s insert more records in the location table. We did not specify any state in this query.

1
2

Insertintolocationvalues(‘Gurgaon’,»)

Insertintolocation(city)values(‘Gurgaon’)

Let’s look at the location table data.

Re-run the query to get distinct rows from the location table.

1
2

SELECTdistinctCity,State

FROMLocation;

In the output, we can see it does not eliminate the combination of City and State with the blank or NULL values.

Similarly, you can see row count 6 with SQL COUNT DISTINCT function.

SQL Справочник

SQL Ключевые слова
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 Функции
Функции строк
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
Функции чисел
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
Функции дат
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
Функции расширений
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 функции
Функции строк
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
Функции чисел
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
Функции дат
CURRENT_TIMESTAMP
DATEADD
DATEDIFF
DATEFROMPARTS
DATENAME
DATEPART
DAY
GETDATE
GETUTCDATE
ISDATE
MONTH
SYSDATETIME
YEAR
Функции расширений
CAST
COALESCE
CONVERT
CURRENT_USER
IIF
ISNULL
ISNUMERIC
NULLIF
SESSION_USER
SESSIONPROPERTY
SYSTEM_USER
USER_NAME

MS Access функции
Функции строк
Asc
Chr
Concat with &
CurDir
Format
InStr
InstrRev
LCase
Left
Len
LTrim
Mid
Replace
Right
RTrim
Space
Split
Str
StrComp
StrConv
StrReverse
Trim
UCase
Функции чисел
Abs
Atn
Avg
Cos
Count
Exp
Fix
Format
Int
Max
Min
Randomize
Rnd
Round
Sgn
Sqr
Sum
Val
Функции дат
Date
DateAdd
DateDiff
DatePart
DateSerial
DateValue
Day
Format
Hour
Minute
Month
MonthName
Now
Second
Time
TimeSerial
TimeValue
Weekday
WeekdayName
Year
Другие функции
CurrentUser
Environ
IsDate
IsNull
IsNumeric

SQL ОператорыSQL Типы данныхSQL Краткий справочник

PostgreSQL SELECT DISTINCT examples

Let’s create a new table called and insert data into it for practicing the  clause.

Note that you will learn how to create a table and insert data into a table in the subsequent tutorial. In this tutorial, you just execute the statement in psql or pgAdmin to execute the statements.

First, use the following statement to create the  table that consists of three columns: , and .

Second, insert some rows into the table using the following  statement:

Third, query the data from the table using the statement:

PostgreSQL one column example

The following statement selects unique values in the   column from the table and sorts the result set in alphabetical order by using the clause.

PostgreSQL multiple columns

The following statement demonstrates how to use the  clause on multiple columns:

Because we specified both and columns in the clause, PostgreSQL combined the values in both and columns to evaluate the uniqueness of the rows.

The query returns the unique combination of and from the  table. Notice that the table has two rows with value in both   and   columns. When we applied the  to both columns, one row was removed from the result set because it is the duplicate.

PostgreSQL example

The following statement sorts the result set by the   and  , and then for each group of duplicates, it keeps the first row in the returned result set.

Here is the output:

In this tutorial, you have learned how to use PostgreSQL statement to remove duplicate rows returned by a query.

  • Was this tutorial helpful ?
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *