Часть 10.3: Модификация и изменение таблиц в базах данных SQLite3
Привет, посетитель сайта ZametkiNaPolyah.ru! Продолжаем изучать базы данных и наше знакомство с библиотекой SQLite3. В…
Привет, посетитель сайта ZametkiNaPolyah.ru! Продолжаем изучать базы данных и наше знакомство с библиотекой SQLite3. Было бы скучно, если бы у нас была возможность делать простые запросы на выборку данных и к тому же, если бы в языке SQL были бы только простые запросы без различных условий, то логика приложений, использующих базы данных была бы намного сложнее. Итак, данная запись будет целиком и полностью посвящена условиям при выборке данных, которые задаются при помощи уточняющей фразы WHERE.
WHERE и SELECT позволяют составлять очень сложные условия при выборке данных. Для того чтобы успешно писать запросы SELECT с условием, нам нужно понять, как работает клаузула WHERE. В этой записи вы найдете описание работы клаузулы WHERE и команды SELECT, увидите несколько примеров выборки данных по условию, заданному с помощью WHERE и узнаете о том с какими еще SQL командами можно использовать WHERE.
Содержание статьи:
Мы рассмотрели примеры простой выборки данных из таблиц базы данных под управлением SQLite, но иногда бывает так, что простые SQL запросы SELECT не дают удовлетворительных результатов. Основной минус заключается в том, что если мы не налагаем на выборку данных из таблицы какие-то условия, то СУБД нам возвращает все строки таблицы.
Иногда таблицы бывают очень большими и не очень удобно просматривать все строки таблицы и искать нужные значения. Иногда нам нужно специально наложить условие на выборку данных из таблицы, чтобы получить только нужные строки. Поэтому нам следует научиться делать выборку данных с условиями.
Для того чтобы наложить условие на выборку данных используется клаузула WHERE. Или предикат WHERE, кстати, более правильно использовать термин клаузула. Клаузула или предикат – это уточняющая фраза, задавая условие на выборку данных мы делаем уточнение для SQLite3 о том, какие данные мы хотим в итоге получить.
На практике вы редко встретите SQL запрос SELECT без WHERE, так как мало кому нужно получать все строки из таблицы базы данных. Чаще нужно наложить условие при помощи WHERE и сделать выборку с условием. Клаузула или предикат WHERE используются после имени таблицы в предложение, которое осуществляет выборку данных, то есть все условия выборки данных мы задаем только после того, как указали объект базы данных и столбцы, значения которых мы хотим получить.
WHERE и SELECT используются вместе, но не было бы никакого смысла использовать WHERE, если бы мы не могли задать логику условия. Логика условия задается при помощи SQL операторов. Причем SQL операторы могут быть, как операторами сравнения, так и логическими операторами. Кстати, не забывайте о том, что сравнение значений в SQLite бывает трех видов и от выбранного сравнения зависят результаты работы выборки данных с условиями, так как SQLite сравнивает значение, заданное в условие, со значениями, которые хранятся в таблице.
Мы довольно подробно на словах описали комбинацию WHERE и SELECT, но слова словами, а примеры осуществления выборки данных с условием будут намного нагляднее и понятнее, чем слова. Поэтому давайте скомбинируем WHERE и SELECT, чтобы понять как работают условия при выборке данных. Для начала создадим таблицу в базе данных, для этого у нас есть команда CREATE:
[php]
CREATE TABLE table1 (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
pro TEXT NOT NULL,
sex TEXT NOT NULL,
sal REAL CHECK (sal > 15000)
);
[/php]
Мы создали простую таблицу в базе данных с четырьмя столбцами, чтобы приблизить условия к боевым, мы побеспокоились об обеспечение целостности данных в базах данных, задав ограничения уровня столбца и ограничения уровня таблицы. Для тех кто не помнит, напомним, что ограничение первичного ключа PRIMARY KEY является ограничением уровня таблицы. А также мы задали аффинированный тип данных для столбца, чтобы SQLite знала о том, как сравнивать данные в базе данных. Теперь добавим данные в таблицу базы данных при помощи команды INSERT:
[php]
INSERT INTO table1 (name, pro,sex, sal)
VALUES (‘ПупкинМатвей’, 'Дантист', ‘м’, 55000.00);
INSERT INTO table1 (name, pro,sex, sal)
VALUES (‘CумкинДенис’, 'Юрист', ‘м’, 35040.90);
INSERT INTO table1 (name, pro,sex, sal)
VALUES (‘ИванИванов’, 'Младшийюрист', ‘м’, 15000.00);
INSERT INTO table1 (name, pro,sex, sal)
VALUES (‘Ирина Маркова’, 'Бухгалтер', ‘ж’, 31200.10);
INSERT INTO table1 (name, pro,sex, sal)
VALUES (‘Алина Петрова’, 'Менеджер продаж', ‘ж’, 21200.10);
INSERT INTO table1 (name, pro,sex, sal)
VALUES (‘Любовь Михайлова’, 'Секретарь', ‘ж’, 16200.10);
INSERT INTO table1 (name, pro,sex, sal)
VALUES (‘Инна Сидорова’, 'Руководитель отдела обслуживания', ‘ж’, 66200.10);
[/php]
Допустим нам необходимо получить данные обо всех женщина, которые работают в компании. Давайте сделаем выборку данных из таблицы table1 с условием, скомбинировав WHERE и SELECT:
[php]
SELECT id, name, sex FROM table1
WHERE sex = 'ж';
id name sex
3 Ирина Маркова ж
4 Алина Петрова ж
5 Любовь Михайлова ж
6 Инна Сидорова ж
[/php]
В результате выборки данных мы получили не все строки из таблицы, а только те строки, в которых хранится информация о женщинах, добились мы этого за счет наложения условия на выборку данных. Мы просто взяли и скомбинировали WHERE и SELECT.
Конечно, условия выборки данных могут быть более сложными и, соответственно, более точными. Поэтому WHERE позволяет для составления сложных условий на выборку использовать SQL операторы.
Давайте усложним условие выборки данных при помощи SQL операторов и посмотрим, как еще более точно мы можем получать строки из таблицы, комбинируя WHERE и SELECT.
[php]
SELECT id, name, sex, sal FROM table1
WHERE sex = 'ж' AND sal > 30000;
id name sex sal
3 Ирина Маркова ж 31200.1
6 Инна Сидорова ж 66200.1
[/php]
Обратите внимание: мы задали два условия на выборку данных, воспользовавшись предикатом WHERE. Так же стоит отметить, что тип данных (в SQLite это класс данных), который хранится в столбце, должен совпадать с типом данных значения, которое задается в условии. В нашем случае мы сделали не совсем корректно, и выборка сработала только лишь потому, что SQLite–это СУБД с динамической типизацией данных.
Стоит пояснить то, в чем мы допустили неточность: в качестве значение сравнения мы указали 30000 – это число с классом данных INTEGER, а аффинированный тип данных столбца sal – REAL. Нам стоило записать 30000, как 30000.00.
Так же заметим, что некоторые СУБД требуют от разработчика того, чтобы он использовал для условия WHERE только те столбцы, которые он перечислил для выборки, в случае с SQLite можно использовать любые столбцы таблицы в условии WHERE, например:
[php]
SELECT id, name, sal FROM table1
WHERE sex = 'ж' ;
id name sal
3 Ирина Маркова 31200.1
4 Алина Петрова 21200.1
5 Любовь Михайлова 16200.1
6 Инна Сидорова 66200.1
[/php]
В данном случае мы не получали данные из столбца sex, но условие WHERE работает со значениями данного столбца, сравнивая их с заданным. Вот так мы можем комбинировать WHERE, SELECTи SQL операторы, чтобы создавать сложные условия выборки данных.
Предикат или клаузула WHERE может быть использована вместе с другими SQL командами для того, чтобы задать какие-то условия. В базах данных SQLite3 мы не можем использовать WHERE с командами определения доступа к данным, так как их нет в SQLite. Так же мы не берем в расчет команды управления транзакциями, так как внутри транзакции могут быть любые SQL запросы.
Использование условия WHERE с командами определения данных:
Использование условия WHERE с командами манипуляции данными:
Мы рассмотрели реализацию выборки данных из базы данных с условием и посмотрели на примерах, как можно комбинировать условие WHERE и SELECT.
Насколько сложными могут быть условия WHERE и от чего это всё зависит?
Владислав, условия клаузулы WHERE могут быть на самом деле очень сложными. Вот синтаксис из документации SQLite3, в котором показано насколько сложным может быть условие WHERE. Плюс к этому добавьте, что после WHERE можно сделать вложенный запрос. А зависит это: 1) от возможностей СУБД, всё-таки каждая метла по своему метет; 2) и от ваших потребностей и хотелок или от потребностей вашего заказчика/клиента. Исходя из второго пункта, нужно выбирать под первый пункт