Содержание

Что такое SQL. Назначение и основа | Info-Comp.ru

Всем привет! Сегодня я максимально просто, специально для начинающих, попытаюсь рассказать Вам о том, что такое SQL, и для чего он нужен. Из данного материала Вы также узнаете, что такое база данных и система управления базами данных, а также что такое диалект языка SQL, ведь вся статья будет построена на том, чтобы плавно подвести Вас к пониманию того, что же такое SQL.

Я думаю, Вы уже представляете себе, что SQL — это некий язык, связанный с какими-то там базами данных, однако для того, чтобы лучше понимать, что же такое SQL, необходимо понять, для чего нужен SQL, для чего нужен этот язык, т.е. его назначение.

Поэтому сначала я дам Вам немного вводной информации, из которой будет ясно назначение языка SQL, и для чего он вообще нужен.

Что такое база данных

И начну я с того, что под базой данных обычно принято понимать любой набор информации, которая хранится определенным образом, и ей можно воспользоваться. Но если говорить о каких-то автоматизированных базах данных, то здесь, конечно же, речь идет о так называемых реляционных базах данных.

Реляционная база данных – это упорядоченная информация, связанная между собой определёнными отношениями. Представлена она в виде таблиц, в которых и лежит вся эта информация. И это очень важно, так как теперь Вы должны представлять себе современную базу данных просто в виде таблиц (если говорить в контексте SQL), т.е. в общем смысле база данных – это набор таблиц. Безусловно, это сильно упрощенное определение, но оно дает некое практическое понимание базы данных.

Что такое SQL

За счет того, что информация в базе данных упорядочена, разделена на определённые сущности и представлена в виде таблиц, к ней легко обратиться и найти нужную нам информацию.

И тут возникает главный вопрос: а как к ней обратиться и получить необходимую нам информацию?

Для этого должен быть специальный инструмент, и здесь к нам на помощь как раз и приходит SQL, который является тем инструментом, с помощью которого происходит манипулирование данными (создание, извлечение, удаление и т.д.) в базе данных.

SQL (Structured Query Language) —  язык структурированных запросов, с помощью него пишутся специальные запросы (так называемые SQL инструкции) к базе данных с целью получения данных из базы данных или для манипулирования этими данными.

Также обязательно стоит отметить и то, что база данных, и в частности реляционная модель, основана на теории множеств, которая подразумевает объединение разных объектов в одно целое, под одним целым в базе данных как раз и имеется в виду таблица. Это важно, так как язык SQL работает именно со множеством, с набором данных, т.е. с таблицами.

Полезные материалы по теме:

Что такое СУБД

У Вас может возникнуть вопрос, если база данных это некая информация, которая хранится в таблицах, то как она выглядит физически? Как на нее посмотреть в целом?

Если очень коротко, то это просто файл, созданный в специальном формате, именно так и выглядит база данных (

в большинстве случаев БД включает несколько файлов, но сейчас на этом уровне это не так важно).

Идем дальше, если база данных это файл в специальном формате, то как его создать или открыть? И тут возникает сложность, ведь просто так, без каких-либо инструментов создать такой файл, т.е. реляционную базу данных, нельзя, для этого нужен специальный инструмент, который мог бы создавать и управлять базой данных, иными словами, работать с этими файлами.

Таким инструментом как раз и выступает СУБД – это система управления базами данных, сокращенно СУБД.

Какие СУБД бывают

На самом деле, существует достаточно много различных СУБД, некоторые из них платные и стоят немалых денег, если говорить о полнофункциональных версиях, но даже у самых, так скажем, «крутых» есть бесплатные редакции, которые, кстати, отлично подходят для обучения.

Среди всех по своим возможностям и популярности можно выделить следующие системы:

  • Microsoft SQL Server – это система управления базами данных от компании Microsoft. Она очень популярна в корпоративном секторе, особенно в крупных компаниях. И это не просто СУБД – это целый комплекс приложений, позволяющий хранить и модифицировать данные, анализировать их, осуществлять безопасность этих данных и многое другое;
  • Oracle Database – это система управления базами данных от компании Oracle. Это также очень популярная СУБД, и также среди крупных компаний. По своим возможностям и функциональности Oracle Database и Microsoft SQL Server сопоставимы, поэтому являются серьезными конкурентами друг другу, и стоимость их полнофункциональных версий очень высока;
  • MySQL – это система управления базами данных также от компании Oracle, но только она распространяется бесплатно. MySQL получила очень широкую популярность в интернет сегменте, т.е. именно на MySQL работают чуть ли не все сайты в интернете, иными словами, большинство сайтов в интернете используют эту СУБД как средство хранения данных;
  • PostgreSQL – эта система управления базами данных также является бесплатной, и она очень популярна и функциональна.

Полезные материалы по теме:

Диалекты языка SQL (расширения SQL)

Язык SQL – это стандарт, он реализован во всех реляционных базах данных, но у каждой СУБД есть расширение этого стандарта, есть собственный язык работы с данными, его обычно называют диалектом SQL, который, конечно же, основан на SQL, но предоставляет больше возможностей для полноценного программирования, кроме того, такой внутренний язык дает возможность получать системную информацию и упрощать SQL запросы.

Вот некоторые диалекты языка SQL:

  • Transact-SQL (сокращенно T-SQL) – используется в Microsoft SQL Server;
  • PL/SQL (Procedural Language / Structured Query Language) – используется в Oracle Database;
  • PL/pgSQL (Procedural Language/PostGres Structured Query Language) – используется в PostgreSQL.

Таким образом, от СУБД зависит, на каком расширении Вы будете писать SQL инструкции. Если говорить о простых SQL запросах, например,

  
  SELECT ProductId, ProductName
  FROM Goods


то, безусловно, во всех СУБД такие запросы работать будут, ведь SQL — это стандарт.

Примечание! Это простой SQL запрос на выборку данных из одной таблицы, выводятся два столбца.

Однако если Вы собираетесь программировать, использовать все внутренние возможности СУБД (

разрабатывать процедуры, использовать встроенные функции, получать системную информацию и т.д.), то Вам необходимо изучать конкретный диалект SQL и практиковаться соответственно в той СУБД, в которой используется этот диалект. Это важно, ведь синтаксис многих конструкций различается так же, как различаются возможности и многое другое. И если, допустим, Вы запустите SQL инструкцию, в которой использованы возможности определенного расширения SQL, на другой СУБД, то такая инструкция, конечно же, не выполнится.

Например, лично я специализируюсь на языке T-SQL, и соответственно, работаю с Microsoft SQL Server, вот уже более 8 лет!

Хотя, конечно же, с другими СУБД я также работал, одно время я сопровождал два приложения, одно из которых работало с PostgreSQL, ну а второе, наверное, уже понятно, с Microsoft SQL Server.

