Основы SQL для начинающих с уроками. Примеры SQL запросов к базе данных MySQL Синтаксис оператора SELECT
SQL - Оператор SELECT
Название SQL (Structured Query Language – язык структурированных запросов) отражает тот факт, что запросы являются наиболее часто используемым элементом SQL. Запрос – это оператор, который посылает команду Системе Управления Базой Данных (СУБД) произвести манипуляцию или отобразить определенную информацию. Все запросы по выборке данных в SQL конструируются с помощью оператора SELECT. Он позволяет выполнять довольно сложные проверки и обработку данных.
Запрос может выводить данные из определенного столбца или изо всех столбцов таблицы. Чтобы создать простейших SELECT запрос, необходимо указать имя столбца и название таблицы.
Синтаксис оператора SELECT
SELECT column_list FROM table_nameSELECT Ключевое слово, которое сообщает базе данных о том, что оператор является запросом. Все запросы начинаются с этого слова, за ним следует пробел.
Column_list Список столбцов таблицы, которые выбираются запросом. Столбцы, не указанные в операторе, не будут включены в результат. Если необходимо вывести данные всех столбцов, можно использовать сокращенную запись. Звездочка (*) означает полный список столбцов.
FROM table_name Ключевое слово, которое должно присутствовать в каждом запросе. После него через пробел указывается имя таблицы, являющейся источником данных.
Код в скобках является не обязательным в операторе SELECT. Он необходим для более точного определения запроса.
Также необходимо сказать, что SQL код является регистронезависимым. Это означает, что запись SELECT можно написать как select. СУБД не отличит эти две записи, однако советуют все операторы SQL писать прописными буквами, чтобы его легко можно было отличить от другого кода.
Примеры рассмотрим на таблице Salespeople (продавцы) из классического учебника по SQL Мартина Грабера.
Вот MySQL код для создания тестовой таблицы:
CREATE TABLE `salespeople` (`snum` INTEGER(11) NOT NULL AUTO_INCREMENT, `sname` VARCHAR(20) COLLATE cp1251_general_ci DEFAULT NULL, `city` VARCHAR(20) COLLATE cp1251_general_ci DEFAULT NULL, `comm` DOUBLE(15,3) DEFAULT NULL, PRIMARY KEY (`snum`))ENGINE=InnoDB CHARACTER SET "cp1251" COLLATE "cp1251_general_ci" COMMENT="InnoDB free: 5120 kB"; INSERT INTO `salespeople` (`snum`, `sname`, `city`, `comm`) VALUES (1001,"Peel","London",0.120), (1002,"Serres","San Jose",0.130), (1003,"Axelrod","New York",0.100), (1004,"Motika","London",0.110), (1007,"Rifkin","Barcelona",0.150); COMMIT;
Таблица выглядит так:
Пример использования оператора SELECT
1. Необходимо вывести список продавцов, и отобразить их имена (sname)
SELECT sname FROM Salespeople
Результат:
Здесь после оператора SELECT перечисляются столбцы, которые необходимо вывести. Имена столбцов пишутся через запятую.3. Необходимо вывести всю таблицу
Для этого можно использовать разный синтаксис написания запросов. Перечисляем каждый столбец после оператора SELECT:
SELECT snum , sname , city , comm FROM Salespeople
Или можно добиться того же результата, используя сокращенную запись:
SELECT * FROM Salespeople
Результат:
snum | sname | city | comm |
---|---|---|---|
1001 | Peel | London | 0,12 |
1002 | Serres | San Jose | 0,13 |
1003 | Axelrod | New York | 0,1 |
1004 | Motika | London | 0,11 |
1007 | Rifkin | Barcelona | 0,15 |
Так будут выведены 4 столбца, однако при такой записи можно легко закомментировать ненужный столбец. Например так:
SELECT /* snum , */ sname , city , comm FROM Salespeople
Теперь столбец snum выводиться не будет, потому что он закомментирован. Очень быстро и удобно. Как писать SQL код, решать конечно Вам, но знать такие вещи иногда бывает полезно.
Использование выражений (expressions) в операторе SELECT
Многие СУБД предоставляют специальные возможности по обработке результатов запроса. Набор таких средств в разных СУБД различен, однако существуют некоторые стандартные возможности, такие как выражения. Например может потребоваться выполнить простые математические операции над данными, чтобы представить их в более удобном виде, или вставить дополнительный текст в результат запроса. SQL позволяет размещать среди выбранных столбцов скалярные выражения и константы, которые могут дополнять или замещать столбцы в предложениях SELECT. Рассмотрим пример.
4. Необходимо вывести комиссионные (comm) продавцов в виде процентов, а не десятичных чисел
SELECT snum, sname, city, comm * 100 FROM Salespeople
Результат:
snum | sname | city | comm |
---|---|---|---|
1001 | Peel | London | 12 |
1002 | Serres | San Jose | 13 |
1003 | Axelrod | New York | 10 |
1004 | Motika | London | 11 |
1007 | Rifkin | Barcelona | 15 |
Этот столбец не имеет названия, потому что не содержит измененные данные и поэтому именуется по усмотрению СУБД (например MySQL именует столбец comm * 100, в примерах М.Граббера столбец имеет имя 4, т.е его номер).
В таких случаях удобно использовать именование столбцов . Например можно назвать последний столбец percent. Для этого после имени столбца необходимо указать ключевое слово AS и затем имя столбца в результирующей страницы.
SELECT snum, sname, city, comm * 100 AS "percent"
FROM Salespeople
Результат:
snum | sname | city | percent |
---|---|---|---|
1001 | Peel | London | 12 |
1002 | Serres | San Jose | 13 |
1003 | Axelrod | New York | 10 |
1004 | Motika | London | 11 |
1007 | Rifkin | Barcelona | 15 |
В результате запроса последний столбец именуется строкой "percent", что облегчает понимание.
Так как выводится число в виде процентов, то неплохо бы обозначить это в результате. На помощь приходит возможность SQL добавлять текст в результат . Выглядит это так:
SELECT snum, sname, city, comm * 100 AS percent , "%" FROM Salespeople
Результат:
snum | sname | city | percent | % |
---|---|---|---|---|
1001 | Peel | London | 12 | % |
1002 | Serres | San Jose | 13 | % |
1003 | Axelrod | New York | 10 | % |
1004 | Motika | London | 11 | % |
1007 | Rifkin | Barcelona | 15 | % |
Видно, что после вывода строки из БД, появился новый столбец, заполненный знаком процента (%).
Если Вас не устраивает вывод данных и дополняющего текста в разных столбцах, то можно использовать специальные функции Вашей СУБД, для объединения в один столбец.
В MySQL для этого используется функция CONCAT . Вот ее определение из справочника:
CONCAT(str1,str2,...)
Возвращает строку, являющуюся результатом конкатенации аргументов. Если хотя бы один из аргументов равен NULL, возвращается NULL. Может принимать более 2 аргументов. Числовой аргумент преобразуется в эквивалентную строковую форму.
Пример:
SELECT snum, sname, city , CONCAT(comm * 100, "%") AS "persent" FROM salespeople
Результат:
snum | sname | city | persent |
---|---|---|---|
1001 | Peel | London | 12.000% |
1002 | Serres | San Jose | 13.000% |
1003 | Axelrod | New York | 10.000% |
1004 | Motika | London | 11.000% |
1007 | Rifkin | Barcelona | 15.000% |
В данном запросе, функция CONCAT принимает 2 аргумента, это comm * 100 и знак процента ("%"). После этого с помощью AS мы именуем столбец.
Важно знать, что использование функций ухудшает быстродействие. Это не единственный минус, но очень важный. Поэтому если можно обойтись стандартным кодом SQL, лучше не использовать функции. О них стоит вспоминать только в крайних случаях.
Исключение избыточных данных
Часто бывает необходимым исключить повторяющиеся значения из результатов запроса. Для этого используется ключевое слово DISTINCT. Противоположный эффект дает применение слова ALL, которое используется по умолчанию (т.е. его не нужно указывать).
5. Необходимо вывести города (city), где есть продавцы
Запрос без исключений:
SELECT city FROM salespeople
Результат:
Повторяющиеся значение London исключены из результата, что и требовалось.
Сортировка результата по значениям столбцом
Оператор SELECT выводит данные в произвольной последовательности. Для сортировки результата по определенному столбцу, в SQL используется оператор ORDER BY (т.е. упорядочить по….). Этот оператор позволяет изменить порядок вывода данных. ORDER BY упорядочивает результат запроса в соответствии со значениями одного или нескольких столбцов, выбранных в предложении SELECT. При этом для каждого столбца можно задать сортировку по возрастанию – ascending (ASC) (этот параметр используется по умолчанию) или по убыванию – descending (DESC).
Отсортируем результат по столбцу sname. После оператора ORDER BY указываем по какому столбцу сортировать, затем необходимо указать способ сортировки
Пример – сортировка по возрастанию:
SELECT * FROM Salespeople ORDER BY sname ASC
Результат:
Пример – сортировка по нескольким столбца:
SELECT snum, sname, city FROM Salespeople ORDER BY sname DESC, city DESC Результат:
snum | sname | city |
---|---|---|
1002 | Serres | San Jose |
1007 | Rifkin | Barcelona |
1001 | Peel | London |
1004 | Motika | London |
1003 | Axelrod | New York |
Несколько важных замечаний:
- столбец, по которому происходит сортировка, обязательно должен быть указан в SELECT (можно использовать *)
- оператор ORDER BY всегда пишется в конце запроса
Запросы написаны без экранирующих кавычек, так как у MySQL , MS SQL и PostGree они разные.
SQL запрос: получение указанных (нужных) полей из таблицы
SELECT id, country_title, count_people FROM table_nameПолучаем список записей: ВСЕ страны и их население. Название нужных полей указываются через запятую.
SELECT * FROM table_name
* обозначает все поля. То есть, будут показы АБСОЛЮТНО ВСЕ поля данных.
SQL запрос: вывод записей из таблицы исключая дубликаты
SELECT DISTINCT country_title FROM table_nameПолучаем список записей: страны, где находятся наши пользователи. Пользователей может быть много из одной страны. В этом случае это ваш запрос.
SQL запрос: вывод записей из таблицы по заданному условию
SELECT id, country_title, city_title FROM table_name WHERE count_people>100000000Получаем список записей: страны, где количество людей больше 100 000 000.
SQL запрос: вывод записей из таблицы с упорядочиванием
SELECT id, city_title FROM table_name ORDER BY city_titleПолучаем список записей: города в алфавитном порядке. В начале А, в конце Я.
SELECT id, city_title FROM table_name ORDER BY city_title DESC
Получаем список записей: города в обратном (DESC ) порядке. В начале Я, в конце А.
SQL запрос: подсчет количества записей
SELECT COUNT(*) FROM table_nameПолучаем число (количество) записей в таблице. В данном случае НЕТ списка записей.
SQL запрос: вывод нужного диапазона записей
SELECT * FROM table_name LIMIT 2, 3Получаем 2 (вторую) и 3 (третью) запись из таблицы. Запрос полезен при создании навигации на WEB страницах.
SQL запросы с условиями
Вывод записей из таблицы по заданному условию с использованием логических операторов.
SQL запрос: конструкция AND (И)
SELECT id, city_title FROM table_name WHERE country="Россия" AND oil=1Получаем список записей: города из России И имеют доступ к нефти. Когда используется оператор AND , то должны совпадать оба условия.
SQL запрос: конструкция OR (ИЛИ)
SELECT id, city_title FROM table_name WHERE country="Россия" OR country="США"Получаем список записей: все города из России ИЛИ США. Когда используется оператор OR , то должно совпадать ХОТЯ БЫ одно условие.
SQL запрос: конструкция AND NOT (И НЕ)
SELECT id, user_login FROM table_name WHERE country="Россия" AND NOT count_comments<7Получаем список записей: все пользователи из России И сделавших НЕ МЕНЬШЕ 7 комментариев.
SQL запрос: конструкция IN (В)
SELECT id, user_login FROM table_name WHERE country IN ("Россия", "Болгария", "Китай")Получаем список записей: все пользователи, которые проживают в (IN ) (России, или Болгарии, или Китая)
SQL запрос: конструкция NOT IN (НЕ В)
SELECT id, user_login FROM table_name WHERE country NOT IN ("Россия","Китай")Получаем список записей: все пользователи, которые проживают не в (NOT IN ) (России или Китае).
SQL запрос: конструкция IS NULL (пустые или НЕ пустые значения)
SELECT id, user_login FROM table_name WHERE status IS NULLПолучаем список записей: все пользователи, где status не определен. NULL это отдельная тема и поэтому она проверяется отдельно.
SELECT id, user_login FROM table_name WHERE state IS NOT NULL
Получаем список записей: все пользователи, где status определен (НЕ НОЛЬ).
SQL запрос: конструкция LIKE
SELECT id, user_login FROM table_name WHERE surname LIKE "Иван%"Получаем список записей: пользователи, у которых фамилия начинается с комбинации «Иван». Знак % означает ЛЮБОЕ количество ЛЮБЫХ символов. Чтобы найти знак % требуется использовать экранирование «Иван\%».
SQL запрос: конструкция BETWEEN
SELECT id, user_login FROM table_name WHERE salary BETWEEN 25000 AND 50000Получаем список записей: пользователи, которые получает зарплату от 25000 до 50000 включительно.
Логических операторов ОЧЕНЬ много, поэтому детально изучите документацию по SQL серверу.
Сложные SQL запросы
SQL запрос: объединение нескольких запросов
(SELECT id, user_login FROM table_name1) UNION (SELECT id, user_login FROM table_name2)Получаем список записей: пользователи, которые зарегистрированы в системе, а также те пользователи, которые зарегистрированы на форуме отдельно. Оператором UNION можно объединить несколько запросов. UNION действует как SELECT DISTINCT, то есть отбрасывает повторяющиеся значения. Чтобы получить абсолютно все записи, нужно использовать оператор UNION ALL.
SQL запрос: подсчеты значений поля MAX, MIN, SUM, AVG, COUNT
Вывод одного, максимального значения счетчика в таблице:
SELECT MAX(counter) FROM table_nameВывод одного, минимальный значения счетчика в таблице:
SELECT MIN(counter) FROM table_nameВывод суммы всех значений счетчиков в таблице:
SELECT SUM(counter) FROM table_nameВывод среднего значения счетчика в таблице:
SELECT AVG(counter) FROM table_nameВывод количества счетчиков в таблице:
SELECT COUNT(counter) FROM table_nameВывод количества счетчиков в цехе №1, в таблице:
SELECT COUNT(counter) FROM table_name WHERE office="Цех №1"Это самые популярные команды. Рекомендуется, где это возможно, использовать для подсчета именно SQL запросы такого рода, так как ни одна среда программирования не сравнится в скорости обработки данных, чем сам SQL сервер при обработке своих же данных.
SQL запрос: группировка записей
SELECT continent, SUM(country_area) FROM country GROUP BY continentПолучаем список записей: с названием континента и с суммой площадей всех их стран. То есть, если есть справочник стран, где у каждой страны записана ее площадь, то с помощью конструкции GROUP BY можно узнать размер каждого континента (на основе группировки по континентам).
SQL запрос: использование нескольких таблиц через алиас (alias)
SELECT o.order_no, o.amount_paid, c.company FROM orders AS o, customer AS с WHERE o.custno=c.custno AND c.city="Тюмень"Получаем список записей: заказы от покупателей, которые проживают только в Тюмени.
На самом деле, при правильном запроектированной базе данных данного вида запрос является самым частым, поэтому в MySQL был введен специальный оператор, который работает в разы быстрее, чем выше написанный код.
SELECT o.order_no, o.amount_paid, z.company FROM orders AS o LEFT JOIN customer AS z ON (z.custno=o.custno)
Вложенные подзапросы
SELECT * FROM table_name WHERE salary=(SELECT MAX(salary) FROM employee)Получаем одну запись: информацию о пользователе с максимальным окладом.
Внимание! Вложенные подзапросы являются одним из самых узких мест в SQL серверах. Совместно со своей гибкостью и мощностью, они также существенно увеличивают нагрузку на сервер. Что приводит к катастрофическому замедлению работы других пользователей. Очень часты случаи рекурсивных вызовов при вложенных запросах. Поэтому настоятельно рекомендую НЕ использовать вложенные запросы, а разбивать их на более мелкие. Либо использовать вышеописанную комбинацию LEFT JOIN. Помимо этого данного вида запросы являются повышенным очагом нарушения безопасности. Если решили использовать вложенные подзапросы, то проектировать их нужно очень внимательно и первоначальные запуски сделать на копиях баз (тестовые базы).
SQL запросы изменяющие данные
SQL запрос: INSERT
Инструкция INSERT позволяют вставлять записи в таблицу. Простыми словами, создать строчку с данными в таблице.
Вариант №1. Часто используется инструкция:
INSERT INTO table_name (id, user_login) VALUES (1, "ivanov"), (2, "petrov")В таблицу «table_name » будет вставлено 2 (два) пользователя сразу.
Вариант №2. Удобнее использовать стиль:
INSERT table_name SET id=1, user_login="ivanov"; INSERT table_name SET id=2, user_login="petrov";В этом есть свои преимущества и недостатки.
Основные недостатки:
- Множество мелких SQL запросов выполняются чуть медленнее, чем один большой SQL запрос, но при этом другие запросы будут стоять в очереди на обслуживание. То есть, если большой SQL запрос будет выполняться 30 минут, то в все это время остальные запросы будут курить бамбук и ждать своей очереди.
- Запрос получается массивнее, чем предыдущий вариант.
Основные преимущества:
- Во время мелких SQL запросов, другие SQL запросы не блокируются.
- Удобство в чтении.
- Гибкость. В этом варианте, можно не соблюдать структуру, а добавлять только необходимые данные.
- При формировании подобным образом архивов, можно легко скопировать одну строчку и запустить ее через командную строку (консоль), тем самым не восстанавливая АРХИВ целиком.
- Стиль записи схож с инструкцией UPDATE, что легче запоминается.
SQL запрос: UPDATE
UPDATE table_name SET user_login="ivanov", user_surname="Иванов" WHERE id=1В таблице «table_name » в записи с номером id=1, будет изменены значения полей user_login и user_surname на указанные значения.
SQL запрос: DELETE
DELETE FROM table_name WHERE id=3В таблице table_name будет удалена запись с id номером 3.
- Все названия полей рекомендуются писать маленькими буквами и если надо, разделять их через принудительный пробел «_» для совместимости с разными языками программирования, таких как Delphi, Perl, Python и Ruby.
- SQL команды писать БОЛЬШИМИ буквами для удобочитаемости. Помните всегда, что после вас могут читать код и другие люди, а скорее всего вы сами через N количество времени.
- Называть поля с начала существительное, а потом действие. Например: city_status, user_login, user_name.
- Стараться избегать слов резервных в разных языках которые могут вызывать проблемы в языках SQL, PHP или Perl, типа (name, count, link). Например: link можно использовать в MS SQL, но в MySQL зарезервировано.
Данный материал является короткой справкой для повседневной работы и не претендует на супер мега авторитетный источник, коим является первоисточник SQL запросов той или иной базы данных.
Любая таблица имеет своё логическое начало и свой логический конец. Так же любая таблица состоит из данных, которые за частую, а в случае с базами данных в большей степени, расположены в разброс. Как отмечалось в первой записи касательно SQL и баз данных, данные могут вноситься регулярно, на протяжении всего жизненного цикла баз данных. За это время может быть внесён не один десяток данных. В SQL, как в прочем и во всех компьютерных программах, можно упорядочивать данные. Делается это по средствам команды ORDER BY . Для данной команды существуют два аргумента
- ASC задаёт порядок по возрастанию (от меньшего к большему)
- DESC - по убыванию (от большего к меньшему)
Попробуем упорядочить таблицу должников по фамилии - столбец Sname - по убыванию
Debtors
Num | Month | Year | Sname | City | Address | Penalty | Debt |
0001 | Июль | 2012 | Иванов | Ставрополь | Ставропольская, 1 | 4891.00 | 50000 |
0002 | Декабрь | 2019 | Кононов | Татарка | Загородная, 254 | 19565.00 | 684068 |
0003 | Май | 2013 | Ямшин | Михайловск | Сельская, 48 | 9868.00 | 165840 |
0004 | Август | 2012 | Прени | Ставрополь | Центральная, 16 | 4659.00 | 46580 |
... | ... | ... | ... | ... | ... | ... | ... |
9564 | Март | 2015 | Улиева | Дёмино | Международная, 156 | 6846.00 | 435089 |
9565 | Октябрь | 2012 | Павлова | Ставрополь | Вокзальная, 37 | 685.00 | 68059 |
9566 | Январь | 2012 | Урюпа | Михайловск | Фонтанная, 19 | 1235.00 | 51238 |
9567 | Ноябрь | 2017 | Вальетов | Татарка | Выездная, 65 | 13698.00 | 789654 |
Выполняем запрос
SELECT
*
FROM
Debtors
ORDER BY
Sname DESC
;
Debtors
Num | Month | Year | Sname | City | Address | Penalty | Debt |
0003 | Май | 2013 | Ямшин | Михайловск | Сельская, 48 | 9868.00 | 165840 |
9566 | Январь | 2012 | Урюпа | Михайловск | Фонтанная, 19 | 1235.00 | 51238 |
9564 | Март | 2015 | Улиева | Дёмино | Международная, 156 | 6846.00 | 435089 |
0004 | Август | 2012 | Прени | Ставрополь | Центральная, 16 | 4659.00 | 46580 |
9565 | Октябрь | 2012 | Павлова | Ставрополь | Вокзальная, 37 | 685.00 | 68059 |
0002 | Декабрь | 2019 | Кононов | Татарка | Загородная, 254 | 19565.00 | 684068 |
0001 | Июль | 2012 | Иванов | Ставрополь | Ставропольская, 1 | 4891.00 | 50000 |
9567 | Ноябрь | 2017 | Вальетов | Татарка | Выездная, 65 | 13698.00 | 789654 |
Так же упорядочивание может выполняться и в группируемых данных, по средством команды . Но в таком случае, команда ORDER BY в запросе должна стоять последней, то есть
SELECT
*
FROM
Debtors
GROUP BY
Sname
ORDER BY
Sname DESC
;
Если же в упорядочиваемых полях имеются ячейки с пустыми значениями (NULL), то, в зависимости от программ, работающих с БД, такие ячейки могут располагаться либо в конце списка, либо в начале.
Существует ещё одна хитрость по выполнению упорядочивания данных. Рассмотрим запрос
SELECT
Num, Year, Sname
FROM
Debtors
ORDER BY
2 DESC
;
Здесь под двойкой подразумевается порядковый номер столбца из строки "SELECT Num, Year, Sname" и именно по этому столбцу будет выполняться ранжирование по убыванию в итоге
Debtors
Как видно, значения упорядочились по столбцу Year, где в начале списка более поздняя дата.
Итак, упорядочивание в SQL имеет те же принципы ранжирования, что и в любых компьютерных программах. Всё зависит от администратора БД и его потребностей в той или иной информации, которую он хочет получить.
На уроке будет рассмотрен язык запросов: оператор SELECT sql — на выборку данных
SQL-запрос Select предназначен для обычной выборки из базы данных. Т.е. если нам необходимо просто получить данные, не делая с ними никакой обработки и не внося изменений в базу данных, то можно смело использовать данный запмагарос.
Синтаксис оператора SELECT
SELECT * FROM имя_таблицы;
Это самый простой вариант работы с оператором, когда мы выбираем все записи из таблицы БД.
Символ * обозначает выборку всех записей из таблицы . При этом столбцы и строки результирующего набора не упорядочены.
Рассмотрим примеры sql запросов select:
Пример :
если вы создали локальную базу данных и заполнили таблицы, как в рассмотренном ранее (или же воспользовались сервисом sqlFiddle), то выполним следующий пример.
Необходимо выбрать все записи из таблицы teachers
SELECT * FROM имя_таблицы LIMIT 2,3;
В примере происходит выборка 3 записей из таблицы, начиная со 2 записи.
Этот запрос особо необходим при создании блока страниц навигации.
Чтобы упорядочить поля результирующего набора , их следует перечислить через запятую в нужном порядке после слова SELECT:
SELECT name, zarplata, premia FROM teachers ORDER BY name;
Выберет значения полей name , zarplata , premia и отсортирует по полю name (по алфавиту)
Пример: БД «Компьютерный магазин». Выбрать данные о скорости и памяти компьютеров. Требуется упорядочить результирующий набор по скорости процессора в порядке возрастания.
SELECT `Скорость`,`Память` FROM `pc` ORDER BY 1 ASC
Результат:
Сортировку можно выполнять по двум полям:
SELECT name, zarplata, premia FROM teachers ORDER BY name DESC;
Выберет значения полей name , zarplata , premia и отсортирует по полю name по убыванию
Удаление повторяющихся значений в SQL
В случае когда необходимо получить уникальные строки, можно использовать ключевое слово DISTINCT .
DISTINCT (в переводе с английского ОТЛИЧИЕ) - аргумент, который устраняет двойные значения :
Пример БД «Институт»: требуется узнать возможные варианты размера премий. Если не использовать Distinct , в результате будет выдаваться два одинаковых значения. Удалить в sql повторяющиеся значения можно при введении Distinct — в результате дублирующиеся значения не повторяются.
- AND ,
- или NOT
SELECT Скорость, Память FROM PC;
Результат:
В таблице PC первичным ключом является поле code . Поскольку это поле отсутствует в запросе, в приведенном выше результирующем наборе имеются дубликаты строк.
Когда требуется получить уникальные строки (например, нас интересуют только различные комбинации скорости процессора и объема памяти, а не характеристики всех имеющихся компьютеров), то нужно использовать Distinct:
SELECT DISTINCT Скорость, Память FROM PC; |
SELECT DISTINCT Скорость, Память FROM PC;
Результат:
Задание sql select 1_1. БД «Институт» Выполните запрос на выборку id и name из таблицы учителей. Отсортируйте фамилии учителей по убыванию
Язык sql: where условие
Условие выполняется предложением
WHERE
которое записывается после предложения FROM .При этом в результирующий набор попадут только те записи, для которых значение предиката равно TRUE (истина).
Пример БД «Институт»: Выводить данные преподавателя из таблицы teachers , фамилия которого Иванов
Несколько условий в SQL
Предикаты (условия) могут состоять как из одного выражения, так и из любой комбинации выражений, построенных с помощью булевых операторов:
Пример БД «Институт»: вывести код преподавателя, зарплата которого составляет 10000 , а премия 500
Реляционные операторы, встречающиеся в условиях:
= Равный
> Больше чем
>= Больше чем или равно
Не равно
Between в SQL (между)
Предикат BETWEEN проверяет, попадают ли значения проверяемого выражения в диапазон, задаваемый пограничными выражениями, соединяемыми служебным словом AND .
Синтаксис:
<Проверяемое выражение> BETWEEN <Начальное выражение> AND <Конечное выражение>
Пример БД "Институт": Вывести фамилию и зарплату преподавателя, зарплата которого между 5000 и 10000.
Пример БД "Институт": Вывести фамилию и зарплату преподавателя, зарплата которого не находится в диапазоне от 5000 до 10000.
Предикат IN
Предикат IN определяет, будет ли значение проверяемого выражения обнаружено в наборе значений, который явно определен.
Синтаксис:
< Проверяемое выражение> [ NOT ] IN (< набор значений> ) <Проверяемое выражение> IN (<набор значений>)
Пример БД "Институт": вывести имена преподавателей, зарплата которых составляет 5000 , 10000 или 11000
Пример БД "Институт": вывести имена преподавателей, зарплата которых не находится среди значений: 5000 , 10000 или 11000
Задание sql select 1_3. БД "Институт" Вывести фамилию, зарплату и премию учителей, премия которых от 2000 до 5000 рублей.
Оператор языка SQL SELECT предназначен для запросов на выборку данных из базы данных. Он может быть использован как без условий (выбор всех строк во всех столбцах или всех строк в определённых столбцах), так и с многочисленными условиями (выбор определённых строк), которые заданы в секции WHERE. Ознакомимся со средствами SQL, которыми можно задавать эти условия на выборку данных, а также узнаем, как использовать оператор SELECT в подзапросах.
SELECT для выбора столбцов таблицы
Запрос с оператором SELECT для выбора всех столбцов таблицы имеет следующий синтаксис:
SELECT * FROM ИМЯ_ТАБЛИЦЫ
То есть для выбора всех столбцов таблицы после слова SELECT нужно ставить звёздочку.
Пример 1. Есть база данных фирмы - Company. В ней есть таблица Org (Структура фирмы) и Staff (Сотрудники). Требуется выбрать из таблиц все столбцы. Соответствующий запрос для выбора всех столбцов из таблицы Org выглядит следующим образом:
SELECT * FROM ORG
Этот запрос вернёт следующее (для увеличения картинки щёлкнуть по ней левой кнопкой мыши):
Запрос для выбора всех столбцов из таблицы Staff выглядит следующим образом:
SELECT * FROM STAFF
Этот запрос вернёт следующее:
Для выбора определённых столбцов таблицы нам потребуется вместо звёздочки перечислить через запятую названия всех столбцов, которые требуется выбрать:
SELECT ВЫБИРАЕМЫЕ_СТОЛБЦЫ FROM ИМЯ_ТАБЛИЦЫ
Пример 2. Пусть требуется из таблицы Org выбрать столбцы Depnumb и Deptname, в которых содержатся данные соответственно о номерах отделов фирмы и об их названиях. Запрос для получения такой выборки будет следующим:
SELECT DEPNUMB, DEPTNAME FROM ORG
А из таблицы Staff нужно выбрать столбцы DEPT, NAME, JOB, в которых содержатся соответственно данные о номере отдела, в котором трудится сотрудник, его имени и должности:
SELECT DEPT, NAME, JOB FROM STAFF
Для выбора определённых строк таблицы вместе с оператором SELECT уже потребуется ключевое слово WHERE, указывающее на некоторое значение или несколько значений, содержащиеся в интересующих нас строках. Наиболее простые условия задаются при помощи операторов сравнения и равенства (, =), а также ключевого слова IS. Условий может быть несколько, тогда они перечисляются с использованием ключевого слова AND. Запросы для выбора строк имеют следующий синтаксис:
Пример 4. В предыдущем примере мы выбирали строки из таблицы только по значению одного столбца - DEPT. Пусть теперь нужно выбрать данные о сотрудниках, которые работают в 38-м отделе и должность которых - служащий (Clerk). Для этого в секции WHERE соответствующие значения нужно перечислить с использованием слова AND:
Пример 5. Пусть нужно выбрать из таблицы Staff идентификаторы и имена тех сотрудников, размер комиссии которых - неопределённый. Для этого в секции WHERE перед указанием значения столбца COMM - NULL нужно ставить не знак равенства, а слово IS:
Этот запрос вернёт следующие данные:
Для указания значений в строках, которые требуется выбрать, используются и знаки сравнения.
Использование SELECT и предикатов IN, OR, BETWEEN, LIKE
Предикаты - слова IN, OR, BETWEEN, LIKE в секции WHERE - также позволяют выбрать определённые диапазоны значений (IN, OR, BETWEEN) или значения в строках (LIKE), которые требуется выбрать из таблицы. Запросы с предикатами IN, OR, BETWEEN имеют следующий синтаксис:
Запросы с предикатом LIKE имеют следующий синтаксис:
Пример 7. Пусть требуется выбрать из таблицы Staff имена, должности и число отработанных лет сотрудников, работающих в отделах с номерами 20 или 84. Это можно сделать следующим запросом:
Результат выполнения запроса:
Пример 8. Пусть теперь требуется выбрать из таблицы Staff те же данные, что и в предыдущем примере. Запрос со словом OR аналогичен запросу со словом IN и перечислением интересующих значений в скобках. Запрос будет следующим:
Пример 9. Выберем из той же таблицы имена, должности и число отработанных лет сотрудников, зарплата которых между 15000 и 17000 включительно:
Результат выполнения запроса:
Предикат LIKE используется для выборки тех строк, в значениях которых встречаются символы, указанные после предиката между апострофами (").
Пример 10. Выберем из той же таблицы имена, должности и число отработанных лет сотрудников, имена которых начинаются с буквы S и состоят из 7 символов:
Символ подчёркивания (_) означает любой символ. Результат выполнения запроса:
Пример 11. Выберем из той же таблицы имена, должности и число отработанных лет сотрудников, имена которых начинаются с буквы S и содержат любые другие буквы в любом количестве:
Символ процентов (%) означает любое количество символов. Результат выполнения запроса:
Значения, указанные с использованием предикатов IN, OR, BETWEEN, LIKE можно инвертировать при помощи слова NOT. Тогда запрашиваемые данные будут иметь противоположный смысл. Если мы используем NOT IN (20, 84), то будут выведены данные сотрудников, которые работают во всех отделах, кроме имеющих номера 20 и 84. С использованием NOT BETWEEN 15000 AND 17000 можно получить данные сотрудников, зарплата которых не входит в интервал от 15000 до 17000. Запрос с NOT LIKE выведет данные сотрудников, чьи имена не начинаются или не содержат символов, указанных с NOT LIKE.
Написать SQL запросы с SELECT и предикатами IN, NOT IN, BETWEEN самостоятельно, а затем посмотреть решения
Есть база данных "Театр". Таблица Play содержит данные о постановках. Таблица Team - о ролях актёров. Таблица Actor - об актёрах. Таблица Director - о режиссёрах. Поля таблиц, первичные и внешние ключи можно увидеть на рисунке ниже (для увеличения нажать левой кнопкой мыши).
Пример 12. Вывести список актёров, которые не разу не были утверждены на главную роль. В таблице team данные о главных ролях содержатся в столбце mainteam. Если роль - главная, то в соответствующей строке отмечено "Y".
SELECT и ORDER BY - сортировка (упорядочение) строк
Разобранные до сих пор запросы SQL SELECT возвращали строки, которые могли быть расположены в любой последовательности. Однако часто требуется отсортировать строки по порядку номеров, алфавиту и другим признакам. Для этого служит ключевое словосочетание ORDER BY. Такие запросы имеют следующий синтаксис:
Пример 15. Пусть требуетя выбрать из таблицы Staff сотрудников, работающих в отделе с номером 84 и отсортировать (упорядочить) записи по числу отработанных лет в возрастающем порядке:
Слово ASC указывает, что порядок сортировки - возрастающий. Это слово не обязательно, так как возрастающий порядок сортировки применяется по умолчанию. Результат выполнения запроса:
Пример 16. Пусть требуетя выбрать те же данные, что и в предыдущем примере, но отсортировать (упорядочить) записи по числу отработанных лет в убывающем порядке:
Слово DESC указывает, что порядок сортировки - убывающий. Результат выполнения запроса:
SELECT и DISTINCT - удаление дубликатов строк
Когда для значений строк таблицы не задано условие уникальности, в результатах запроса могут встретиться одинаковые строки. Часто требуется вывести лишь уникальные строки. Это делается при помощи выражения DISTINCT после оператора SELECT.
Пример 17. Пусть требуетcя узнать, какие существуют отделы и какие должности среди отделов, номера которых меньше 30. Это можно сделать при помощи следующего запроса:
Результат выполнения запроса:
Оператор SELECT в подзапросах SQL
До сих пор мы разбирали конструкции SQL с оператором SELECT, в которых условия, по котором выбираются данные, и сами выбираемые данные содержатся в одной и той же таблице базы данных. На практике часто бывает, что данные, которые надо выбрать, содержатся в одной таблице, а условия - в другой. Здесь на помощь приходят подзапросы: значения условия отбора возвращаются из другого запроса (вложенного запроса), начинающегося также с SELECT. Запросы с подзапросами могут выдавать как одну, так и несколько строк.
Пример 18. Все те же таблицы ORG и STAFF. Пусть требуетcя узнать, в каком подразделении работает сотрудник с идентификационным номером 280, и где это подразделение расположено. Но информация о подразделениях хранится в таблице ORG, а информация о сотрудниках - в таблице STAFF. Это можно сделать при помощи следующего запроса с подзапросом, в котором внешний SELECT обращается к таблице ORG, а внутренний SELECT - к таблице STAFF:
Результат выполнения запроса:
Пример 19. Пусть теперь требуетcя узнать, в каких подразделениях (без дублирования) работают сотрудники с заработной платой менее 13000. Для этого в секции WHERE внешнего SELECT (запрос к таблице ORG) задаётся условие, принимающее диапазон значений (IN), а внутренний SELECT (к таблице STAFF) как раз возвращает требуемый диапазон значений:
Реляционные базы данных и язык SQL