Для выборки каких-то определенных значений из базы данных используется команда SELECT.
Предположим, что у нас есть таблица users пользователей какого-нибудь форума:
id__name______password___mail_________________icq_________status___banned__city
1___Ctulhu____ftang_______rlaih@somewhere.net___131313133______2________0__rlaih
2___Sotona____legion______hell@microsoft.com____666666666______1________1__hell
3___Medved___Preved!_____medved@mail.ru______107102_________1________0__Bobryisk
4___Kreved____mozgii!____kreved@mail.ru________456773254______1________0__Bobryisk
5___Pelodko___qwerty_____pelodko@mail.ru_______985763414______3________1__Bobryisk
Вот такая кривая шизанутая таблица. ID порядковый номер пользователя. С полями name, passwor, mail и icq, я думаю, все и так ясно. Status 2 админ, 3 - мандатр, 1 простой пользователь. Banned 1 юзер в бане, 0 недоработка модераторов.
SELECT * FROM users
Этот запрос вернет нам всю таблицу. * означает, что из таблицы будут выбраны значения всех полей от id до banned без исключения.
Чтобы выбрать из таблицы только определенные поля, необходимо перечислить их значения после SELECT, например:
SELECT name, password, mail FROM users
И на выходе получим это:
Ctulhu____ftang______rlaih@somewhere.net
Sotona____legion_____hell@microsoft.com_
Medved___Preved!____medved@mail.ru___
Kreved____mozgii!____kreved@mail.ru____
Pelodko___qwerty_____pelodko@mail.ru___
Однако в этом случае записи выводятся в том порядке, в каком они находятся в БД. Предположим, что нам надо вывести пользователей в алфавитном порядке.
SELECT * FROM users ORDER BY name ASC
ORDER BY указывает, по какому полю необходимо сортировать данные. ASC указывает на то, что записи должны идти в порядке возрастания(от A до Z в случае с текстом, а не числами). DESC указывает на то, что записи должны быть выстроены по убыванию значений указанного поля.
SELECT * FROM users ORDER BY id DESC
Этот запрос выведет всех пользователей в порядке убывания их id.
Может понадобиться вывести данные только по одному пользователю. Например нам известно его имя Sotona, и надо узнать его мыло.
SELECT mail FROM users WHERE name = Sotona
Числовые значения пишутся без кавычек, а строки и текст берутся в кавычки!
Этот запрос выбирает запись, в которой поле(в данном случае name) имеет определенное значение. В данном случае нам будет возвращена всего лишь одна запись. Но что было бы, если бы в БД было бы несколько пользователей с одинаковыми именами?
Это можно рассмотреть на другом примере. Предположим, нам надо выбрать из БД имена незабаненных пользователей:
SELECT name FROM users WHERE banned = 0
И получим:
Ctulhu
Medved
Kreved
То есть нам будут возвращены все записи, в которых значение поля banned равно 0.
Теперь попробуем составить запрос, чтобы узнать, пользователи из каких городов зарегистрированы на форуме.
SELECT city FROM users
И получим:
rlaih
hell
Bobryisk
Bobryisk
Bobryisk
Но нафига нам три раза название одного и того же города? Повторения надо исключить с помощью команды DISTINCT.
SELECT DISTINCT city FROM users
Вот теперь все будет розово и пушисто. Мы получим:
rlaih
hell
Bobryisk
Если же делать выборку не по одному, а по нескольким полям, то DISTINCT будет исключать из результата только те дубликаты, в которых значения всех полей идентичны с какой-либо предыдущей записью.
Теперь вернемся к WHERE. Может понадобиться сделать поиск по значениям нескольких полей. Например, выбрать незабаненных пользователей из Бобруйска. Делается это так:
SELECT * FROM users WHERE banned = 0 AND city = Bobryisk
3___Medved___Preved!_____medved@mail.ru______107102_________1________0__Bobryisk
4___Kreved____mozgii!____kreved@mail.ru________456773254______1________0__Bobryisk
AND это такое логическое И. Если в записи оба условия верны(пользователь не в бане И из Бобруйска), то запись идет на выход.
А может понадобиться выбрать из БД админов и тех кто в бане(не, ну я уже реально задрался эти идиотские запросы придумывать Ну кому может понадобиться выбирать из БД админов и тех кто в бане? Только больному. Или хакеру. Больному хакеру. Нормальный хакер такой херней страдать не будет. Ему обычно хеши пассов нужны)
SELECT * FROM users WHERE status = 2 OR banned = 1
Получай фашист гранату:
1___Ctulhu____ftang_______rlaih@somewhere.net___131313133______2________0__rlaih
2___Sotona____legion______hell@microsoft.com____666666666______1________1__hell
5___Pelodko___qwerty_____pelodko@mail.ru_______985763414______3________1__Bobryisk
OR дествует как логическое ИЛИ. Если хотя бы одно из условий верно, то запись идет на выход.
Короче, теперь нормальный запрос. Ты хакер, и тебе надо спереть имена и пассы админа и мандатров. Фкурил?
SELECT name, password FROM users WHERE status IN (2,3)
Конечно, вместо IN можно было бы употребить конструкцию типа status = 2 OR status = 3, но IN удобнее, не находишь? Он выберет те записи, в которых значение указанного поля(status в данном случае) совпадает с одним из значений в скобках. А можно еще заюзать NOT IN. По аналогии, он будет выбирать записи только с таким значением указанного поля, которое не соответствует ни одному из значений в скобках.
А может быть и так, что тебе надо спереть пасс у конкретного юзера. Или даже у двух. Так вот, на случай двух, трех и более зайцев. Неправда, что их нельзя одним выстрелом убить. Еще как можно. Для этого есть UNION.
SELECT password FROM users WHERE name = Ctulhu UNION SELECT password FROM users WHERE name = Pelodko
UNION автоматом исключает одинаковые записи(как DISTINCT). Если тебе этого не надо, юзай UNION ALL
UNION позволяет объединять только записи/куски записей с одинаковой структурой. Например, запрос типа SELECT city FROM users WHERE name = Ctulhu UNION SELECT id FROM users WHERE name = Pelodko не пройдет, так как city строка, а id число и объединить их в один столбец таблицы, которая будет выводиться, никак нельзя.
Друзья: Всё для вебмастера | [ Реклама на форуме ] |
[ DDos Услуги. DDos атака. Заказать ДДос ] |
0
Использование команды SELECT в БД
Автор
V!r2( )zZ
, 07 Aug 2007 18:47
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных