О строковых функциях SQL или как манипулировать текстом в базе данных MySQL
Здравствуйте, уважаемые читатели блога webcodius.ru. Сегодня я хотел бы поговорить о языке SQL, а в частности о функциях для обработки текста. Для создания и управления сайтом часто бывает не обязательно знание языка SQL. Системы управления контентом позволяют редактировать контент сайта без написания запросов. Но хотя бы поверхностное знакомство с структурированным языком запросов поможет вам значительно ускорить модификацию и управление данными в базе данных вашего сайта.
Передо мной частенько возникают задачи: удалить часть текста из текстовых полей базы данных, объединить строковые данные или еще что-нибудь связанное с текстом. Делать все это через админские панели сайтов очень неудобно и муторно. Гораздо проще бывает написать запрос к базе данных выполняющий все эти действия за пару секунд.
Символьные функции в языке sql
Начнем по порядку с самого простого. Первой рассмотрим строковую функцию ASCII, которая используется для определения ASCII-кода текстовых символов:
integer ASCII(str string)
Функция возвращает целое значение — ASCII-код первого левого символа строки str. В случае если строка str пустая возвращает 0 и NULL если строка str не существует.
SELECT ASCII ('t');
Результат: 116
SELECT ASCII ('test');
Результат: 116
SELECT ASCII (1);
Результат: 49
Далее функция ORD, которая также определяет ASCII- код символов, но может обрабатывать также многобайтовые символы:
integer ORD(str string)
Если первый левый символ строки str многобайтовый, то возвращает его код в формате: ((первый байт ASCII- код)*256+(второй байт ASCII -код))[*256+третий байт ASCII -код. ]. В случае если первый левый символ строки str не является многобайтовым, работает как функция ASCII — возвращает его ASCII-код.
SELECT ORD ('test');
Результат: 116
Функция CHAR, тесно связанная с функцией ASCII и выполняет обратное действие:
string CHAR(int integer, . )
Функция CHAR возвращает строку символов по их ASCII-кодам. Если среди значений встречается значение NULL, то оно пропускается.
SELECT CHAR ( 116, '101', 115, '116' );
Результат: 'test'
SQL функции для объединения строк
Одна из самых популярных категорий функций. Ведь частенько бывает нужно объединить значения нескольких полей таблиц базы данных сайта. В языке SQL есть сразу несколько функций для конкатенации строк.
string CONCAT(str1 string, str2 string. )
Функция возвращает строку, созданную путем объединения аргументов. Можно указывать более двух аргументов. Если один из аргументов является NULL, то и возвращаемый результат будет NULL. Числовые значения преобразуются в строку.
SELECT CONCAT ('Hello', ' ', 'world', '!');
Результат: 'Hello world!'
SELECT CONCAT ('Hello', NULL, 'world', '!');
Результат: NULL
SELECT CONCAT ('Число пи', '=', 3.14);
Результат: 'Число пи=3.14'
Как видно из примеров, строки объединяются без разделителей. Для того чтобы разделить слова в первом примере в качестве аргумента приходится использовать пробел. Если бы слов было больше, то каждый раз вставлять пробелы было бы не очень удобно.
Для таких случаев существует функция CONCAT_WS:
string CONCAT_WS(separator string, str1 string, str2 string. )
Функция объединяет строки как и функция CONCAT, но вставляет между аргументами разделитель separator. В случае если аргумент separator является NULL, то и результат будет NULL. Аргументы строки равные NULL пропускаются.
SELECT CONCAT_WS (' ', 'Иванов', 'Иван', 'Иванович');
Результат: 'Иванов Иван Иванович'
SELECT CONCAT_WS (NULL, 'Иванов', 'Иван', 'Иванович');
Результат: NULL
SELECT CONCAT_WS (' ', 'Иванов', NULL, 'Иван', 'Иванович');
Результат: ''Иванов Иван Иванович'
В случае объединения большого количества строк, которые необходимо отделять разделителем, функция CONCAT_WS гораздо удобнее функции CONCAT.
Иногда бывает необходимо удлинить строку до определенного количества символов за счет повторения какого-либо символа. Это тоже своего рода объединение строк. Для этого можно использовать функции LPAD и RPAD. Функции имеют следующий синтаксис:
string LPAD(str string, len integer, padstr string)
string RPAD(str string, len integer, padstr string)
Функция LPAD возвращает строку str дополненную слева строкой padstr до длины len. Функция RPAD выполняет тоже самое, только удлинение происходит с правой стороны.
SELECT LPAD ('test', 10, '.');
Результат: . test
SELECT RPAD ('test', 10, '.');
Результат: test.
В данных функциях необходимо обратить внимание на параметр len, который ограничивает количество выводимых символов. Поэтому если длина строки str будет больше чем параметр len, то строка будет обрезана:
SELECT LPAD ('test', 3, '.');
Результат: tes
Определение длины строки в sql запросах
Для определения количества символов в строке в языке SQL отвечает функция LENGTH — длина строки:
integer LENGTH(str string)
Функция возвращает целое число равное количеству символов в строке str.
SELECT LENGTH ('test');
Результат: 4
В случае использования многобайтовых кодировок функция LENGTH выдает не правильный результат. Например в случае если задана кодировка unicode, то запрос:
SELECT LENGTH ('тест');
вернет 8. Что, легко заметить, в два раза больше реального количества символов. В этом случае нужно использовать функцию CHAR_LENGTH:
integer CHAR_LENGTH(str string)
Функция также возвращает длину строки str и поддерживает многобайтовые символы.
SELECT CHAR_LENGTH ('тест');
Результат: 4
Поиск подстроки в строке средствами sql
Для вычисления позиции подстроки в строке в языке sql существует несколько функций. Первая, которую мы рассмотрим, функция POSITION:
integer POSITION(substr string IN str string)
Возвращает номер позиции первого вхождения подстроки substr в строке str и возвращает 0 если подстрока не найдена. Функция POSITION может работать с многобайтовыми символами.
SELECT POSITION ('cd' IN 'abcdcde');
Результат: 3
SELECT POSITION ('xy' IN 'abcdcde');
Результат: 0
Следующая функция LOCATE позволяет начинать поиск подстроки с определенной позиции:
integer LOCATE(substr string, str string, pos integer)
Возвращает позицию первого вхождения подстроки substr в строке str, начиная с позиции pos. Если параметр pos не задан, то поиск осуществляется с начала строки. Если подстрока substr не найдена, то возвращает 0. Поддерживает многобайтовые символы.
SELECT LOCATE ('cd', 'abcdcdde', 5);
Результат: 5
SELECT LOCATE ('cd', 'abcdcdde');
Результат: 3
Аналогом функций POSITION и LOCATE является функция INSTR:
integer INSTR(str string, substr string)
Также как и функции выше возвращает позицию первого вхождения подстроки substr в строке str. Единственное отличие от функций POSITION и LOCATE то, что аргументы поменяны местами.
Далее рассмотрим функции, которые помогают получить подстроку.
Первыми рассмотрим сразу две функции LEFT и RIGHT, которые похожи по своему действию:
string LEFT(str string, len integer)
string RIGHT(str string, len integer)
Функция LEFT возвращает len первых символов из строки str, а функция RIGHT столько же последних. Поддерживают многобайтовые символы.
SELECT LEFT ('Москва', 3);
Результат: Мос
SELECT RIGHT ('Москва', 3);
Результат: ква
Далее рассмотрим одинаковые по итоговому результату функции SUBSTRING и MID:
string SUBSTRING(str string, pos integer, len integer)
string MID(str string, pos integer, len integer)
Функции позволяют получить подстроку строки str длиною len символов с позиции pos. В случае если параметр len не задан, то возвращается вся подстрока начиная с позиции pos.
SELECT SUBSTRING ('г. Москва — столица России', 4, 6);
Результат: Москва
SELECT SUBSTRING ('г. Москва — столица России', 4);
Результат: Москва — столица России
Примеры с функцией MID не привожу, потому что результаты будут аналогичные.
Интересная функция SUBSTRING_INDEX:
string SUBSTRING_INDEX(str string, delim string, count integer)
Функция возвращает подстроку строки str, полученную путем удаления символов, идущих после разделителя delim, находящимся в позиции count. Параметр count может быть как положительным, так отрицательным. Если count положительный, то отсчет позиции разделителя будет вестись слева и удаляться будут символы находящиеся справа от разделителя. Если count отрицательный, то отсчет позиции разделителя ведется справа и удаляются символы находящиеся слева от разделителя. Возможно, описание получилось слишком запутанным, но на примерах станет понятней.
SELECT SUBSTRING_INDEX ('www.mysql.ru', '.', 1);
Результат: www
В данном примере функция находит, первое вхождения символа точки в строке «www.mysql.ru» и удаляет все символы, идущие после нее, включая сам разделитель.
SELECT SUBSTRING_INDEX ('www.mysql.ru', '.', 2);
Результат: www.mysql
Здесь функция ищет второе вхождение точки, удаляет все символы справа от нее и возвращает получившуюся подстроку. И еще один пример с отрицательным значением параметра count:
SELECT SUBSTRING_INDEX ('www.mysql.ru', '.', -2);
Результат: mysql.ru
В этом примере функция SUBSTRING_INDEX ищет вторую точку, отсчитывая позицию справа, удаляет символы слева от нее и выдает полученную подстроку.
Удаление пробелов из строки
Для удаления лишних пробелов из начала и конца строки в языке SQL есть три функции.
string LTRIM(str string)
Удаляет с начала строки str пробелы и возвращает результат.
string RTRIM(str string)
Также удаляет пробелы из строки str, только с конца. Обе функции поддерживают многобайтовые символы.
SELECT LTRIM (' текст ');
Результат: 'текст '
SELECT RTRIM (' текст ');
Результат: ' текст'
И третья функция TRIM позволяет сразу удалять пробелы из начала и из конца строки:
string TRIM([[BOTH | LEADING | TRAILING] [remstr] string FROM] str string)
Параметр str обязательный, остальные параметры не обязательные. В случае если задан только один параметр str, то возвращает строку str удалив пробелы из начала и конца строки одновременно.
SELECT TRIM (' текст ');
Результат: 'текст'
С помощью пара метра remstr можно задавать символы или подстроки, которые будут удаляться из начала и конца строки. С помощью управляющих параметров BOTH, LEADING, TRAILING можно задавать откуда будут удаляться символы:
- BOTH — удаляет подстроку remstr с начала и с конца строки;
- LEADING — удаляет remstr с начала строки;
- TRAILING — удаляет remstr с конца строки.
SELECT TRIM (BOTH 'а' FROM 'текст');
Результат: 'текст'
SELECT TRIM (LEADING 'а' FROM 'текстааа');
Результат: 'текстааа'
SELECT TRIM (TRAILING 'а' FROM 'ааатекст');
Результат: 'ааатекст'
Функция SPACE позволяет получить строку состоящую из определенного количества пробелов:
string SPACE(n integer)
Возвращает строку, которая состоит из n пробелов.
Функция REPLACE нужна для замены заданных символов в строке:
string REPLACE(str string, from_str string, to_str string)
Функция заменяет в строке str все подстроки from_str на to_str и возвращает результат. Поддерживает многобайтные символы.
SELECT REPLACE ( 'замена подстроки', 'подстроки', 'текста' )
Результат: 'замена текста'
string REPEAT(str string, count integer)
Функция возвращает строку, которая состоит из count повторений строки str. Поддерживает многобайтовые символы.
Функция REVERSE переворачивает строку:
string REVERSE(str string)
Переставляет в строке str все символы с последнего на первый и возвращает результат. Поддерживает многобайтовые символы.
SELECT REVERSE ('текст');
Результат: 'тскет'
Функция INSERT для вставки подстроки в строку:
string INSERT(str string, pos integer, len integer, newstr string)
Возвращает строку полученную в результате вставки в строку str подстроки newstr с позиции pos. Параметр len указывает сколько символов будет удалено из строки str, начиная с позиции pos. Поддерживает многобайтовые символы.
SELECT INSERT ('text', 2, 5, 'MySQL');
Результат: 'tMySQL'
'SELECT INSERT ('text', 2, 0, 'MySQL');
Результат: 'tMySQLext'
SELECT INSERT ('вставка текста', 2, 7, 'MySQL');
Результат: 'SELECT INSERT ('вставка текста', 2, 7, 'MySQL');'
Если вдруг понадобиться заеменить в тексте все заглавные буквы на прописные, то можно воспользоваться одной из двух функций:
string LCASE(str string) и string LOWER(str string)
Обе функции заменяют в строке str заглавные буквы на прописные и возвращают результат. И та и другая поддерживают многобайтовые символы.
SELCET LOWER ('АБВГДеЖЗиКЛ');
Результат:'абвгдежзикл'
Если же наоборот необходимо прописные буквы заменить заглавными, то также можно применить одну из двух функцийй:
string UCASE(str string) и string UPPER (str string)
Функции возвращают строку str, заменив все прописные символы на заглавные. Также поддерживают многобайтовые символы.
Пример:
SELECT UPPER ('Абвгдежз');
Результат: 'АБВГДЕЖЗ'
Строковых функций в языке SQL немного больше, чем рассмотрено в данной статье. Но так как даже большинство рассмотренных здесь функций используются редко, я закончу их рассмотрение. В следующих статьях я постараюсь рассмотреть реальные практические примеры использования строковых функций SQL. Поэтому не забудьте подписаться на обновления блога. До новых встреч!
Поиск и замена слов в строках на SQL
Часто в таблицах базы данных требуется произвести поиск и замену слова или подстроки. Для таких действий в SQL есть специальная функция «Replace». Рассмотрим на примерах как она работает в MySQL.
Внимание! При массовой обработке данных в базах данных не забывайте предварительно делать резервную копию.
Допустим, у компании поменялось название и требуется его заменить в таблице «table_name» на новое. Для этого выполняем запрос на обновление поля «field_text» с использованием нашей функции.
В качестве параметров передаём содержимое текущего поля, подстроки для поиска и замены. Секцию «WHERE» можно опустить, но препочтительно чтобы операция «UPDATE» применялась только к тем записям, где предварительно обнаружилась искомая подстрока.
Удаление подстроки из таблицы
Для удаления произвольной подстроки используем ту же функцию, но последний параметр указываем пустым.
Добавление подстрок к полю
Существую случаи когда в начало или конец поля требуется что-то добавить. Например, новое предложение. В этих случая в SQL используют функцию объединения строк — «Concat».
Эту же задачу можно решить и спомощью «Replace». При этом появляется возможность добавлять подстроку в начало поля.
В примере к каждому полю таблицы в начало добавляется подстрока «START!», а в конец — « THE END!».
Приведённые SQL запросы можно выполнять как на PHP, так и через скрипты администрирования, вроде «phpMyAdmin».
SQL Where: способы применения и примеры. SQL Where: способы применения и примеры Способы применения условия Where
В реализациях языка SQL может быть выполнено неявное преобразование типов. Так, например, в T-SQL при сравнении или комбинировании значений типов smallint и int , данные типа smallint неявно преобразуются к типу int . Подробно о явном и неявном преобразовании типов в MS SQL Server можно прочитать в BOL.
Пример. Вывести среднюю цену ПК-блокнотов с предваряющим текстом «средняя цена Нет в наличии».
Список всех моделей ПК с ценами можно получить с помощью запроса:
SELECT DISTINCT product.model, price FROM product LEFT JOIN pc c ON product.model=c.model WHERE product.type=»pc»; |
В результирующем наборе отсутствующая цена будет заменена NULL-значением:
model | price |
1121 | 850 |
1232 | 350 |
1232 | 400 |
1232 | 600 |
1233 | 600 |
1233 | 950 |
1233 | 980 |
1260 | 350 |
2111 | NULL |
2112 | NULL |
Чтобы заменить NULL-значения нужным текстом, можно воспользоваться оператором CASE :
Оператор CASE в зависимости от указанных условий возвращает одно из множества возможных значений. В нашем примере условием является проверка на NULL. Если это условие выполняется, то возвращается текст «Нет в наличии», в противном случае (ELSE ) возвращается значение цены. Здесь есть один принципиальный момент. Поскольку результатом оператора SELECT всегда является таблица, то все значения любого столбца должны иметь один и тот же тип данных (с учетом неявного приведения типов). Поэтому мы не можем наряду с ценой (числовой тип) выводить символьную константу. Вот почему к полю price применяется преобразование типов, чтобы привести его значения к символьному представлению. В результате получим
model | price |
1121 | 850 |
1232 | 350 |
1232 | 400 |
1232 | 600 |
1233 | 600 |
1233 | 950 |
1233 | 980 |
1260 | 350 |
2111 | Нет в наличии |
2112 | Нет в наличии |
Оператор CASE может быть использован в одной из двух синтаксических форм записи:
1-я форма
CASE
WHEN
THEN
…
WHEN
THEN
END
2-я форма
CASE
WHEN
THEN
…
WHEN
THEN
END
Все предложения WHEN должны иметь одинаковую синтаксическую форму, т.е. нельзя смешивать первую и вторую формы. При использовании первой синтаксической формы условие WHEN удовлетворяется, как только значение проверяемого выражения станет равным значению выражения, указанного в предложении WHEN . При использовании второй синтаксической формы условие WHEN удовлетворяется, как только предикат принимает значение TRUE. При удовлетворении условия оператор CASE возвращает значение, указанное в соответствующем предложении THEN . Если ни одно из условий WHEN не выполнилось, то будет использовано значение, указанное в предложении ELSE . При отсутствии ELSE , будет возвращено NULL-значение. Если удовлетворены несколько условий, то будет возвращено значение предложения THEN первого из них.
В приведенном выше примере была использована вторая форма оператора CASE .
Заметим, что для проверки на NULL стандарт предлагает более короткую форму оператора — COALESCE . Этот оператор имеет произвольное число параметров и возвращает значение первого, отличного от NULL. Для двух параметров оператор COALESCE(A, B) эквивалентен следующему оператору CASE :
CASE WHEN A IS NOT NULL THEN A ELSE B END
Решение рассмотренного выше примера при использовании оператора COALESCE можно переписать следующим образом:
Использование первой синтаксической формы оператора CASE можно продемонстрировать на следующем примере : Вывести все имеющиеся модели ПК с указанием цены. Отметить самые дорогие и самые дешевые модели.
SELECT DISTINCT model, price, CASE price WHEN (SELECT MAX(price) FROM pc) THEN «Самый дорогой» WHEN (SELECT MIN(price) FROM pc) THEN «Самый дешевый» ELSE «Средняя цена» END comment FROM pc ORDER BY price; |
В результате выполнения запроса получим
model | price | comment |
1232 | 350 | Самый дешевый |
1260 | 350 | Самый дешевый |
1232 | 400 | Средняя цена |
1233 | 400 | Средняя цена |
1233 | 600 | Средняя цена |
1121 | 850 | Средняя цена |
1233 | 950 | Средняя цена |
1233 | 980 | Самый дорогой |
В большинстве случаев необходимо получать не все записи, а только те, которые соответствуют определенным критериям. Поэтому для осуществления фильтрации выборки в SQL есть специальный оператор WHERE .
1. Простое фильтрование оператором WHERE.
Давайте из нашей таблицы, например, отберем записи, относящиеся только к определенному товару. Для этого мы укажем дополнительный параметр отбора, который будет фильтровать значение по колонке Product .
Пример запроса для отбора текстовых значений:
SELECT * FROM Sumproduct WHERE Product = «Bikes»
Как видим, условие отбора взято в одинарные кавычки, что является обязательным при фильтровании текстовых значений. При фильтровании числовых значений кавычки не нужны.
Пример запроса для отбора числовых значений:
SELECT > 40000 ORDER BY Amount
В этом примере мы отобрали записи, в которых выручка от реализации составила более 40 тыс. $ и, дополнительно, все записи посортировали по возрастанию по полю Amount.
В таблице ниже указан перечень условных операторов, поддерживаемых SQL :
2. Фильтрация по диапазону значений (BETWEEN ).
Для отбора данных, которые лежат в определенном диапазоне, используется оператор BETWEEN . В следующем запросе будут отобраны все значения, лежащие в пределах от 1000 $ в 2000 $ включительно, в поле Amount .
SELECT * FROM Sumproduct WHERE Amount BETWEEN 1000 AND 2000
Очередность сортировки будет зависеть от порядка расположения полей в запросе. То есть, в нашем случае сначала данные будут посортированы по колонке Amount , а затем по City .
3. Выборка пустых записей (IS NULL ).
В SQL существует специальный оператор для выборки пустых записей (називаеьбся NULL ). Пустой записью считается любая ячейка в таблице, в которую не введены какие-либо символы. Если в ячейку введен 0 или пробел , то считается, что поле заполнено.
SELECT * FROM Sumproduct WHERE Amount IS NULL
В примере выше, мы нарочно удалили два значения в поле Amount , чтобы продемонстрировать работу оператора NULL .
4. Расширенное фильтрации (AND, OR ).
Язык SQL не ограничивается фильтрацией по одному условию, для собственных целей вы можете использовать достаточно сложные конструкции для выборки данных одновременно по многим критериям. Для этого в SQL есть дополнительные операторы, которые расширяют возможности оператора WHERE . Такими операторами являются: AND, OR, IN, NOT . Приведем несколько примеров работы данных операторов.
SELECT * FROM Sumproduct WHERE Amount > 40000 AND City = «Toronto»
SELECT * FROM Sumproduct WHERE Month = «April» OR Month = «March»
Давайте объединим операторы AND и OR . Для этого сделаем выборку велосипедов (Bikes ) и коньков (Skates ), которые были проданы в марте (March ).
SELECT * FROM Sumproduct WHERE Product = «Bikes» OR Product = «Skates» AND Month = «March»
Видим, что в нашу выборку попало за много значений (кроме марта (March ), также январь (January ), февраль (February ) и апрель (April )). В чем же причина? А в том, что SQL имеет приоритеты выполнения команд. То есть оператор AND имеет более высокий приоритет, чем оператор OR , поэтому сначала были отобраны записи с коньками, которие проданные в марте, а потом все записи, касающиеся велосипедов.
Итак, чтобы получить правильную выборку, нам нужно изменить приоритеты выполнения команд. Для этого используем скобки , как в математике. Тогда, сначала будут обработаны операторы в скобках, а затем — все остальные.
SELECT * FROM Sumproduct WHERE (Product = «Bikes» OR Product = «Skates» ) AND Month = «March»
5. Расширенная фильтрация (оператор IN ).
SELECT * FROM Sumproduct WHERE ID IN (4, 12, 58, 67)
Оператор IN выполняет ту же функцию, что и OR , однако имеет ряд преимуществ:
- При работе с длинными списками, предложение с IN легче читать;
- Используется меньшее количество операторов, что ускоряет обработку запроса;
- Самое важное преимущество IN в том, что в его конструкции можно использовать дополнительную конструкцию SELECT , что открывает большие возможности для создания сложных подзапросов.
6. Расширенная фильтрация (оператор NOT ).
SELECT * FROM Sumproduct WHERE NOT City IN («Toronto», «Montreal»)
Ключевое слово NOT позволяет убрать ненужные значения из выборки. Также его особенностью является то, что оно проставляется перед названием столбца, участвующего в фильтровании, а не после.
Поиск объектов во всех базах данных сервера
У вас бывало, что нужно найти таблицу чтобы посмотреть данные или структуру, а вы не помните точно в какой БД она находится? У меня, периодически, такое случается. Пример — найти таблицы из проекта пятилетней давности, чтобы посмотреть как тогда решал текущую задачу.
К счастью, есть процедура sp_MSforeachdb , которая позволяет написать такой скрипт довольно компактно:
DECLARE @name AS SYSNAME,
@strSQL AS VARCHAR (MAX )
SET @name = «Hierarchy»
SET @strSQL = «
IF EXISTS(SELECT * FROM . sysobjects WHERE name LIKE » «%» [email protected]+»%» «)
BEGIN
SELECT » «?» » db, name FROM . sysobjects WHERE name LIKE » «%» [email protected]+»%» «
END
»
CREATE TABLE #result (
db SYSNAME,
name SYSNAME,
PRIMARY KEY (db,name))
INSERT #result EXEC sp_MSforeachdb @strSQL
SELECT * FROM #result
DROP TABLE #result
Здесь всё достаточно просто:
- Задаём часть названия, по которому будем искать (в данном случае — Hierarchy).
- Собираем динамический SQL, который ищет по sysobjects (для некоторых старых версий MS SQL можно вместо VARCHAR(MAX) использовать VARCHAR(2000), например).
При этом символ «?» заменится на название БД. - С помощью конструкции INSERT . EXEC сохраняем все результаты во временную таблицу, чтобы отобразить, в итоге, единый результат.
Поиск подстроки в текстах хранимых процедур
Как вы знаете, тексты хранимых процедур, триггеров и представлений можно найти в таблице syscomments .
Чтобы наш предыдущий запрос позволил нам найти упоминание в syscomments некоторой подстроки, его можно переписать следующим образом:
SET @strSQL «?» » as db, o.name FROM [?].dbo.syscomments s
JOIN [?].dbo.sysobjects o ON o.id = s.id WHERE s. LIKE » «%» [email protected]+»%» «»
Обратите внимание на DISTINCT — может пригодиться, потому что иногда для одного объекта бывает несколько записей в syscomments.
Поиск подстроки во всех строковых полях всех таблиц
Такой скрипт здорово помогает спать спокойно после «чистки» базы перед отправкой клиенту. Естественно, этой областью его применение не ограничивается.
Для этого случая помощник в виде процедуры от MS не нашёлся, поэтому пришлось использовать курсоры:
declare @pattern as nvarchar(MAX )
set @pattern = N»%Test%»
set nocount on
declare @sql as nvarchar(MAX )
declare @table as sysname
declare tables cursor local static read_only for select name from sys.tables t where t.is_ms_shipped = 0
open tables
create table #results(name sysname not null , value nvarchar(MAX ) not null )
while @@FETCH_STATUS = 0
begin
set @sql = «»
select @sql = @sql + »
insert into #results select » «» + @table + «.» + name + «» » as name, [» + name + «] from [» + @table + «] where [» + name + «] like » «» + @pattern + «» «»
from sys.columns c where c.object_id = OBJECT_ID(@table ) and c.system_type_id in
(select system_type_id from sys.types where collation_name is not null )
exec (@sql )
fetch next from tables into @table
end
select * from #results
close tables
drop table #results
Помимо курсоров принципы те же. Есть пара нюансов:
- Ищем таблицы без флага is_ms_shipped, чтобы просматривать только таблицы, созданные на этапе разработки.
- Для отбора строковых столбцов вместо списка типов (который поддерживать утомительно) используется фильтр «collation_name is not null».
Резюме
Внимательный читатель наверняка догадался по оформлению, что последний пример написан не в то же время что и два первых. Если быть точнее, последний запрос я написал месяц назад. Это я к тому, что на основе подобного подхода вы можете сами писать полезные скрипты, решающие ваши специфические задачи.
Если такой формат понравится читателям, буду иногда выкладывать полезные скрипты из личной коллекции.
Если у вас есть замечания, пожелания или новые темы – пишите в комментариях,
It is difficult to explain the syntax for the SQL Server WHERE clause, so let»s look at some examples.
We»ll start by looking at how to use the WHERE clause with only a single condition.
SELECT * FROM employees WHERE first_name = «Jane»;
In this SQL Server WHERE clause example, we»ve used the WHERE clause to filter our results from the employees table. The SELECT statement above would return all rows from the employees table where the first_name is «Jane». Because the * is used in the SELECT, all fields from the employees table would appear in the result set.
Example — Using AND condition
Let»s look at how to use the WHERE clause with the AND condition.
SELECT * FROM employees WHERE last_name = «Anderson» AND employee_id >= 3000;
This SQL Server WHERE clause example uses the WHERE clause to define multiple conditions. In this case, this SELECT statement uses the AND condition to return all employees that have a last_name of «Anderson» and the employee_id is greater than or equal to 3000.
Example — Using OR condition
Let»s look at how to use the WHERE clause with the OR condition.
SELECT employee_id, last_name, first_name FROM employees WHERE last_name = «Johnson» OR first_name = «Danielle»;
This SQL Server WHERE clause example uses the WHERE clause to define multiple conditions, but instead of using the AND condition , it uses the OR condition . In this case, this SELECT statement would return all employee_id , last_name , and first_name values from the employees table where the last_name is «Johnson» or the first_name is «Danielle».
Example — Combining AND & OR conditions
Let»s look at how to use the WHERE clause when we combine the AND & OR conditions in a single SQL statement.
SELECT * FROM employees WHERE (state = «California» AND last_name = «Smith») OR (employee_id = 82);
This SQL Server WHERE clause example uses the WHERE clause to define multiple conditions, but it combines the AND condition and the OR condition . This example would return all employees that reside in the state of «California» and whose last_name is «Smith» as well as all employees whose employee_id is equal to 82.
The parentheses determine the order that the AND and OR conditions are evaluated. Just like you learned in the order of operations in Math class!
Example — Joining Tables
Let»s look at how to use the WHERE clause when we join multiple tables together.
SELECT employees.employee_id, contacts.last_name FROM employees INNER JOIN contacts ON employees.employee_id = contacts.contact_id WHERE employees.first_name = «Sarah»;
This SQL Server WHERE clause example uses the WHERE clause to join multiple tables together in a single SELECT statement. This SELECT statement would return all rows where the first_name in the employees table is «Sarah». And the employee s and contacts tables are joined on the employee_id from the employees table and the contact_id from the contacts table.
SQL — Урок 4. Выборка данных — оператор SELECT
Вместо «что_выбрать» мы должны указать либо имя столбца, значения которого хотим увидеть, либо имена нескольких столбцов через запятую, либо символ звездочки (*), означающий выбор всех столбцов таблицы. Вместо «откуда_выбрать» следует указать имя таблицы.
Давайте сначала посмотрим все столбцы из таблицы users:
SELECT * FROM users;
Вот и все наши данные, которые мы вносили в эту таблицу. Но предположим, что мы хотим посмотреть только столбец id_user (например, в прошлом уроке, нам надо было для заполнения таблицы topics (темы) знать, какие id_user есть в таблице users). Для этого в запросе мы укажем имя этого столбца:
SELECT id_user FROM users;
Ну, а если мы захотим посмотреть, например, имена и e-mail наших пользователей, то мы перечислим интересующие столбцы через запятую:
SELECT name, email FROM users;
Аналогично, вы можете посмотреть, какие данные содержат и другие наши таблицы. Давайте посмотрим, какие у нас существуют темы:
SELECT * FROM topics;
Сейчас у нас всего 4 темы, а если их будет 100? Хотелось бы, чтобы они выводились, например, по алфавиту. Для этого в SQL существует ключевое слово ORDER BY после которого указывается имя столбца по которому будет происходить сортировка. Синтаксис следующий:
По умолчанию сортировка идет по возрастанию, но это можно изменить, добавив ключевое слово DESC
Теперь наши данные отсортированы в порядке по убыванию.
Сортировку можно производить сразу по нескольким столбцам. Например, следующий запрос отсортирует данные по столбцу topic_name, и если в этом столбце будет несколько одинаковых строк, то в столбце id_author будет осуществлена сортировка по убыванию:
Сравните результат с результатом предыдущего запроса.
Очень часто нам не нужна вся информация из таблицы. Например, мы хотим узнать, какие темы были созданы пользователем sveta (id=4). Для этого в SQL есть ключевое слово WHERE, синтаксис у такого запроса следующий:
Для нашего примера условием является идентификатор пользователя, т.е. нам нужны только те строки, в столбце id_author которых стоит 4 (идентификатор пользователя sveta):
SELECT * FROM topics WHERE id_author=4;
Или мы хотим узнать, кто создал тему «велосипеды»:
Конечно, было бы удобнее, чтобы вместо id автора, выводилось его имя, но имена хранятся в другой таблице. В последующих уроках мы узнаем, как выбирать данные из нескольких таблиц. А пока узнаем, какие условия можно задавать, используя ключевое слово WHERE.
SELECT * FROM topics WHERE id_author=4;
SELECT * FROM topics WHERE id_author>2;
SELECT * FROM topics WHERE id_author =2;
Видеоуроки php + mysql
Если этот сайт оказался вам полезен, пожалуйста, посмотрите другие наши статьи и разделы.