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 |
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_namechar(50)NOTNULL, citychar(50), statechar(25), CONSTRAINTsuppliers_pkPRIMARYKEY(supplier_id) insertintosuppliersvalues(1,’Mari’,’Houston’,’Texas’); insertintosuppliersvalues(2,’Frida’,’ Melbourne’,’Florida’); insertintosuppliersvalues(3,’Madlen’,’Phoenix’,’Arizona’); insertintosuppliersvalues(4,’Valentina’,’San Diego’,’California’); insertintosuppliersvalues(5,’Amba’,’Jacksonville’,’Florida’); |
Содержимое таблицы suppliers:
supplier_id | supplier_name | city | state |
---|---|---|---|
1 | Mari | Houston | Texas |
2 | Frida | Philadelphia | Pennsylvania |
3 | Madlen | Phoenix | Arizona |
4 | Valentina | SanDiego | California |
5 | Amba | Jacksonville | Florida |
Пример — 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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 ?