Получаем 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 SELECT * FROM users
2. Выборка данных с объединением двух таблиц (JOIN):
SELECT u.name, r.* FROM users u JOIN users_rights r ON r.user_id=u.id
* в данном примере идет выборка данных с объединением таблиц users
и users_rights
. Объединяются они по полям user_id
(в таблице users_rights) и id
(users). Извлекается поле name из первой таблицы и все поля из второй.
3. Выборка с интервалом по времени и/или дате
а) известна точка начала и определенный временной интервал:
* будут выбраны данные за последний час (поле date
).
б) известны дата начала и дата окончания:
25.10.2017
и 25.11.2017
.
в) известны даты начала и окончания + время:
* выбираем данные в промежутке между 25.03.2018 0 часов 15 минут
и 25.04.2018 15 часов 33 минуты и 9 секунд
.
г) вытаскиваем данные за определенные месяц и год:
* извлечем данные, где в поле date
присутствуют значения для апреля 2018
года.
4. Выборка максимального, минимального и среднего значения:
> SELECT max(area), min(area), avg(area) FROM country
* max
— максимальное значение; min
— минимальное; avg
— среднее.
5. Использование длины строки:
* данный запрос должен показать всех пользователей, имя которых состоит из 5 символов.
Примеры более сложных запросов или используемых редко
1. Объединение с группировкой выбранных данных в одну строку (GROUP_CONCAT):
* из таблицы users
извлекаются данные по полю id
, все они помещаются в одну строку, значения разделяются запятыми
.
2. Группировка данных по двум и более полям:
> SELECT * FROM users GROUP BY CONCAT(title, "::", birth)
* итого, в данном примере мы сделаем выгрузку данных из таблицы users и сгруппируем их по полям title
и birth
. Перед группировкой мы делаем объединение полей в одну строку с разделителем ::
.
3. Объединение результатов из двух таблиц (UNION):
> (SELECT id, fio, address, "Пользователи" as type FROM users)
UNION
(SELECT id, fio, address, "Покупатели" as type FROM customers)
* в данном примере идет выборка данных из таблиц users
и customers
.
4. Выборка средних значений, сгруппированных за каждый час:
SELECT avg(temperature), DATE_FORMAT(datetimeupdate, "%Y-%m-%d %H") as hour_datetime FROM archive GROUP BY DATE_FORMAT(datetimeupdate, "%Y-%m-%d %H")
* здесь мы извлекаем среднее значение поля temperature
из таблицы archive
и группируем по полю datetimeupdate
(с разделением времени за каждый час).
Вставка (INSERT)
Синтаксис 1:
> INSERT INTO
() VALUES ()
Синтаксис 2:
> INSERT INTO
VALUES ()
* где table
— имя таблицы, в которую заносим данные; fields
— перечисление полей через запятую;
values
— перечисление значений через запятую.
* первый вариант позволит сделать вставку только по перечисленным полям — остальные получат значения по умолчанию. Второй вариант потребует вставки для всех полей.
* в данном примере мы одним SQL-запросом добавим 3 записи.
2. Вставка из другой таблицы (копирование строк, INSERT + SELECT):
* извлекаем все записи из таблицы cities
, названия которых начинаются на «М» и заносим в таблицу cities-new
.
Обновление (UPDATE)
Синтаксис:
* где table
— имя таблицы; field
— поле, для которого будем менять значение; value
— новое значение; conditions
— условие (без него делать update опасно — можно заменить все данные во всей таблице).
Обновление с использованием замены (REPLACE):
UPDATE
SET = REPLACE(, "", "");
UPDATE cities SET name = REPLACE(name, "Масква", "Москва");
Если мы хотим перестраховаться, результат замены можно сначала проверить с помощью SELECT:
Удаление (DELETE)
Синтаксис:
* где table
— имя таблицы; conditions
— условие (как и в случае с UPDATE, использовать DELETE без условия опасно — СУБД не запросит подтверждения, а просто удалит все данные).
Создание таблицы
Синтаксис:
> CREATE TABLE
( , )
> CREATE TABLE IF NOT EXISTS `users_rights` (
`id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`rights` int(10) unsigned NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
* где table
— имя таблицы (в примере users_rights
); field1, field2
— имя полей (в примере создается 3 поля — id, user_id, rights
); options1, options2
— параметры поля (в примере int(10) unsigned NOT NULL
); table options
— общие параметры таблицы (в примере ENGINE=InnoDB DEFAULT CHARSET=utf8
).
Использование запросов в PHP
Подключаемся к базе данных:
mysql_connect ("localhost", "login", "password") or die ("MySQL connect error");
mysql_select_db ("db_name");
mysql_query("SET NAMES "utf8"");
* где подключение выполняется к базе на локальном сервере (localhost
); учетные данные для подключения — login
и password
(соответственно, логин и пароль); в качестве базы используется db_name
; используемая кодировка UTF-8
.
Также можно создать постоянное подключение:
mysql_pconnect ("localhost", "login", "password") or die ("MySQL connect error");
* однако есть вероятность достигнуть максимально разрешенного лимита хостинга. Данным способом стоит пользоваться на собственных серверах, где мы сами можем контролировать ситуацию.
Завершить подключение:
* в PHP выполняется автоматически, кроме постоянных подключений (mysql_pconnect).
Запрос к MySQL (Mariadb) в PHP делается функцией mysql_query(), а извлечение данных из запроса — mysql_fetch_array():
$result = mysql_query("SELECT * FROM users");
while ($mass = mysql_fetch_array($result)) {
echo $mass . " ";
}
* в данном примере выполнен запрос к таблице users
. Результат запроса помещен в переменную $result
. Далее используется цикл while
, каждая итерация которого извлекает массив данных и помещает его в переменную $mass
— в каждой итерации мы работаем с одной строкой базы данных.
Используемая функция mysql_fetch_array() возвращает ассоциативный массив, с которым удобно работать, но есть еще альтернатива — mysql_fetch_row(), которая возвращает обычный нумерованный массив.
Экранирование
При необходимости включения в строку запроса спецсимвола, например, %, необходимо использовать экранирование с помощью символа обратного слэша — \
Например:
* если выполнить такой запрос без экранирования, знак %, будет восприниматься как любое количество символов после 100.
На этом все. Если Вам нужно помочь с выполнением запроса, пишите мне на почту
SQL (ˈɛsˈkjuˈɛl; англ. structured query language - «язык структурированных запросов») - декларативный язык программирования, применяемый для создания, модификации и управления данными в реляционной базе данных.
Соответствие стандартам SQL разных БД:
SQL
(Structured Query Language - язык структурированных запросов). SQL является, прежде всего, информационно-логическим языком, предназначенным для описания хранимых данных, для извлечения хранимых данных и для модификации данных.
SQL не является языком программирования. В связи с усложнением язык SQL стал более языком прикладного программирования, а пользователи получили возможность использовать визуальные построители запросов.
SQL является регистронезависимым языком. Cтроки в SQL берутся в одинарные кавычки.
Язык SQL представляет собой совокупность операторов. Операторы SQL делятся на:
операторы определения данных (Data Definition Language, DDL) - язык описания схемы в ANSI, состоит из команд, которые создают объекты (таблицы, индексы, просмотры, и так далее) в базе данных (CREATE, DROP, ALTER и др.).
операторы манипуляции данными (Data Manipulation Language, DML) - это набор команд, которые определяют, какие значения представлены в таблицах в любой момент времени (INSERT, DELETE, SELECT, UPDATE и др.).
операторы определения доступа к данным (Data Control Language, DCL) - состоит из средств, которые определяют, разрешить ли пользователю выполнять определенные действия или нет (GRANT/REVOKE , LOCK/UNLOCK).
операторы управления транзакциями (Transaction Control Language, TCL)
К сожалению, эти термины не используются повсеместно во всех реализациях. Они подчеркиваются ANSI и полезны на концептуальном уровне, но большинство SQL программ практически не обрабатывают их отдельно, так что они по существу становятся функциональными категориями команд SQL.
SELECT раздел JOIN
Простой JOIN (=пересечение JOIN =INNER JOIN)
- означает показывать только общие записи обоих таблиц. Каким образом записи считаются общими определяется полями в join- выражении. Например следующая запись: FROM
t1 JOIN
t2 ON
t1.
id =
t2.
id
означает что будут показаны записи с одинаковыми id, существующие в обоих таблицах.
LEFT JOIN (или LEFT OUTER JOIN)
означает показывать все записи из левой таблицы (той, которая идет первой в join- выражении) независимо от наличия соответствующих записей в правой таблице. Если записей нет в правой таблицы устанавливается пустое значение NULL.
RIGHT JOIN (или RIGHT OUTER JOIN)
действует в противоположность LEFT JOIN - показывает все записи из правой (второй) таблицы и только совпавшие из левой (первой) таблицы.
Другие виды JOIN
объединений: MINUS
- вычитание; FULL JOIN
- полное объединение; CROSS JOIN
- “Каждый с каждым” или операция декартова произведения.
INSERT IGNORE
Если в команде INSERT со строками, имеющими много значений, указывается ключевое слово IGNORE, то все строки, имеющие дублирующиеся ключи PRIMARY или UNIQUE в этой таблице, будут проигнорированы и не будут внесены. Если не указывать IGNORE, то данная операция вставки прекращается при обнаружении строки, имеющей дублирующееся значение существующего ключа
Команда REPLACE отличается от INSERT только тем, что если в таблице имеется запись с таким же значением в
индексированном поле (unique index), как у новой записи, то старая запись удаляется перед добавлением новой.
UPDATE
<
tablename>
SET
{
|
}
.,.
.<
COLUMN
name>
=
<
VALUE
expresslon>
[
WHERE
<
predlcate>
|
WHERE
CURRENT
OF
<
cursor name>
(*
только для вложения*
)
]
;
UPDATE
peers SET
zone=
"voip"
; # обновить все строки в столбце zone таблицы peers
UPDATE
stat SET
whp=
"13x13x13"
WHERE
id =
1
;
UPDATE
countries SET
nm_ukr=
(
SELECT
del_countries.
ukrainian FROM
del_countries WHERE
countries.
nm_en=
del_countries.
english
)
;
WordPress использование, настройка : в таблице wp_posts удалить все вхождения строки
[ WHERE
| WHERE CURRENT OF (*только для вложения*) ];
DELETE FROM Peers; // удалит все содержимое таблицы Peers.
DELETE FROM FinR where day Like "20120415%"; //
DELETE FROM prices WHERE ratesheet_id NOT IN (SELECT id FROM ratesheets);
ALTER
Изменение значения по умолчанию для колонки
. Чтобы установить новое значение по умолчанию для колонки, используйте команду вида: ALTER
TABLE
products ALTER
COLUMN
price SET
DEFAULT
7.77
;
OR
ALTER
TABLE
nases ALTER
COLUMN
zone SET
DEFAULT
"voip"
;
Заметим, что выполнение данной команды не влияет на уже существующие строки в таблице, команда изменят значение по умолчанию только для будущих команд INSERT. Чтобы удалить любое значение по умолчанию, используйте
ALTER
TABLE
products ALTER
COLUMN
price DROP
DEFAULT
;
Команда выполняет тоже самое, что и установка значения по умолчанию в null. Поскольку при удалении значения по умолчанию, оно неявно устанавливается в null, в случае удаления существующего значения по умолчанию, сообщений об ошибках, не будет.
Функция как значение по умолчанию для колонки
. В этом случае столбец timetracking имеет тип данных timestamp и значит для нее значением по умолчанию можно задать встроенную функцию now() т.е. при добавлении новой строки в столбец будет записана текущая дата и время ALTER TABLE timetracking ALTER COLUMN date_wd SET DEFAULT now();
Добавление ограничения
. Чтобы добавить какое-либо ограничение, используется табличный синтаксис определения этого ограничения. Например: ALTER TABLE products ADD CHECK (name "");
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
Чтобы добавить ограничение не-null, которое нельзя записать как ограничение на таблицу, используйте синтаксис:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
Указанное ограничение будет задействовано немедленно, так что данные в таблице перед добавлением ограничения должны ему удовлетворять.
Функции агрегирования
В стандартном SQL существует 5 агрегатных функций:
COUNT - функция возвращает количество строк, которые соответствует определенным критериям.,
SUM - возвращает сумму (общую) значений в определённом столбце. Строки столбцов со значениями NULL игнорируются функцией SUM.
AVG - среднее значение в столбце,
Функции агрегирования используются как имена полей в предложении запроса SELECT, но с одним исключением: имена полей применяются как аргументы. Функции SUM и AVG могут работать только с цифровыми полями. Функции COUNT, MAX, MIN работают как с цифровыми так и с символьными полями. При применении к символьным полям функции MAX и MIN могут работают с ASCII эквивалентами символов.
SELECT Count(Books.ID) AS [Количество Книг] FROM Books;
Использование CROUP BY позволяет применять агрегатные функции к группам записей.
SELECT Count(Books.ID) AS [Количество Книг] FROM Books GROUP BY [Писатель];
Представления (VIEW)
Представление (VIEW) - объект данных который не содержит никаких данных его владельца. Это - тип таблицы, чье содержание выбирается из других таблиц с помощью выполнения запроса.
Базовые таблицы - это таблицы, которые содержат данные. Однако имеется другой вид таблиц: - представления (VIEW). Представления - это таблицы чье содержание выбирается или получается из других таблиц. Они работают в запросах и операторах DML точно также как и основные таблицы, но не содержат никаких собственных данных. Представления - подобны окнам, через которые вы просматриваете информацию, которая фактически хранится в базовой таблице.
Команда CREATE VIEW
. Представление создается командой CREATE VIEW. Она состоит из слов CREATE VIEW (СОЗДАТЬ ПРЕДСТАВЛЕНИЕ), имени представления которое нужно создать, слова AS (КАК), и далее запроса. Создадим представление Londonstaff: CREATE VIEW Londonstaff
AS SELECT *
FROM Salespeople
WHERE city = "London";
Это представление используется точно так же как и любая другая таблица. Она может быть запрошена, модифицирована, вставлена в, удалена из, и соединена с, другими таблицами и представлениями. Запрос представления.
Итак, в нашей БД forum есть три таблицы: users (пользователи), topics (темы) и posts (сообщения). И мы хотим посмотреть, какие
данные в них содержатся. Для этого в SQL существует оператор SELECT
. Синтаксис его использования следующий:
SELECT что_выбрать FROM откуда_выбрать;
Вместо "что_выбрать" мы должны указать либо имя столбца, значения которого хотим увидеть, либо имена нескольких столбцов через
запятую, либо символ звездочки (*), означающий выбор всех столбцов таблицы. Вместо "откуда_выбрать" следует указать имя таблицы.
Давайте сначала посмотрим все столбцы из таблицы users:
SELECT * FROM users;
Вот и все наши данные, которые мы вносили в эту таблицу. Но предположим, что мы хотим посмотреть только столбец id_user (например,
в прошлом уроке, нам надо было для заполнения таблицы topics (темы) знать, какие id_user есть в таблице users). Для этого в запросе
мы укажем имя этого столбца:
SELECT id_user FROM users;
Ну, а если мы захотим посмотреть, например, имена и e-mail наших пользователей, то мы перечислим интересующие столбцы через запятую:
SELECT name, email FROM users;
Аналогично, вы можете посмотреть, какие данные содержат и другие наши таблицы. Давайте посмотрим, какие у нас существуют темы:
SELECT * FROM topics;
Сейчас у нас всего 4 темы, а если их будет 100? Хотелось бы, чтобы они выводились, например, по алфавиту. Для этого в SQL существует
ключевое слово ORDER BY
после которого указывается имя столбца по которому будет происходить сортировка.
Синтаксис следующий:
SELECT имя_столбца FROM имя_таблицы ORDER BY имя_столбца_сортировки;
По умолчанию сортировка идет по возрастанию, но это можно изменить, добавив ключевое слово DESC
Теперь наши данные отсортированы в порядке по убыванию.
Сортировку можно производить сразу по нескольким столбцам. Например, следующий запрос отсортирует данные по столбцу topic_name,
и если в этом столбце будет несколько одинаковых строк, то в столбце id_author будет осуществлена сортировка по убыванию:
Сравните результат с результатом предыдущего запроса.
Очень часто нам не нужна вся информация из таблицы. Например, мы хотим узнать, какие темы были созданы пользователем sveta (id=4).
Для этого в SQL есть ключевое слово WHERE
, синтаксис у такого запроса следующий:
Для нашего примера условием является идентификатор пользователя, т.е. нам нужны только те строки, в столбце id_author которых стоит 4
(идентификатор пользователя sveta):
Или мы хотим узнать, кто создал тему "велосипеды":
Конечно, было бы удобнее, чтобы вместо id автора, выводилось его имя, но имена хранятся в другой таблице. В последующих уроках
мы узнаем, как выбирать данные из нескольких таблиц. А пока узнаем, какие условия можно задавать, используя ключевое слово WHERE.
Оператор
Описание
= (равно)
Отбираются значения равные указанному
Пример:
SELECT * FROM topics WHERE id_author=4;
Результат:
> (больше)
Отбираются значения больше указанного
Пример:
SELECT * FROM topics WHERE id_author>2;
Результат:
< (меньше)
Отбираются значения меньше указанного
Пример:
SELECT * FROM topics WHERE id_author Результат:
>= (больше или равно)
Отбираются значения большие и равные указанному
Пример:
SELECT * FROM topics WHERE id_author>=2;
Результат:
to_date(‘01.01.80′,’dd.mm.yyyy’);
Данный запрос вернет данные о сотрудниках, которые приняты на работу в определенный промежуток времени. Хоть структура запроса отличается, от выполнение команд SQL в этих системах похоже, за исключением мелких деталей.
Использование SQL в сети Internet
С появлением всемирной паутины, то есть интернета, сфера использования языка SQL расширяется. Как известно, в сети хранится масса информации, но она не хаотично расположена, а размещена на сайтах и серверах по определенным критериям.
За хранение информации в Интернете, как и в других местах, отвечают непосредственно базы данных, а сайты являются системами управления. Как правило, сайты и их программный код организованы на разных языках программирования, но в основе баз данных лежит одна из разновидностей SQL, а именно язык создания баз данных, ориентированный под веб-интерфейсы MySQL.
Синтаксис и основной набор команд этого языка полностью копируют привычный всем SQL, но с некоторыми своими дополнениями, которые и дают ему отличие от Microsoft tSQL Server.
Команды SQL полностью похожи не только по синтаксису, но и по стандартному набору служебных слов. Разница состоит только в вызове и структурировании запроса. Для примера можно рассмотреть запрос для создания новой таблицы, именно она является первым, чему учат детей в школах на информатике:
if (mysqli_query($link, $query)) echo "Таблица создана.";
elseecho "Таблица не создана: ".mysqli_error();
mysqli_close($link);
В результате выполнения такого запроса можно получить новую таблицу "Юзеры", в которой будет два поля: логин и пароль.
Синтаксис изменен под Вэб, но в основу положены команды MicrosoftSQLServer.
Построение запросов MicrosoftSQLServer
Выборка из таблиц определенного набора данных одна из основных задач SQL. Для таких операций предусмотрена команда select в SQL. Именно о ней пойдет речь ниже.
Правила построение команды очень просты, а сама команда select в SQL строится следующим образом. К примеру, есть таблица, в которой имеются данные о сотруднике, которая, к примеру, имеет имя Person. Поставим задачу, что из таблицы нужно выбрать данные о сотрудниках, дата рождения которых - в промежутке от первого января до первого марта текущего года включительно. Для такой выборки необходимо выполнить команду SQL, в которой будет не только стандартная конструкция, но и условие выбора:
Select * from Person
Where P_BerthDay >= ‘01/01/2016’ and P_BerthDay= ‘01/01/2016’ and P_BerthDay= @DB and P_BerthDay