SELECT
операторът е почти без съмнение, най-често използваният израз в SQL.
SELECT
операторът се използва за извличане на данни от базата данни. Можете да посочите кои редове искате да бъдат върнати и кои колони.
Пример
Ето пример за демонстрация на SELECT
изявление.
SELECT *
FROM Pets;
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
В този пример използвахме звездичката (*
) заместващ знак за връщане на всички колони. Използвахме и FROM
клауза, за да посочите от коя таблица да получите данни.
Така че тази заявка връща всички редове и всички колони от Pets
таблица.
Посочете колоните
Можете да посочите колоните, които искате да бъдат върнати.
За да направите това, заменете заместващия знак със звездичка с имената на колоните, всяко разделено със запетая, в реда, в който искате да бъдат върнати.
SELECT PetId, PetName, DOB
FROM Pets;
Резултат:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 2 | Fetch | 2019-08-16 | | 3 | Scratch | 2018-10-01 | | 4 | Wag | 2020-03-15 | | 5 | Tweet | 2020-11-28 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | | 8 | Meow | NULL | +---------+-----------+------------+
Обикновено се счита за добра практика да го направите по този начин и да върнете само онези колони, от които всъщност се нуждаете. Използването на заместващия знак звездичка за връщане на всички колони може да има неблагоприятно въздействие върху производителността, особено в по-големи бази данни.
Посочете редовете
Има много начини да филтрирате резултатите само до тези редове, които ви интересуват. Най-често срещаният начин е да използвате WHERE
клауза. Тази клауза ви позволява да посочите условие, на което трябва да отговаря даден ред, за да се квалифицира.
Ето пример за демонстрация.
SELECT PetId, PetName, DOB
FROM Pets
WHERE PetName = 'Fluffy';
Резултат:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 6 | Fluffy | 2020-09-17 | +---------+-----------+------------+
В нашия случай имаше два реда, които отговаряха на нашето условие за търсене.
Нашето условие за търсене използва оператора за равенство (=
), за да посочите, че стойността на PetName
колоната трябва да съответства на посочената стойност (Fluffy
) точно.
Има много други оператори, които можете да използвате в условията на търсене. Например, можете да използвате LIKE
оператор за връщане на домашни любимци, чието име започва с F
или Fluff
или каквото и да е.
Можете да добавите още условия към WHERE
клауза чрез използване на оператори като AND
и OR
оператори.
Ето един пример.
SELECT PetId, PetName, DOB
FROM Pets
WHERE PetName = 'Fluffy'
OR DOB < '2020-01-01';
Резултат:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 2 | Fetch | 2019-08-16 | | 3 | Scratch | 2018-10-01 | | 6 | Fluffy | 2020-09-17 | +---------+-----------+------------+
В този пример върнахме всички редове, където името на домашния любимец е Fluffy или където датата на раждане на домашния любимец (посочена в DOB
). колона) е по-малко от определена дата. Използвахме оператора less than (<
), за да уточните това.
Връщане на нетаблични данни
SELECT
операторът може да се използва и за връщане на данни, които не се съхраняват в таблица. Например, напълно законно е да направите това:
SELECT 'Hey there!';
Резултат:
+--------------------+ | (No column name) | |--------------------| | Hey there! | +--------------------+
Забележете, че когато правим това, колоната няма име. Можем да използваме псевдоним, за да дадем име на полученото поле.
Ето още няколко примера за избор на данни, които не са в таблица, и предоставяне на псевдоним за всяко върнато поле:
SELECT
2 + 3 AS "2 + 3",
'Fluffy' + ' ' + 'Smith' AS FullName,
SYSDATETIME() AS "Date/time";
Резултат:
+---------+--------------+-----------------------------+ | 2 + 3 | FullName | Date/time | |---------+--------------+-----------------------------| | 5 | Fluffy Smith | 2020-12-04 23:58:55.8483734 | +---------+--------------+-----------------------------+
Ето кратък преглед:
- Първата колона просто добави две числа.
- Втората колона обединява три низа (включително символ за интервал). Можете също да свържете низове с числа, ако е необходимо.
- Третата колона използва
SYSDATETIME()
функция за връщане на текущата дата и час. Тази функция е налична в SQL Server. Други СУБД имат свои собствени функции за дата и час. Вижте функции за дата/час на SQLite, функции за дата/час на SQL Server и функции за дата/час на PostgreSQL за списък с функции за дата и час, налични в тези СУБД.
Подзаявки
Възможно е да имате няколко SELECT
изрази в една заявка. Можем да направим това с помощта на подзаявка.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Резултат:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
В този пример използвахме IN
оператор, за да посочите подзаявка. Тази подзаявка избра данни от друга таблица и IN
оператор го свърза обратно с външната заявка.
Поръчване на резултатите
Можете да използвате ORDER BY
клауза за сортиране на резултатите.
Например, бихме могли да сортираме предишните резултати по PetTypeId
колона в низходящ ред:
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets )
ORDER BY PetTypeId DESC;
Резултат:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 3 | Dog | | 2 | Cat | | 1 | Bird | +-------------+-----------+
Вижте SQL ORDER BY
Клауза за начинаещи за повече примери и подробно обяснение.
По-разширени SELECT
Изявления
SELECT
операторът е много прост израз, но може да се използва за създаване на много сложни заявки.
Ето заявка, която е малко по-сложна от предишните.
SELECT
PetTypes.PetType,
COUNT(Pets.PetTypeId) AS Count
FROM Pets
LEFT JOIN PetTypes
ON Pets.PetTypeId = PetTypes.PetTypeId
GROUP BY PetTypes.PetType
ORDER BY Count DESC;
Резултат:
+-----------+---------+ | PetType | Count | |-----------+---------| | Dog | 4 | | Cat | 3 | | Bird | 1 | +-----------+---------+
В света на SQL заявките това все още е доста просто, но съдържа много от елементите, често срещани в по-сложни заявки.
Например, тази заявка използва присъединяване за извличане на данни от множество таблици. Той също така използва GROUP BY
клауза за разделяне на редовете на групи.
Вижте SQL GROUP BY
Клауза за начинаещи за повече примери за GROUP BY
клауза.
Вижте урока за SQL Joins, за да видите как да извлечете данни от множество таблици и да ги върнете като един набор от резултати.
SELECT INTO
Изявление
Някои СУБД поддържат SELECT INTO
изявление. Това е малко по-различно от предишните примери, тъй като засяга данните в базата данни.
SELECT INTO
оператор създава нова таблица и вмъква данни в нея от друга таблица.
По принцип става така:
SELECT * INTO Table2
FROM Table1;
В този пример създаваме нова таблица, наречена Table2
и вмъкнете всички данни от Table1
в него. Table2
ще има същата дефиниция като Table1
.
Вижте SQL SELECT INTO
Изявление за още примери.
Както споменах, не всички СУБД поддържат това твърдение. Ако вашата СУБД не поддържа SELECT INTO
изявление, опитайте да използвате CREATE TABLE ... AS SELECT
вместо това изявление.
Тези изрази създават нова таблица като част от тяхната работа. За да вмъкнете данни в таблица, която вече съществува, опитайте да използвате INSERT INTO ... SELECT
вместо това изявление.