Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Выборка из БД определённых данных.


Автор: savmp 25.1.2012, 20:01
Здравствуйте!

ЕСТЬ база данных и 2 поля в ней

ID и DATE
1      Y-3784
2      Y-5674
3      N-7908
4      Y-4672
5      N-5637
6      Y-5634
7      N-6676

ПОДСКАЖИТЕ как задать запрос к базе данных
который бы мне вытащил все строки где начало строки начинается с буквы Y

После чего я буду использовать цыкл.

Большое вам спасибо!

Автор: $дмитрий 25.1.2012, 20:13
Код

SELECT * FROM `table` WHERE `DATA` LIKE 'Y%'

Автор: Gold Dragon 26.1.2012, 07:30
или так
Код

SELECT * FROM `table` WHERE `DATA` REGEXP "^Y"


Если нужно учитывать регистр, то можно так
Код

SELECT * FROM `table` WHERE `DATA` LIKE BINARY 'Y%'

или 
Код

SELECT * FROM `table` WHERE `DATA` REGEXP "^[Y]"

или 
Код

SELECT * FROM `table` WHERE `DATA` REGEXP BINARY "^Y"

Автор: savmp 26.1.2012, 16:05
А КАК СДЕЛАТЬ ТАКОЕ

ID   DATA_A   DATA_A   DATA_A   NAME 

1     Y-9890    Y-1178    N-0390   ФИРИА-1
2                    Y-7878    N-6350   ФИРИА-2
3     N-9090                   N-3390   ФИРИА-3
4     Y-7800    N-2333                  ФИРИА-4
5                                    Y-8909   ФИРИА-5


то есть в одной строке есть 3 столбца DATA_A   DATA_A   DATA_A
Нужно вытягивать строки где начало начинается на Y
результат должен быть таким

1   Y-9890   ФИРИА-1
1   Y-1178   ФИРИА-1
2   Y-7878   ФИРИА-2
4   Y-7800   ФИРИА-4
5   Y-8909   ФИРИА-5

СПАИБО

Автор: $дмитрий 26.1.2012, 18:00
Перечисли условия через OR

Автор: savmp 26.1.2012, 18:40
Цитата($дмитрий @ 26.1.2012,  18:00)
Перечисли условия через OR

ПОДСКАЖИ КАК??? Я все варианты перепробовал... но в цыкле ничего не получается.

Автор: Valinur 26.1.2012, 19:08
Как минимум 3 столбца не могут иметь одинаковое имя, пусть будут ID   DATA_A1   DATA_A2   DATA_A3   NAME 

Тогда запрос
Код

SELECT id, data_a1 as data_a, name FROM table WHERE data_a1 LIKE 'Y%'
UNION
SELECT id, data_a2 as data_a, name FROM table WHERE data_a2 LIKE 'Y%'
UNION
SELECT id, data_a3 as data_a, name FROM table WHERE data_a3 LIKE 'Y%'

Это на самом деле худший вариант, т.к. всю таблицу движку придется пройти 3 раза.

Автор: Gold Dragon 26.1.2012, 19:42
Цитата(savmp @  26.1.2012,  19:40 Найти цитируемый пост)
цыкле
цикле  smile 

Автор: skyboy 27.1.2012, 15:36
Цитата($дмитрий @  25.1.2012,  19:13 Найти цитируемый пост)
LIKE 

Цитата(Gold Dragon @  26.1.2012,  06:30 Найти цитируемый пост)
REGEXP 

ребят, вы чего? а слабо использовать substr?

Автор: krundetz 27.1.2012, 15:53
Цитата(savmp @  26.1.2012,  18:40 Найти цитируемый пост)
Я все варианты перепробовал... но в цыкле ничего не получается. 

во многих ваших темах вижу такое высказывание, но ни разу ни видел вариантов

Автор: $дмитрий 27.1.2012, 16:29
skyboy, совершенно не слабо, думаешь прирост скорости существенней будет?

Автор: skyboy 27.1.2012, 17:27
Цитата($дмитрий @  27.1.2012,  15:29 Найти цитируемый пост)
думаешь прирост скорости существенней будет? 

не в этом случае. оптимизатор "LIKE 'Y%'" преобразует в эквивалент с подстрокой.
но зачем предлагать использование LIKE/REGEXP в этом случае?
чтоб следующим вопросом было "а почему у меня на 1000 строк тормозит LIKE a%b%?"?

Автор: $дмитрий 27.1.2012, 21:00
Тесты дают интересные результаты

10 000 строк. Где NAME - поле с случайным набор [a-Z0-9]{6}, CHAR - символ от A до Z
Код

SELECT SQL_NO_CACHE * FROM `test` WHERE `NAME` LIKE 'CHAR%' ~0.007 сек.
SELECT SQL_NO_CACHE * FROM `test` WHERE 'CHAR' = SUBSTR(NAME, 1, 1); ~0.008 сек.
SELECT SQL_NO_CACHE * FROM `test` WHERE `NAME` REGEXP '^CHAR' ~0.011 сек.

При 100, 1000 строк картина та же

Автор: Zloxa 27.1.2012, 23:39
Цитата(skyboy @  27.1.2012,  15:36 Найти цитируемый пост)
ребят, вы чего? а слабо использовать substr? а слабо... 

Цитата(skyboy @  27.1.2012,  17:27 Найти цитируемый пост)
зачем предлагать использование LIKE/REGEXP в этом случае?


Я поначалу думал ты прикалываешься. smile 

Вариант с лайк - единственный из предложенных, который допускает использование индекса. А потому он единственный - не извращенный.  smile 

$дмитрий, если уж взялся за тайминги, можешь показать результат отбора по индексированному набору с высокой селективностью? И не на тыще записей, а хотя бы на полумиллионе, тысячные секунды слишком уж близки к погрешности измерения.

Добавлено @ 23:54
Оракл, миллион случайных буквенных строк длинной 100 символов, с индексом
Код

set echo on
set timing on
select count(*) from  test where substr(val,1,2)= 'fo';
 
  COUNT(*)
----------
       386
 
Executed in 1.046 seconds
select count(*) from  test where regexp_like(val, '^fo');
 
  COUNT(*)
----------
       386
 
Executed in 10.234 seconds
select count(*) from  test where val like 'fo%';
 
  COUNT(*)
----------
       386
 
Executed in 0.625 seconds


Мася, афайк, тоже умеет использовать индекс для отбора по лайку, при условии захвата паттерна с начала строки.

Автор: Zloxa 27.1.2012, 23:58
Чота я сначала опубликовал результат, а потом его сам посмотрел и диву дался...
оказалось я индекс не построил.  smile 
Вот результат с индексом:
Код

set echo on
set timing on
select count(*) from  test where substr(val,1,2)= 'fo';
 
  COUNT(*)
----------
       386
 
Executed in 1.125 seconds
select count(*) from  test where regexp_like(val, '^fo');
 
  COUNT(*)
----------
       386
 
Executed in 10.125 seconds
select count(*) from  test where val like 'fo%';
 
  COUNT(*)
----------
       386
 
Executed in 0.063 seconds

Автор: $дмитрий 28.1.2012, 03:59
1 000 000 строк

Перебор от A до Z, без индексов
LIKE   20.586
SUBSTR 24.132
REGEXP 34.003

Перебор от A до Z, с индексами
LIKE   1.338
SUBSTR 22.806
REGEXP 31.605

Один запрос, без индексов
LIKE   0.809
SUBSTR 1.053
REGEXP 1.263

Один запрос, с индексами
LIKE   0.079
SUBSTR 0.862
REGEXP 1.173

Автор: Gold Dragon 28.1.2012, 09:57
Цитата(skyboy @  27.1.2012,  18:27 Найти цитируемый пост)
но зачем предлагать использование LIKE/REGEXP в этом случае?
ну вообще-тоне предлагал, а написал какие ещё варианты есть.

И после $дмитрия видны даже результаты что и когда использовать smile


пусть человек получит больше на свой вопрос, чем сухой один ответ ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)