Перейти к содержимому

 Друзья: Всё для вебмастера | [ Реклама на форуме ]


Rutor
Rutor


[ DDos Услуги. DDos атака. Заказать ДДос ]


Использование команды SELECT в БД


  • Авторизуйтесь для ответа в теме
В теме одно сообщение

#1
V!r2( )zZ

V!r2( )zZ

    Бит

  • Members
  • 7 сообщений
Для выборки каких-то определенных значений из базы данных используется команда 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  число и объединить их в один столбец таблицы, которая будет выводиться, никак нельзя.

#2
AFoST

AFoST

    тапочег с вишней

  • Moderator
  • PipPip
  • 256 сообщений
Добавлю инфу о полезной функции concat.
Это удобно использовать в sql-inj, результат следующих 2х запросов на экране будет отображаться идентично:
SELECT id,":",name from users
SELECT concat(id,":",name),NULL,NULL from users


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных