Выбрать всех пользователей
SELECT * FROM jos_users
Показать все опубликованные статьи:
SELECT * FROM jos_content
WHERE state = '1'
Показать всех пользователей кроме "admin"
SELECT * FROM jos_users
WHERE username <> 'admin'
В предыдущих выражениях знак звездочки (*) обозначает показывать все столбцы. Теперь если мы хотим показать только email пользователей, выражение будет выглядеть так:
SELECT name, email FROM jos_users
Показать заголовки только опубликованных разделов
SELECT title FROM jos_sections
WHERE published = 1
Примечание: Указывать (*) несомненно удобно, но на практике запросы начинают использовать больше оперативной памяти, и как следствие производительность начинает падать. Выбирайте только необходимые данные, это упростит вам жизнь в дальнейшем.
Сортировка данных в MySQL
Для того чтобы выводить данные в определенном порядке, а не в том как они лежат в базе данных, используем конструкцию "ORDER BY", например сортировка id по возрастанию
SELECT * FROM jos_content
WHERE state ='1'
ORDER BY id ASC
или по убыванию id
SELECT * FROM jos_content
WHERE state ='1'
ORDER BY id DESC
так же никто не мешает сделать несколько сортировок (в порядке убывания приоритета)
SELECT * FROM jos_categories
ORDER BY published ASC, section ASC, id DESC
Ограничение вывода
Выведем 10 строк из таблицы jos_content
SELECT * FROM jos_content
LIMIT 0, 10
Для того чтобы чтобы выбрать начиная с 5 записи следующие 20, пишем следующее
SELECT * FROM jos_content
LIMIT 5, 20
Логические операторы SQL
MySQL поддерживает логические операторы, например выберем все материалы, старше 20 сентября 2008 года:
SELECT * FROM jos_content
WHERE state = '1'
AND created < '2008-09-20 00:00:00'
Усложним выбор несколькими условиями, кол-во просмотров не более чем 2000 и не меньше 1000:
SELECT * FROM jos_content
WHERE state = '1'
AND hits > '1000'
AND hits < '2000'
AND created < '2008-09-20 00:00:00'
И по традиции можно использовать скобки, чтобы явно указать приоритет среди сравнений:
SELECT * FROM jos_content
WHERE (sectionid = '5' OR sectionid = '6')
AND created < '2009-08-20 00:00:00'
ORDER BY created DESC
LIMIT 0, 10
Работа с текстом в MySQL
До этого мы оперировали только с числовыми типами данных, теперь попробуем с текстом. Из всех пользователей найдем только тех, имя которых начинаются на "a".
SELECT username
FROM jos_users
WHERE username LIKE 'a%'
Или заканчиваются на "о"
SELECT id,email,usertype
FROM jos_users
WHERE username LIKE '%о'
Функции MySQL
Кроме того есть набор встроенных в MySQL функций. Названия говорят сами за себя
SELECT AVG(hits) FROM jos_content
SELECT COUNT(*) FROM jos_content
SELECT MAX(hits) FROM jos_content
SELECT SUM(hits) FROM jos_content
К тому же эти функции можно использовать вместе с группировкой. Подсчитаем кол-во хитов для каждого из раздела, упорядочим по убыванию
SELECT sectionid, SUM(hits) AS hits.
FROM jos_content
GROUP BY sectionid
ORDER BY hits DESC
Вложенные запросы SQL
Допустим мы хотим использовать в своем запросе поле, которое определено в другой таблице. Например выберем все страницы, которые не выведены на главную
SELECT id, name
FROM jos_content
WHERE id NOT IN (SELECT content_id FROM jos_content_frontpage)
Объединения в MySQL
Применяются объединения когда нужно использовать данные более чем из одной таблицы. Выборка имени материала с категорией, таблицы объединены по соответствующим id. Чтобы избежать двусмысленности мы приписываем названия таблиц к имени поля через точку.
SELECT jos_categories.title, jos_content.title
FROM jos_content
JOIN jos_categories ON jos_content.catid = jos_categories.id
ORDER BY jos_categories.id
Дополнительно используем таблицу с jos_users, чтобы узнать имя автора материала.
SELECT jos_categories.title, jos_content.title, jos_users.username
FROM jos_content
JOIN jos_categories ON jos_content.catid = jos_categories.id
JOIN jos_users ON jos_content.created_by = jos_users.id
ORDER BY jos_categories.id
Теперь используем все накопленные знания в одном примере
view sourceprint?
SELECT jos_categories.title, jos_content.title, jos_users.username
FROM jos_content
JOIN jos_categories ON jos_content.catid = jos_categories.id
JOIN jos_users ON jos_content.created_by = jos_users.id
WHERE jos_content.state = '1'
AND jos_content.hits > '10'
AND jos_content.id NOT IN (SELECT content_id FROM jos_content_frontpage)
ORDER BY jos_categories.id