С MySQL я работал, как, наверное, и многие, в рамках сопровождения сайтов и сервисов. Ну а с Oracle Database мне приходилось работать в рамках других проектов.

Весь свой накопленный опыт в части языка T-SQL я сгруппировал в одном месте и оформил в виде книг, поэтому, если у Вас есть желание изучить язык Transact-SQL (T-SQL), рекомендую почитать мои книги:

  • Путь программиста T-SQL – самоучитель по языку Transact-SQL для начинающих. В ней я подробно рассказываю обо всех конструкциях языка и последовательно перехожу от простого к сложному. Подходит для комплексного изучения языка T-SQL;
  • Стиль программирования на T-SQL – основы правильного написания кода. Книга, направленная на повышение качества T-SQL кода (для тех, кто уже знаком с языком T-SQL, т.е. знает хотя бы основы).

Надеюсь, теперь Вы понимаете, что такое SQL, и для чего он нужен, в следующих материалах я расскажу, как создавать SQL запросы, расскажу какие инструменты для этого необходимо использовать и для каких СУБД, так как у каждой СУБД есть свои инструменты, поэтому следите за выходом новых статей в моих группах в социальных сетях: ВКонтакте, Facebook, Одноклассники, Twitter и Tumblr. Подписывайтесь, и Вы не пропустите выход нового материала!

А на сегодня это все, удачи Вам, пока!

info-comp.ru

10 простых шагов к полному пониманию SQL (операторы SELECT)

SQL

Очень многие программисты смотрят на SQL, как на страшного зверя. SQL — один из немногих декларативных языков, и его поведение в корне отличается от того, как работают императивные, объектно-ориентированные и даже функциональные языки программирования. Хотя многие рассматривают SQL в некоторой степени функциональным.

Я, как инструктор SQL (советую посетить наш великолепный тренинг!) пишу на нем каждый день, включая работу над библиотекой jOOQ с открытым исходным кодом.

 

Поэтому я чувствую себя обязанным донести прелести SQL до умов тех, кто все еще испытывает трудности с его пониманием. Этот урок посвящен тем, кто:

  • Уже работает с SQL, но не до конца его понимает
  • Неплохо знает SQL, но никогда серьезно не задумывался над его структурой
  • Хочет обучать SQL других

В этом руководстве мы сосредоточимся только на операторах SELECT. Другие DML-операторы будут подробно рассмотрены в следующий раз.


Примечание. Этот урок раньше публиковался только на
Tech.Pro (оригинальная версия находится здесь). К сожалению, материал Tech.Pro стал недоступным. С разрешения Tech.Pro мы снова публикуем его контент в блоге jOOQ.

И вот…

  1. SQL является декларативным

SELECT first_name, last_name 
FROM employees 
WHERE salary > 100000

Все понятно. И вас не волнует, откуда эти записи о сотруднике (employee) берутся. Вам лишь нужны те, у которых достойная зарплата (salary).

  • Что мы из этого узнаем?

Если все так просто, в чем же проблема? Проблема в том, что большинство из нас интуитивно мыслит рамками императивного программирования. Вроде: «машина, сделай это, затем то, но сначала проверь то и се.» А значит, нужно хранить временные результаты в переменных, составлять циклы, вызывать функции и т. д. и т. п.

Забудьте обо всем этом. Думайте о том, как объявлять вещи. Не о том, как сказать машине, вычислить что-либо.

2. Код SQL не является упорядоченным

Обычно путаница происходит из-за того, что элементы кода SQL не расположены в том порядке, в каком они выполняются. Лексический порядок выглядит так:

  • SELECT [ DISTINCT ]
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • UNION
  • ORDER BY

Для простоты перечислены не все предложения SQL. Этот словесный порядок принципиально отличается от логического порядка (который в свою очередь может отличаться от порядка выполнения в зависимости от выбора оптимизатора):

  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • SELECT
  • DISTINCT
  • UNION
  • ORDER BY

Три пункта, которые следует отметить:

  1. Первое предложение здесь FROM, а не SELECT. Сначала происходит загрузка данных с диска в память, чтобы с ними можно было работать.
  2. SELECT выполняется после большинства других предложений. Главное, после FROM и GROUP BY. Это важно понимать, если думаете, что можете ссылаться на элементы, которые объявляете в предложении SELECT из предложения WHERE. Следующее невозможно:
SELECT A.x + A.y AS z
FROM A
WHERE z = 10 -- z здесь не доступна!

Есть два варианта повторно использовать z. Либо повторить выражение:

SELECT A.x + A.y AS z
FROM A
WHERE (A.x + A.y) = 10

… либо прибегнуть к производным таблицам, общим табличным выражениям или представлениям данных, чтобы избежать повторения кода. Смотрите примеры ниже.

3. UNION ставится перед ORDER BY в лексическом и логическом порядках. Многие думают, что каждый подзапрос UNION можно упорядочить, но по стандарту SQL и в большинстве диалектов SQL это не так. Хотя в некоторых диалектах позволяется упорядочивание подзапросов или производных таблиц, нет никакой гарантии, что такой порядок будет сохранен после выполнения операции UNION.

Обратите внимание, что не все базы данных реализуют вещи одинаковым образом. Правило номер 2, например, не применяется в точности, как описано выше, для MySQL, PostgreSQL, и SQLite.

Что мы из этого узнаем?

Чтобы избежать распространенных ошибок, всегда следует помнить о лексическом и логическом порядках предложений SQL. Если вы усвоили эти отличия, становится понятным, почему одни вещи работают, другие нет.

Конечно, неплохо, если бы язык был спроектирован таким образом, когда лексическая последовательность фактически отражает логический порядок, как это реализовано в Microsoft LINQ.

3. Вся суть SQL заключается в ссылках на таблицы

Из-за разницы между лексическим упорядочением и логическим упорядочением большинство новичков, вероятно, думают, что значения столбцов являются объектами первого класса в SQL. Но, нет. Наиболее важными являются ссылки на таблицы.

Стандарт SQL определяет предложение FROM следующим образом:

<from clause> ::= 
    FROM <table reference> 
        [ { <comma> <table reference> }... ]

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

FROM a, b

Указанная выше запись производит комбинированную ссылку на таблицу значений a и b. Если a имеет 3 колонки и b 5 колонок, тогда выходная таблица “output table” будет состоять из 8 (3 + 5) столбцов.

Записи, содержащиеся в этой комбинированной табличной ссылке являются перекрестным / декартовым произведением a x b. Иными словами, каждая запись a образует пару с записью b. Если a имеет 3 записи, а b 5 записей, описанная выше ссылка на таблицу производит 15 записей (3 x 5).

Этот вывод переводится в предложение GROUP BY (после фильтрации в предложении WHERE), где преобразуется в новый вывод. Разберемся с этим позже.

Если мы посмотрим на эти примеры в свете реляционной алгебры / теории множества, то таблица SQL — это отношение или набор кортежей. Каждое предложение SQL преобразует одно или несколько отношений, чтобы создать новые отношения.

Что мы из этого узнаем?

Всегда думайте категориями ссылок на таблицы, чтобы понять, как данные передаются в предложениях SQL.

4. Ссылки на таблицы SQL могут быть довольно функциональными

Ссылка на таблицу — мощная штука. Примером их силы является ключевое слово JOIN, которое в действительности не является выражением SELECT, а частью специальной ссылки на таблицу. Объединенная таблица, как определено в стандарте SQL (упрощенный):

<table reference> ::=
    <table name>
  | <derived table>
  | <joined table>

Вернемся к нашему примеру:

FROM a, b

a может по сути быть объединенной таблицей:

a1 JOIN a2 ON a1.id = a2.id

Развивая предыдущее выражение, получим:

FROM a1 JOIN a2 ON a1.id = a2.id, b

Хотя не рекомендуется объединять синтаксис, где приводится разделенный запятыми список ссылок на таблицы, с синтаксисом объединенных таблиц, но так можно делать. В результате, объединенная ссылка будет содержать величины a1+a2+b.

Производные таблицы еще мощнее, чем объединенные таблицы. Мы до этого еще дойдем.

Что мы из этого узнаем?

Всегда нужно думать категориями ссылок на таблицы. Это поможет не только понять, как данные переходят в предложениях SQL, (смотрите предыдущий раздел), но и как создаются сложные ссылки на таблицы.

И, что важно, понять, JOIN является ключевым словом для построения соединенных таблиц. А не частью оператора SELECT. Некоторые базы данных позволяют использование JOIN в операторах INSERT, UPDATE, DELETE

5. В SQL следует использовать таблицы JOIN, вместо разделенных запятыми

Ранее мы видели это предложение:

FROM a, b

Продвинутые разработчики SQL, вероятно, скажут, что не следует вообще использовать список с разделителями-запятыми, и всегда отображать таблицы JOIN. Это улучшит читаемость инструкции SQL, и тем самым предотвратить ошибки.

Одна очень распространенная ошибка заключается в том, чтобы где-то забыть предикат JOIN. Подумайте о следующем:

FROM a, b, c, d, e, f, g, h
WHERE a.a1 = b.bx
AND a.a2 = c.c1
AND d.d1 = b.bc
-- etc...

Синтаксис соединенных таблиц:

  • Безопаснее, так как предикаты join можно размещать вблизи соединенных таблиц, тем самым предотвращая ошибки.
  • Более выразительные, так как можно различать OUTER JOIN, INNER JOIN и т. д.

 

Что мы из этого узнаем?

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

6. Различные операции JOIN в SQL

Операции JOIN состоят, в основном, из следующих пяти видов:

  • EQUI JOIN
  • SEMI JOIN
  • ANTI JOIN
  • CROSS JOIN
  • DIVISION

Эти термины обычно используются в реляционной алгебре. SQL задействует другие термины для вышеуказанных понятий, если они вообще существуют. Давайте рассмотрим их поближе:

EQUI JOIN

Это наиболее распространенная операция JOIN. Содержит два подвида:

  • INNER JOIN (или просто JOIN)
  • OUTER JOIN (далее подразделяется на LEFT, RIGHT, FULL OUTER JOIN)

Разницу лучше объяснить на примере:

-- Ссылка на таблицу содержит авторов и их книги
-- Есть одна запись для каждой книги и ее автора.
-- Авторы без книг НЕ включены
author JOIN book ON author.id = book.author_id

-- Ссылка на таблицу содержит авторов и их книги
-- Есть одна запись для каждой книги и ее автора.
--... ИЛИ есть записи "empty" (пустые) для авторов без книг
-- ("empty" означает, что все столбцы книги равны NULL)
author LEFT OUTER JOIN book ON author.id = book.author_id

 

SEMI JOIN

Эта реляционная концепция в SQL может быть выражена двумя способами: С помощью предиката IN или с использованием предиката EXISTS. «Semi» на латыни означает «половина». Этот тип соединения используется для объединения только «половины» ссылки на таблицу. Что это значит? Рассмотрим вновь вышеуказанное объединение автора и книги. Представим, что нам не нужны комбинации автор — книга, а только авторы, у которых есть книги. Тогда можно написать:

-- Использование IN
FROM author
WHERE author.id IN (SELECT book.author_id FROM book)

-- Использование EXISTS
FROM author
WHERE EXISTS (SELECT 1 FROM book WHERE book.author_id = author.id)

Хотя нет общего правила, следует предпочесть IN или EXISTS, но можно сказать примерно так:

Поскольку INNER JOIN также выдают результаты авторов, у которых есть книги, многие начинающие подумают, что можно удалить дубликаты с помощью ключевого слова DISTINCT. Им кажется, что SEMI JOIN можно выразить следующим образом:

-- Найти только тех авторов, которые имеют книги
SELECT DISTINCT first_name, last_name
FROM author
JOIN book ON author.id = book.author_id

Так делать не рекомендуется по двум причинам:

  • Замедляется производительность, так как база данных только для того, чтобы удалить дубликаты, должна загрузить в память множество данных.
  • Такой способ решения не совсем правильный, хотя и приводит к верным результатам в этом примере. Но если вы соединяете больше ссылок на таблицы, удаление дубликатов превращается в реальную проблему.

Подробную информацию о злоупотреблении DISTINCT можно найти в этом посте.

ANTI JOIN

Эта реляционная концепция является полной противоположностью SEMI JOIN. Ее можно образовать, просто добавив ключевое слово NOT в предикатах IN или EXISTS. Пример, где мы выберем тех авторов, у которых нет книг:

-- Использование IN
FROM author
WHERE author.id NOT IN (SELECT book.author_id FROM book)

-- Использование EXISTS
FROM author
WHERE NOT EXISTS (SELECT 1 FROM book WHERE book.author_id = author.id)

Применяются те же правила в отношении производительности, читаемости и выразительности. Однако есть небольшой нюанс в отношении NULL при использовании NOT IN, но эта тема выходит за рамки нашего урока.

CROSS JOIN

Этот оператор создает перекрестное произведение двух соединенных ссылок на таблицу, комбинируя каждую запись первой ссылки с записью второй ссылки на таблицу. Мы уже видели раньше, что это может быть достигнуто посредством ссылок на таблицы с разделителями-запятыми в предложении FROM. В редких случаях, когда это действительно необходимо, в большинстве диалектов SQL перекрестное соединение CROSS JOIN можно написать явным образом:

-- Объединить каждого автора с книгой
author CROSS JOIN book

DIVISION

Реляционное деление — вот кто настоящий зверь. В кратце, если JOIN это умножение, division (деление) — противоположность операции JOIN. Реляционные деления очень трудно выразить в SQL. Поскольку этот урок для начинающих, деление мы не рассматриваем. Для самых храбрых информация находится здесь, здесь и здесь.

Что мы из этого узнаем?

Много чего. Давайте запихнем это в наши головы. В SQL повсюду ссылки на таблицы. Соединяемые таблицы представляют собой довольно сложные ссылки на таблицы. Но между реляционными выражениями и выражениями SQL есть разница. Не все операции реляционного соединения также являются формальными операциями соединения SQL. Имея немного практики и знаний в реляционной теории, вы всегда сможете выбрать верный тип реляционного соединения JOIN и правильно представить его на языке SQL.

7. Производные таблицы SQL похожи на табличные переменные

Раньше мы узнали, что SQL является декларативным языком, и не имеет переменных (хотя в некоторых диалектах SQL они существуют). Но можно написать нечто похожее на переменные. Эти звери называются производными таблицами.

Производная таблица — это не что иное, как вложенный запрос, заключенный в круглые скобки.

-- Производная таблица
FROM (SELECT * FROM author)

Обратите внимание, что некоторые диалекты SQL требуют, чтобы производные таблицы имели корреляционное имя (также называемое псевдонимом).

-- Производная таблица с псевдонимом
FROM (SELECT * FROM author) a

Производные таблицы великолепны, если необходимо обойти проблемы, вызванные логическим упорядочением предложений SQL. Например, если вы хотите повторно использовать выражение столбца в предложении SELECT и WHERE, просто напишите (диалект Oracle):

-- Получить имя и фамилию авторов и их возраст в днях
SELECT first_name, last_name, age
FROM (
  SELECT first_name, last_name, current_date - date_of_birth age
  FROM author
)
-- Если возраст больше, чем 10000 дней
WHERE age > 10000

Обратите внимание, что некоторые базы данных и стандарт SQL:1999 подняли производные таблицы на следующий уровень введением обобщенных табличных выражений. Это позволит повторно использовать одну и ту же производную таблицу несколько раз в одной инструкции SQL SELECT. Приведенный выше запрос будет переведен на (почти) эквивалент:

WITH a AS (
  SELECT first_name, last_name, current_date - date_of_birth age
  FROM author
)
SELECT *
FROM a
WHERE age > 10000

Очевидно, что «a» можно также вывести в отдельное представление для более широкого использования общих подзапросов SQL. Подробнее о представлениях здесь.

Что мы из этого узнаем?

Снова, снова и снова. В SQL все завязано на ссылках, а не столбцах. Как этим воспользоваться. Не бойтесь написания производных таблиц или других сложных ссылок на таблицы.

8. SQL GROUP BY преобразует прежние ссылки на таблицу

Давайте вновь обсудим наше предложение FROM:

FROM a, b

А теперь к соединенной ссылке (см. выше) применим предложение GROUP BY

GROUP BY A.x, A.y, B.z

Предложение производит новую ссылку на таблицу только с тремя оставшимися столбцами (!). Попробуем это переварить. С применением GROUP BY, уменьшается число доступных столбцов во всех последующих логических предложениях, включая SELECT. Ссылаться только на столбцы из предложения GROUP BY в предложении SELECT можно по синтаксической причине.

  • Обратите внимание, что другие столбцы могут по-прежнему быть доступными в качестве аргументов агрегатных функций:
SELECT A.x, A.y, SUM(A.z)
FROM A
GROUP BY A.x, A.y
  • Следует заметить, что MySQL, к сожалению, не придерживается этого стандарта, отчего получается только путаница. Не попадайтесь на уловки в MySQL. GROUP BY преобразует ссылки на таблицу Таким образом, можно ссылаться только на столбцы, также упоминаемые в предложении GROUP BY.

Что мы из этого узнаем?

GROUP BY, опять же, работает с табличными ссылками, преобразовывая их в новую форму.

9. SQL SELECT в реляционной алгебре называется проекцией

Мне лично нравится термин «проекция», так как он используется в реляционной алгебре. После того как вы создали ссылку на таблицу, отфильтровали и преобразовали ее, можете переходить к проецированию в другую форму. Предложение SELECT подобно проектору. Табличная функция использующет выражение значения строки для преобразования каждой записи из ранее созданной ссылки на таблицу в конечный результат.

В предложении SELECT можно работать со столбцами, создавая сложные выражения столбцов как части записи/строки.

Есть много специальных правил в отношении характера доступных выражений, функций и т.д. Главное, нужно помнить следующее:

  1. Можно использовать только ссылки на столбцы, полученные из ссылки на таблицу в «output».
  2. Если у вас есть предложение GROUP BY, вы можете ссылаться только на столбцы из этого предложения или агрегатные функции.
  3. Если нет предложения GROUP BY вместо агрегатных можно использовать оконные функции.
  4. Если нет предложения GROUP BY, нельзя сочетать агрегатные и неагрегатные функции.
  5. Существуют некоторые правила, касающиеся переноса регулярных функций в агрегатные функции и наоборот.
  6. Есть…

Много сложных правил. Которыми можно заполнить еще один урок. Например, причина почему нельзя комбинировать агрегатные функции с неагрегатными функциями в проекции инструкции SELECT без предложения GROUP BY (правило № 4), такова:

  1. Это не имеет смысла. Интуитивно.
  2. Если не помогает интуиция (например, новичкам в SQL), выручают синтаксические правила. В SQL:1999 реализован оператор GROUPING SETS, а в SQL:2003 — пустой оператор grouping sets: GROUP BY (). Всякий раз, когда присутствует агрегатная функция и нет явного предложения GROUP BY, применяется неявный пустой GROUPING SET (правило №2). Следовательно, исходные правила о логическом упорядочении больше не являются верными, и проекция (SELECT) влияет на результат логически предшествующего, но лексически последовательного предложения (GROUP BY).

Запутались? Да. Я тоже. Давайте вернемся к более простым вещам.

Что мы из этого узнаем?

Предложение SELECT может быть одним из самых сложных предложений в SQL, даже если оно выглядит просто. Все другие предложения только переносят ссылки на таблицы от одного к другому. Предложение SELECT портит всю красоту этих ссылок, полностью их преобразовывая путем применения к ним правил.

Чтобы понять SQL, перед использованием оператора SELECT нужно усвоить все остальное. Даже если SELECT является первым предложением в лексической упорядоченности, он должен быть последним.

10. SQL DISTINCT, UNION, ORDER BY и OFFSET — намного проще

После сложного SELECT мы можем снова вернуться к простым истинам:

  • Операции Set (DISTINCT и UNION)
  • Операции упорядочивания (ORDER BY, OFFSET .. FETCH)

Операции Set

Операции set работают с наборами, которые на самом деле являются таблицами. Почти. Теоретически, это несложно понять.

  • DISTINCT удаляет дубликаты после проекции.
  • UNION объединяет два подзапроса и удаляет дубликаты
  • UNION ALL объединяет два подзапроса, сохраняя дубликаты
  • EXCEPT удаляет записи из первого подзапроса, которые также содержатся во втором подзапросе (и затем удаляет дубликаты)
  • INTERSECT сохраняет только записи, содержащиеся в обоих поздапросах (а затем удаляет дубликаты)

Удаление дубликатов во всех этих случаях не имеет смысла. Для объединения подзапросов чаще всего следует применять UNION ALL.

Операции упорядочивания

Упорядочение не является реляционной функцией. Это функция, предназначенная только для SQL. Она применяется в самом конце лексического упорядочения и логического упорядочения инструкции SQL. Использование ORDER BY и OFFSET.. FETCH — это единственный способ гарантировать, что записи могут быть доступны по индексу надежным способом. Все остальные способы упорядочивания всегда произвольны и случайны, даже если они могут показаться воспроизводимыми.

OFFSET .. FETCH — это только один вариант синтаксиса. Другие варианты включают LIMIT, OFFSET в MySQL и PostgreSQL .. или TOP и START AT в SQL Server и Sybase. Хороший обзор различных способов реализации OFFSET.. FETCH можно увидеть здесь.

Приступаем к работе

Как и в каждом языке, чтобы освоить SQL, требуется практика. 10 вышеупомянутых простых шагов помогут вам понять обычные операции SQL. С другой стороны, неплохо учиться также на распространенных ошибках.

bookflow.ru

Что означает «AS» в SQL? — sql

Мне нравится вопрос.

Вот как я это вижу и как я объясняю это людям, надеюсь, что это поможет:

Начните с <expression> as <name>. Простейшая аналогия с реальной жизнью — это аббревиатура. Он был создан, чтобы сделать код чище, легче читать и просто короче. Представьте себе сценарий: у нас есть данные обо всех студентах из Массачусетского технологического института, а также в Массачусетском отделе автотранспортных средств в нашей базе данных, и мы хотим найти студентов, которые имеют ускоренные билеты и сколько они заплатили.

SELECT
    government.SocialSecurityAdministration.FirstName,
    government.SocialSecurityAdministration.LastName,
    education.MasachusettsInstituteOfTechnology.Faculty
    government.DepartmentOfMotorVehiclesTickets.TicketTotal,
    government.SocialSecurityAdministration.SocialSecurityNumber
FROM
    education.MasachusettsInstituteOfTechnology
    INNER JOIN government.DepartmentOfMotorVehiclesTickets ON education.MasachusettsInstituteOfTechnology.SocialSecurityNumber = government.DepartmentOfMotorVehicles.SocialSecurityNumber
    INNER JOIN government.SocialSecurityAdministration ON government.DepartmentOfMotorVehicles.SocialSecurityNumber = government.SocialSecurityAdministration.SocialSecurityNumber

Выглядит уродливо, не так ли? В реальной жизни мы сократили Массачусетский технологический институт как Массачусетский технологический институт, а Департамент автомобильных транспортных средств — DMV. Я не знаю официальной аббревиатуры для Администрации социального обеспечения (но мы можем придумать одну), хотя мы говорим SSN, когда мы имеем в виду номер социального страхования. Позвольте реализовать эту идею:

SELECT
        ssnAdm.FirstName,
        ssnAdm.LastName,
        ssnAdm.Faculty
        dmv.TicketTotal,
        ssnAdm.SocialSecurityNumber AS ssn
    FROM
        education.MasachusettsInstituteOfTechnology AS mit
        INNER JOIN government.DepartmentOfMotorVehiclesTickets AS dmv ON mit.SocialSecurityNumber = dmv.SocialSecurityNumber
        INNER JOIN government.SocialSecurityAdministration AS ssAdm ON dmv.SocialSecurityNumber = dmv.SocialSecurityNumber

Выглядит лучше, не так ли?

Теперь в <name> as <expression> часть. Это делается для упрощения кода, а также для оптимизации производительности, но теперь сосредоточимся на упрощении. Используя тот же пример, который я использовал выше, вы можете получить/спросить следующее: «Для каждого студента MIT, получившего билет, мне нужно знать последние 4 цифры их SSN, их фамилию, сумму денег на их банковский счет и их последнюю сумму транзакции VISA «. Да, вы работаете в ЦРУ.

Пусть написано:

SELECT
    RIGHT(4,ts.ssn) as LastFourDigitsSsn,
    ts.LastName,
    bad.TotalAmount,
    ISNULL(visa.TransactionAmt,'Student uses MasterCard') AS VisaTransaction
FROM
    (SELECT
        ssnAdm.FirstName,
        ssnAdm.LastName,
        ssnAdm.Faculty
        dmv.TicketTotal,
        ssnAdm.SocialSecurityNumber AS ssn
    FROM
        education.MasachusettsInstituteOfTechnology AS mit
        INNER JOIN government.DepartmentOfMotorVehiclesTickets AS dmv ON mit.SocialSecurityNumber = dmv.SocialSecurityNumber
        INNER JOIN government.SocialSecurityAdministration AS ssAdm ON dmv.SocialSecurityNumber = dmv.SocialSecurityNumber
    ) AS ts
    INNER JOIN business.BankAccountsData AS bad ON ts.ssn = bad.SocialSecurityNumber
    OUTER APPLY (SELECT TOP 1 TransactionAmt FROM business.VisaProcessingData vpd WHERE vpd.BankAccountID = bad.ID ORDER BY TransactionDateTime DESC) as visa

Ну, опять выглядит уродливо. Но что, если мы немного упростим это и выразим определенные вещи за пределами фактического утверждения? Это, когда приходит <name> as <expression>. Позвольте сделать это:

WITH MitTicketedStudents AS (
    SELECT
        ssnAdm.LastName,
        ssnAdm.SocialSecurityNumber as ssn,
        RIGHT(4,ssnAdm.SocialSecurityNumber) as LastFourDigitsSsn
    FROM
        education.MasachusettsInstituteOfTechnology AS mit
        INNER JOIN government.DepartmentOfMotorVehiclesTickets AS dmv ON mit.SocialSecurityNumber = dmv.SocialSecurityNumber
        INNER JOIN government.SocialSecurityAdministration AS ssAdm ON dmv.SocialSecurityNumber = dmv.SocialSecurityNumber
),
LatestVisaTransactions AS (
    SELECT DISTINCT
        BankAccountID,
        FIRST_VALUE(TransactionAmt) OVER (PARTITION BY BankAccountId ORDER BY TransactionDateTime DESC) as TransactionAmt
    FROM
        business.VisaProcessingData
)

-- And let use our expressions now

SELECT
    mts.LastFourDigitsSsn,
    mts.LastName,
    bad.TotalAmount,
    ISNULL(lvt.TransactionAmt,'Student uses MasterCard') AS VisaTransaction
FROM
    MitTicketedStudents mts
    INNER JOIN business.BankAccountsData AS bad ON mts.ssn = bad.SocialSecurityNumber
    LEFT OUTER JOIN LatestVisaTransactions lvt ON bad.ID = lvt.BankAccountID;

Выглядит лучше, не так ли?

Вывод: если вы хотите разделить код, вы используете <name> as <expression>, когда вы хотите дать что-то псевдониму для упрощения кода, вы используете <expression> as <name>.

qaru.site

Синтаксис SQL | SQL

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

SELECT [DISTINCT | ALL] {* | список_выбора} 
FROM {table_name [alias] | имя_представления}

Ключевые слова (SELECT, GRANT, DELETE или CREATE) прописаны в синтаксисе SQL и имеют в этом языке предопределенное значение. Можно использовать ключевые слова в верхнем или нижнем регистре. Следующие три запроса равнозначны:

SELECT * FROM EMPLOYEES;
Select * FROM EMPLOYEES;
select * FROM EMPLOYEES;

В некоторых случаях ключевые слова могут быть сокращены. Например, ключевое слово DESCRIBE может быть использовано либо в форме DESC, либо DESCRIBE. Если мы выполним следующие запросы, то в обоих случаях получим структуру таблицы сотрудников.

DESCRIBE EMPLOYEES;
DESC EMPLOYEES;

Идентификаторы – это имена заданные разработчиками для структурных элементов базы данных: таблицы, столбцы, псевдонимы, индексы, представления. В синтаксисе последнего SQL запроса ‘EMPLOYEES’ — это идентификатор, а ‘SELECT‘ — ключевое слово. Правила для создания идентификаторов указываются в спецификации поставщика. Рассмотрим следующую таблицу:

ПравилаПлатформаОписание
Идентификатор должен содержать доSQL2003128 символов.
DB2128 символов, в зависимости от платформы.
MySQL64 символа.
Oracle30 байт; имена базы данных до 8 байт.
PostgreSQL31 символ.
Идентификатор может содержатьSQL2003Любые цифры, символы и нижнее подчеркивание.
DB2Любые цифры, символы в верхнем регистре или символ нижнего подчеркивания.
MySQLЛюбые цифры или символы.
OracleЛюбые цифры, символы и нижнее подчеркивание (_), знак фунта стерлингов (#) или доллара ($).
PostgreSQLЛюбые цифры, символы и нижнее подчеркивание (_).
Первый символ должен бытьSQL2003Буквой.
DB2Буквой.
MySQLБуквой или цифрой (но не должен содержать только цифры).
OracleБуквой.
PostgreSQLБуквой или нижним подчеркиванием (_).
Идентификатор не может содержатьSQL2003Специальные символы или пробелы.
DB2Специальные символы или пробелы.
MySQLТочку (.), слэш (/) или ASCII(0) и ASCII(255). Кавычки (‘) и двойные кавычки («) допускаются только в ссылающихся идентификаторах.
OracleПробелы, двойные кавычки («) или специальные символы.
PostgreSQLДвойные кавычки («).
В синтаксисе SQL запросов символ идентификатораSQL2003Двойные кавычки («).
DB2Двойные кавычки («).
MySQLКавычки ( ‘ ) или двойные кавычки (» ) в режиме совместимости с ANSI.
OracleДвойные кавычки («).
PostgreSQLДвойные кавычки («).
Идентификатор может быть зарезервированSQL2003Нет, кроме ссылающихся идентификаторов.
DB2Да.
MySQLНет, кроме ссылающихся идентификаторов.
OracleНет, кроме ссылающихся идентификаторов.
PostgreSQLНет, кроме ссылающихся идентификаторов.
Адресация к схемеSQL2003Каталог.схема.объект.
DB2Схема.объект.
MySQLБаза_данных.объект.
OracleСхема.объект.
PostgreSQLБаза_данных.схема.объект.
Идентификатор должен быть уникальнымSQL2003Да.
DB2Да.
MySQLДа.
OracleДа.
PostgreSQLДа.

Стандарт SQL не содержит никаких точных указаний по наименованиям, поэтому нужно следовать следующим основным принципам (в том числе и в синтаксисе SQL запросов UPDATE):

  • Выбирайте имя, которое содержит смысл и имеет описательный характер. Например, таблица сотрудников не должна называться emp, а столбец имени сотрудника должен называться first_name, а не fname, хотя и «emp», и «fname» это допустимые идентификаторы;
  • Используйте для всех объектов в базе данных SQL либо заглавные буквы, либо строчные, поскольку некоторые серверы баз данных чувствительны к регистру.

Термин литералы относится к фиксированным значениям данных. SQL распознает четыре типа литералов: числовые значения, строки символов, дата или время, логическое значение. Например, 100, -120, 544, 03, -458, 25, 3e2, 5E-2 являются действительными числовыми литералами. ‘США‘, ‘2000‘, ‘SQL Синтаксис‘, ‘1 января 1981‘ являются действительными строками символов (должны быть заключены в одинарные кавычки (‘ ‘)). Логические литералы и литералы даты/времени выглядят следующим образом: TRUE и ‘JAN-28-1976 21:12:40:00‘.

Операторы работают с отдельными элементами данных и возвращают результат. Операторы используются в различных операциях SQL, таких как SELECT, INSERT, UPDATE или DELETE. А также при создании различных объектов базы данных, таких как функции, представления, триггеры и хранимые процедуры. MS SQL синтаксис запросов поддерживает различные типы операторов, хотя не все СУБД поддерживают все операторы.

Смотрите таблицу ниже:

ОператорыРаботают во
Арифметические операторыВсех базах данных.
Операторы присвоенияВсех базах данных.
Побитовые операторыMicrosoft SQL Server.
Операторы сравненияВсех базах данных.
Логические операторыDB2, Oracle, SQL Server и PostgreSQL.
Унарные операторыDB2, Oracle и SQL Server.

Приоритетность — это порядок, в котором база данных оценивает различные операторы в одном выражении. В синтаксисе SQL запросов при выполнении выражения, содержащего несколько операторов (например, +, -, /), сначала выполняются операторы с высшей приоритетностью, а затем с более низкой. При оценке операторов с одинаковой приоритетностью операторы выполняются в порядке их расстановки в выражении слева направо.

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

Приоритетность операторов
( ) (выполняются в первую очередь).
+, -, ~ (унарные операторы).
*, /, % (математические операторы).
+, — (арифметические операторы).
=, >, <, >=, <=, <>, !=, !>, !< (операторы сравнения).
I^ (Побитовый OR), & (Побитовый AND), | (Побитовый OR).
NOT.
AND.
ALL, ANY, BETWEEN, IN, LIKE, OR, SOME.
= (присвоение переменных).

Следующие выражения в запросе MySQL возвращают разные результаты:

SELECT 12 * 2 + 24;

12 * 2 + 24
48


SELECT 12 * (2 + 24)

12 * (2 + 24)
312

Комментарии в синтаксисе SQL запросов — это необязательный текст, который описывает, что делает программа и почему код был изменен. Компилятор всегда игнорирует комментарии. Комментарий вводится через двойное тире и пробел:
— Это комментарий SQL

В качестве альтернативы, можно использовать блок комментариев C-стиля:

/ * Это первая строка комментария
Это вторая строка комментария * /.

Пробелы, как правило, игнорируются в операторах SQL, что позволяет проще форматировать код для удобства чтения.
На следующей диаграмме приведены элементы синтаксиса SQL запросов, которые составляют одиночный оператор:


Список ключевых слов SQL:

ABSOLUTEACTIONADDADMIN
AFTERAGGREGATEALIASALL
ALLOCATEALTERANDANY
AREARRAYASASC
ASSERTIONASSERTIONATATOMIC
AUTHORIZATIONBEFOREBEGINBIGINT
BINARYBITBLOBBOOLEAN
BOTHBREADTHBYCALL
CASCADECASCADEDCASECAST
CATALOGCHARCHARACTERCHECK
CLASSCLOBCLOSECOLLATE
COLLATIONCOLLECTCOLUMNCOMMIT
COMPLETIONCONDITIONCONNECTCONNECTION
CONSTRAINTCONSTRAINTSCONSTRUCTORCONTAINS
CONTINUECORRESPONDINGCREATECROSS
CUBECURRENTCURRENT_DATECURRENT_PATH
CURRENT_ROLECURRENT_TIMECURRENT_TIMESTAMPCURRENT_USER
CURSORCYCLEDATADATALINK
DATEDAYDEALLOCATEDEC
DECIMALDECLAREDEFAULTDEFERRABLE
DELETEDEPTHDEREFDESC
DESCRIPTORDESTRUCTORDIAGNOSTICSDICTIONARY
DISCONNECTDODOMAINDOUBLE
DROPELEMENTEND-EXECEQUALS
ESCAPEEXCEPTEXCEPTIONEXECUTE
EXITEXPANDEXPANDINGFALSE
FIRSTFLOATFORFOREIGN
FREEFROMFUNCTIONFUSION
GENERALGETGLOBALGOTO
GROUPGROUPINGHANDLERHASH
HOURIDENTITYIFIGNORE
IMMEDIATEININDICATORINITIALIZE
INITIALLYINNERINOUTINPUT
INSERTINTINTEGERINTERSECT
INTERSECTIONINTERVALINTOIS
ISOLATIONITERATEJOINKEY
LANGUAGELARGELASTLATERAL
LEADINGLEAVELEFTLESS
LEVELLIKELIMITLOCAL
LOCALTIMELOCALTIMESTAMPLOCATORLOOP
MATCHMEMBERMEETSMERGE
MINUTEMODIFIESMODIFYMODULE
MONTHMULTISETNAMESNATIONAL
NATURALNCHARNCLOBNEW
NEXTNONONENORMALIZE
NOTNULLNUMERICOBJECT
OFOFFOLDON
ONLYOPENOPERATIONOPTION
ORORDERORDINALITYOUT
OUTEROUTPUTPADPARAMETER
PARAMETERSPARTIALPATHPERIOD
POSTFIXPRECEDESPRECISIONPREFIX
PREORDERPREPAREPRESERVEPRIMARY
PRIORPRIVILEGESPROCEDUREPUBLIC
READREADSREALRECURSIVE
REDOREFREFERENCESREFERENCING
RELATIVEREPEATRESIGNALRESTRICT
RESULTRETURNRETURNSREVOKE
RIGHTROLEROLLBACKROLLUP
ROUTINEROWROWSSAVEPOINT
SCHEMASCROLLSEARCHSECOND
SECTIONSELECTSEQUENCESESSION
SESSION_USERSETSETSSIGNAL
SIZESMALLINTSPECIFICSPECIFICTYPE
SQLSQLEXCEPTIONSQLSTATESQLWARNING
STARTSTATESTATICSTRUCTURE
SUBMULTISETSUCCEEDSSUMSYSTEM_USER
TABLETABLESAMPLETEMPORARYTERMINATE
THANTHENTIMETIMESTAMP
TIMEZONE_HOURTIMEZONE_MINUTETOTRAILING
TRANSACTIONTRANSLATIONTREATTRIGGER
TRUEUESCAPEUNDERUNDO
UNIONUNIQUEUNKNOWNUNTIL
UPDATEUSAGEUSERUSING
VALUEVALUESVARCHARVARIABLE
VARYINGVIEWWHENWHENEVER
WHEREWHILEWITHWRITE
YEARZONE

Данная публикация представляет собой перевод статьи «SQL Syntax» , подготовленной дружной командой проекта Интернет-технологии.ру

www.internet-technologies.ru

Что означает «?»? «В SQL Server? — sql

sp_msforeachdb — это… специальный. И я имею в виду отчасти в смысле «верхом на коротком автобусе» этого слова (и даже это не совсем справедливо здесь, моя главная жалоба заключается в том, что он недокументирован), но в основном я просто имею в виду, что он уникален. Этот синтаксис используется только с sp_msforeachdb и sp_msforeachtable, а больше нигде в Sql-сервере.

Однако вы должны думать, что если вы когда-либо писали код, который использовал поставщик OLE или ODBC для выполнения параметризованных запросов. Эти инструменты используют ? символ как заполнитель параметров. Здесь что-то похожее. ? character — это заполнитель параметров, где значение параметра позже будет установлено на имя каждой БД на вашем сервере, включая master, tempdb, model и msdb.

Попробуйте запустить этот код, чтобы понять, как он работает:

EXEC sp_MSforeachdb 'print ''?'' '

Заманчиво использовать эту процедуру для таких вещей, как сценарии обслуживания, отчетности и оповещения, но это то, что вы, вероятно, захотите сделать только экономно. Лучше не полагаться на недокументированное поведение. Ссылка sqlblog, размещенная первым в другом ответе, является стандартным мышлением по этому вопросу.

В принципе, скорее всего, нет конкретных планов уйти в отставку или нарушить эту процедуру (или другие процедуры sp_*), но также есть довольно много нулевых инвестиций в продвижение этих процедур от версии к версии. Например, связанная статья указывает, что sp_msforeachdb полагается на старые dbo.sysdatabases а не на более корректные sys.databases. Я бы не ожидал, что Microsoft будет нацелена на sp_msforeachdb напрямую, но если они когда-либо решат удалить dbo.sysdatabases мое ожидание будет состоять в том, что их тестирование обнаружит, что sp_msforeachdb сломан, и в это время они также просто удалят sp_msforeachdb, а не исправляют его.

qaru.site

SQL SELECT « Язык запросов SQL

Не многие владеют в совершенстве языками, а если говорит о языках программирования, то большая часть знает о них только то, что изучали в школе. Однако в полной мере об используемых языках, для управления компьютерными программами, можно почерпнуть только при глубоком изучении материала, в высших учебных заведениях и путем самостоятельного обучения.

Огромное количество программ позволяют выбирать данные для финансовых и других отчетов в считанные минуты. Одна из самых простых и к тому же удобных — SQL SELECT. При знакомстве с ней любой программист сможет без проблем рассказать о том, что SQL – это язык программирования, помогающий структурировать все необходимые запросы, а SELECT – это команда, используемая в комбинации с SQL. Безусловно, в сочетании SQL SELECT позволяют проводить все необходимые действия, изложенные на примерах данной страницы. В связи, с чем нижеизложенный материал более подробно и наглядно характеризует возможности SQL SELECT. Поэтому, установив программу, используемую SQL SELECT, вы сэкономите время своих сотрудников, а также деньги предприятия.

С помощью запроса SQL SELECT можно выполнять выборку данных из таблицы. Следующие примеры запросов SQL SELECT используются в таких SQL СУБД как MySQL, Oracle, Access и других.

SQL Select

 

Для выполнения следующих SQL запросов SELECT нам необходимо прежде всего изучить структуру таблиц.

Имя таблицыИмя поляТип поляПримечание
FAKULTETKOD_FIntegerPRIMARY KEY
NAZV_FChar, 30
SPECKOD_SIntegerPRIMARY KEY
KOD_FInteger
NAZV_SChar, 50
STUDENTKOD_STUDIntegerPRIMARY KEY
KOD_SInteger
FAMChar, 30
IMChar, 15
OTChar, 15
STIPDecimal, 3
BALLDecimal, 3

Примеры запросов SELECT на языке SQL:

SQL Пример SELECT №1
Выбрать студентов, получающих стипендию, равную 150.

SELECT fname FROM STUDENT WHERE STIP=150;

С помощью данного SQL запроса SELECT выбираются все значения из таблицы STUDENT, поле STIP которых строго равно 150.


SQL Пример SELECT №2
Выбрать студентов, имеющих балл от 82 до 90. Студенты должны быть отсортированы в порядке убывания балла.

sql-language.ru

Конструкция WHERE в SQL

Вы здесь: Главная — MySQL — SQL — Конструкция WHERE в SQL

При выборке записей из таблицы практически всегда требуется задавать определённые условия, по которым мы определяем, какие записи нам нужны, а какие — нет. И именно эти условия можно задавать с помощью конструкции WHERE в SQL. Я уже знакомил Вас с ней, но в этой статье решил познакомить с WHERE немного поближе.

Начну с простого примера выборки с использованием конструции WHERE в SQL:

SELECT * FROM table WHERE count=5

Вернутся записи, в которых поле «count» имеет значение 5. Теперь усложним запрос:

SELECT * FROM table WHERE count=5 AND id < 100

Таким образом, вернутся записи, у которых поле «count» имеет значение 5 И поле «id» имеет значение меньше 100.

Разумеется, Вы можете использовать и другие логические операции. Их полный список:

  • ! (отрицание)
  • AND (И)
  • OR (ИЛИ)
  • XOR (ИСКЛЮЧАЮЩЕЕ ИЛИ, иногда ещё называют МОНТАЖНОЕ ИЛИ, но такое название встречается в основном в микропроцессорной литературе)

Пример с использованием нескольких логических операторов:

SELECT * FROM table WHERE !(id <= 120 AND (count=10 OR date > "10/11/1980"))

Вот такой, на первый взгляд, сложный SQL-запрос. Постарайтесь в нём разобраться самостоятельно.

Также конструкция WHERE в SQL может содержать LIKE. LIKE позволяет определить, совпадает ли указанная строка с определённым шаблоном. Чтобы стало немного понятнее, приведу пример:

SELECT * FROM table WHERE text LIKE "%some text%"

Данный SQL-запрос вернёт result_set, содержащий записи, в которых поле «text» имеет такой текст: «some text«. Обратите внимание, что это не проверка на равенство. Текст может быть огромным, но если в нём содержитася строка: «some text«, то LIKE вернёт true.

Давайте напишу, как задаётся шаблон для LIKE:

  • % — это то, что мы с Вами использовали. Используется он чаще всего и означает он любую строку любой длины. Фактически, строкой «%some text%» мы говорим, что сначала идёт любая строка любой длины, затем «some text«, а затем вновь любая строка любой длины. Если текст удовлетворяет этому шаблону, то вернуть true, иначе false.
  • [ ] — это одиночный символ. Чтобы использовать этот шаблон необходимо задавать диапазоны, например, так: «[a-z]some%«. Данный шаблон будет означать, что сначала идёт 1 символ (любой символ от a до z), далее «some» и потом любая строка любой длины.
  • _ — это любой одиночный символ.
  • [^] — это противоположность [ ]. Например, можно привести такой пример: «[^az]some_«. Данный шаблон означает, что вначале идёт любой символ, но только НЕ «a» и НЕ «z«. Далее должна идти строка «some«, а после только один одиночный символ.

Знание и умение использования LIKE очень важно, поверьте моему опыту. Самый простой пример использования LIKE — это поиск по сайту. Ведь контент находится в базе данных, и необходимо вытащить только те записи, в которых содержится строка, заданная в строке поиска. И тут приходит на помощь LIKE. Именно так реализован поиск мною на этом сайте.

Вот, пожалуй, всё, что необходимо знать для успешной выборки записей с использованием конструкции WHERE в SQL.

Полный курс по PHP и MySQL: http://srs.myrusakov.ru/php

  • Создано 22.01.2011 16:41:50
  • Михаил Русаков
Предыдущая статья Следующая статья

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:
    <a href=»https://myrusakov.ru» target=»_blank»><img src=»https://myrusakov.ru//images/button.gif» alt=»Как создать свой сайт» /></a>

    Она выглядит вот так:

  2. Текстовая ссылка:
    <a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):
    [URL=»https://myrusakov.ru»]Как создать свой сайт[/URL]

myrusakov.ru