Строки mysql: Функции для работы со строками
Функция & Описание |
---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Функция CONCAT — сложение строк при выборке
Функция CONCAT предназначена для сложения строк при выборке
из базы данных. Строками обычно выступают поля таблиц.
См. также функцию CONCAT_WS,
которая складывает строки с использованием разделителя.
См. также функцию GROUP_CONCAT,
которая складывает содержимое одного поля из разных строк.
Синтаксис
SELECT CONCAT(поле1, поле2...) FROM имя_таблицы WHERE условие
Примеры
Все примеры будут по этой таблице workers, если не сказано иное:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима | 23 | 300 |
2 | Петя | 24 | 400 |
3 | Вася | 25 | 500 |
Пример
В данном примере при выборке из базы создается новое поле
concat, в котором одновременно сольются 3 поля — age, name и salary:
SELECT *, CONCAT(age, name, salary) as concat FROM workers
SQL запрос выберет следующие строки:
id айди | name имя | age возраст | salary зарплата | concat объединенное поле |
---|---|---|---|---|
1 | Дима | 23 | 300 | 23Дима300 |
2 | Петя | 24 | 400 | 24Петя400 |
3 | Вася | 25 | 500 | 25Вася500 |
Пример
Давайте добавим после name 3 восклицательных знака:
SELECT *, CONCAT(name, '!!!') as name FROM workers
SQL запрос выберет следующие строки:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | Дима!!! | 23 | 300 |
2 | Петя!!! | 24 | 400 |
3 | Вася!!! | 25 | 500 |
Пример
Давайте добавим перед name 3 восклицательных знака, а после него — 3 вопросительных:
SELECT *, CONCAT('!!!', name, '???') as name FROM workers
SQL запрос выберет следующие строки:
id айди | name имя | age возраст | salary зарплата |
---|---|---|---|
1 | !!!Дима??? | 23 | 300 |
2 | !!!Петя??? | 24 | 400 |
3 | !!!Вася??? | 25 | 500 |
Выбрать определенную строку из таблицы MySQL
В идеале мне нужен запрос, эквивалентный
select * from customer where row_number() = 3
но это незаконно.
Я не могу использовать автоматическое приращение поля.
row_number () — это строка, которую необходимо выбрать.
Как мне это сделать?
EDIT: Ну, я использую iSql * plus для практики, и использование limit и auto_increment по какой-то причине незаконно. Я закончил создание последовательности и триггера и просто увеличил id на 1 каждый раз, когда там была запись.
18
автор: Matt O’Brien
6 ответов
можно использовать LIMIT 2,1
вместо WHERE row_number() = 3
.
как документация объясняет, первый аргумент указывает смещение первой строки для возврата, а второй-максимальное количество строк для возврата.
имейте в виду, что это индекс на основе 0. Итак, если вы хотите номер строки n, первый аргумент должен быть n-1. Второй аргумент всегда будет 1, потому что вы просто хочу один ряд. Например, если вы хотите номер строки 56 таблицы customer
:
SELECT * FROM customer LIMIT 55,1
вы не можете выбрать такую строку. Вы должны указать поле, значения которого будет 3
вот запрос, который будет работать, если поле, которое вы сравниваете с id
select * from customer where `id` = 3
SET @customerID=0;
SELECT @customerID:=@customerID+1 AS customerID
FROM CUSTOMER ;
вы можете получить набор данных из SQL, как это и заполнить его в структуру данных Java (как список), а затем сделать необходимую сортировку там. (возможно, с помощью сопоставимого интерфейса)
вы можете добавить автоматически сгенерированное поле id в таблицу и выбрать по этому id
SELECT * FROM CUSTOMER WHERE CUSTOMER_ID = 3;
2
автор: user1135357
таблицы SQL не упорядочены по умолчанию, и запрос n-й строки из неупорядоченного набора строк не имеет смысла, поскольку он может потенциально возвращать другую строку каждый раз, если вы не укажете порядок:
select * from customer order by id where row_number() = 3
(иногда таблицы MySQL отображаются с внутренним порядком, но вы не можете полагаться на это поведение). Тогда вы можете использовать LIMIT offset, row_count
, со смещением на основе 0, поэтому номер строки 3 становится смещением 2:
select * from customer order by id
limit 2, 1
или вы можете использовать LIMIT row_count OFFSET offset
:
select * from customer order by id
limit 1 offset 2
ваша таблица должна быть создана с уникальным полем ID, которое в идеале будет иметь атрибут AUTO_INCREMENT. пример:
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
PRIMARY KEY (P_Id)
)
затем вы можете получить доступ к 3-й записи в этой таблице с:
SELECT * FROM Persons WHERE P_Id = 3
1
автор: Luminous_Path
Эмуляция функции row_number() в MySQL
В этой статье я расскажу вам, как пронумеровать строки результата запроса, возвращаемого MySQL.
Функция row_number() – это функция ранжирования, возвращающая порядковый номер строки, начиная с 1 для первой строки. Номер строки часто бывает нужен при генерации отчётов. Эта функция реализована в MS SQL и в Oracle. В MySQL подобная функция отсутствует, но её несложно реализовать за счёт глобальных переменных.
Нумерация строк
Чтобы пронумеровать строки, мы должны объявить переменную запроса. Продемонстрируем этот подход на примере простой таблицы, содержащей список работников предприятия (employees). Следующий запрос выбирает 5 работников из таблицы, присваивая им номера по порядку, начиная с 1:
SET @row_number = 0; SELECT (@row_number:=@row_number + 1) AS num, firstName, lastName FROM employees LIMIT 5;
В выше приведённом запросе мы:
- Определили переменную row_number и инициализировали её нулевым значением;
- Увеличивали её значение на 1 при каждой итерации запроса.
Другая техника, позволяющая достичь того же результата, заключается в создании вместо глобальной переменной производной таблицы и перекрёстном объединении этих двух таблиц. Пример такого запроса:
SELECT (@row_number:=@row_number + 1) AS num, firstName, lastName FROM employees,(SELECT @row_number:=0) AS t LIMIT 5;
Обратите внимание на то, что для соблюдения правил синтаксиса у производной таблицы должен быть псевдоним.
Возобновление нумерации в группах
Как нам задать отдельную нумерацию для каждой группы строк, объединённых выражением ORDER BY или GROUP BY? Например, как имитировать следующий запрос:
SELECT customerNumber, paymentDate, amount FROM payments ORDER BY customerNumber;
Нам нужно сформировать список платежей, в котором каждому платежу будет соответствовать определённый порядковый номер. Для того чтобы получить требуемый результат, нам понадобятся две переменные: одна – с порядковым номером строки, другая – для хранения идентификатора клиента из предыдущей строки, чтобы сравнить его с текущим. Наш запрос будет выглядеть так:
SELECT @row_number:=CASE WHEN @customer_no = customerNumber THEN @row_number + 1 ELSE 1 END AS num, @customer_no:=customerNumber as CustomerNumber, paymentDate, amount FROM payments ORDER BY customerNumber;
Мы использовали оператор CASE для вычисления условия: если номер клиента остаётся прежним, мы увеличиваем номер строки на 1, в противном случае мы устанавливаем номер строки равным 1. Результат будет тем же, что и на выше приведённом скриншоте.
Теперь добьёмся того же результата, используя технику производной таблицы и перекрёстного запроса:
SELECT @row_number:=CASE WHEN @customer_no = customerNumber THEN @row_number + 1 ELSE 1 END AS num, @customer_no:=customerNumber as CustomerNumber, paymentDate, amount FROM payments,(SELECT @customer_no:=0,@row_number:=0) as t ORDER BY customerNumber;
Итак, мы научились эмулировать нумерацию строк запроса в MySQL.
Данная публикация представляет собой перевод статьи «MySQL row_number Emulation» , подготовленной дружной командой проекта Интернет-технологии.ру
телеграм канал. Подпишись, будет полезно!
MySQL номер строки | AlexGur
В SQL есть специальная функция вывода номеров строк в запросе ROW_NUMBER(). Но в его младшем брате MySQL нет такой функции. Единственный способ вывести номер строки в MySQL — использование переменной.
Поставим задачу: необходимо вывести имя пользователя, количество его очков и место в рейтинге по количеству этих очков. Т.е. такую таблицу:
RANK | POINTS | NAME |
1 | 500 | Алексей |
2 | 300 | Сергей |
3 | 200 | Виталий |
Получать данные будем из таблицы истории получения очков, которая зовётся «history». Выглядит она так:
DATE | POINTS | NAME |
26.03.2017 | 300 | Алексей |
16.08.2016 | 200 | Алексей |
11.01.2016 | 200 | Виталий |
28.12.2015 | 200 | Сергей |
14.07.2015 | 100 | Сергей |
Для начала получим суммы набранных очков, сгруппированные по именам пользователей и отсортированные по убыванию. Запрос будет выглядеть так:
SELECT SUM(POINTS) as ‘POINTS’, NAME FROM `history` GROUP BY NAME ORDER BY SUM(POINTS) DESC;
База вернёт следующую таблицу:
POINTS | NAME |
500 | Алексей |
300 | Сергей |
200 | Виталий |
Отлично! Теперь надо пронумеровать строки, чтобы получить место пользователя в рейтинге. Алексей будет первым, Сергей — вторым, Виталий — третьим.
Нумеровка делается через переменную, добавляемую к выводу. Казалось бы, можно сделать всё просто:
SET @rank=0;
SELECT @rank:=@rank+1 AS ‘RANK’, SELECT SUM(POINTS) as ‘POINTS’, NAME FROM `history` GROUP BY NAME ORDER BY SUM(POINTS) DESC;
Но если сделать такой запрос, то результат будет плачевным. Назначение рейтинга произойдёт после группировки, но до сортировки ORDER BY SUM(POINTS). Выглядеть результат будет так:
RANK | POINTS | NAME |
1 | 500 | Алексей |
3 | 300 | Сергей |
2 | 200 | Виталий |
Цифры ранга идут не по порядку: 1, 3, 2. Чтобы исправить положение необходимо добавлять столбец ранга после группировки и сортировки, в отдельном запросе. По логике, получается SELECT в SELECT. Синтаксис будет такой:
SET @rank=0;
SELECT @rank:=@rank+1 AS ‘RANK’, POINTS, NAME FROM
(SELECT SUM(POINTS) as ‘POINTS’, NAME
FROM `history` GROUP BY NAME ORDER BY SUM(POINTS) DESC) as t ;
Обратите внимание на окончание запроса. Без «as t;» написать запрос нельзя, иначе будет ошибка «Every derived table must have its own alias!«.
Результат такого запроса будет выглядеть как нормальная ранговая таблица. С правильным расположением цифр ранга:
RANK | POINTS | NAME |
1 | 500 | Алексей |
2 | 300 | Сергей |
3 | 200 | Виталий |
Теперь усложним задачу. Получим содержание одной ячейки такой таблицы.
Представим, что нам нужно вывести номер ранга в личный кабинет пользователя. Чтобы Алексей видел в своём личном кабинете цифру «1», Сергей — «2», а Виталий — «3». Тогда запрос будет содержать SELECT внутри SELECT внутри SELECT. Вот так:
SET @rank=0;
SELECT RANK FROM
(SELECT @rank:=@rank+1 AS ‘RANK’, NAME FROM
(SELECT SUM(POINTS), NAME
FROM `history` GROUP BY NAME ORDER BY SUM(POINTS) DESC) as t1
) as t2
WHERE NAME = ‘Виталий’;
Обратите внимание на хвосты: «as t1», «as t2». Нужны разные псевдонимы, иначе будет ошибка «Every derived table must have its own alias!«.
P.S.
Конечно же, на реальном проекте такая таблица будет содержать id пользователя, а не его имя. Потому что в строке правды нет, а в числе есть 🙂
Как узнать количество строк в таблице MySQL
Однажды я столкнулся с этой задачей, но многие из предлагаемых в интернете решений у меня не работали. И всё же я нашёл выход. И даже не один.
Способ 1. phpMyAdmin
Начнем с самого простого и очевидного. Допустим, вам не нужно использовать полученный результат в коде, а просто узнать количество строк, только и всего.
Тогда заходим в phpMyAdmin (localhost/tools/phpmyadmin — для Денвера), затем выбираем нужную базу данных, после этого выбираем таблицу, количество строк в которой нужно выяснить, и видим следующее сообщение:
Способ 2. COUNT
Вот так выглядит сам SQL-запрос:
SELECT COUNT(1) FROM название_таблицы
SQL-запрос с условием:
SELECT COUNT(1) FROM название_таблицы WHERE условие
Реализация на PHP:
$a = mysql_query("SELECT COUNT(1) FROM название_таблицы"); $b = mysql_fetch_array( $a ); echo $b[0]; // выведет число строк
Аналогичным образом сюда можно добавить условие. Тогда код выведет число строк в таблице, удовлетворяющих условию.
Способ 3. mysql_num_rows
Этот способ позволяет подсчитать количество строк результата запроса.
Например в WordPress посты хранятся в таблице wp_posts, таким образом мы можем узнать сколько записей (постов ) хранится в базе данных (в таблице MySQL). Этот код дан только для примера (или для случаев, когда среда WordPress не подгружена), так как в WordPress подключение к базе данных осуществляется через класс $wpdb.
/* * для начала подключимся к базе данных * возможно вы уже подключились к ней ранее * пользователь root и пустой пароль - настройки по умолчанию для Денвера */ $connect_db = mysql_connect("localhost", "root", ""); /* * выбираем базу данных, нужно указать её название */ mysql_select_db("truemisha_database", $connect_db); /* * SQL запрос * у меня в качестве названия таблицы указана таблица с записями WordPress */ $posts = mysql_query("SELECT * FROM wp_posts", $connect_db); /* * задействуем функцию mysql_num_rows() */ $num_rows = mysql_num_rows( $posts ); echo "Количество записей на вашем блоге WordPress: $num_rows \n";
В результат будут включены абсолютно все записи. А как узнать количество только тех, которые опубликованы? Для этого нам потребуется немного изменить SQL-запрос.
$posts = mysql_query("SELECT * FROM wp_posts WHERE post_status='publish'", $connect_db);
Миша
В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.
Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.
Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.
строковых функций MySQL — qaru Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответы
Переполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегами
Вакансии
Программирование и связанные с ним технические возможности карьерного роста
Талант
Нанимайте технических специалистов и создавайте свой бренд работодателя
Реклама
Обратитесь к разработчикам и технологам со всего мира
.
sql — строка MySQL содержит строку
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответы
Переполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегами
Вакансии
Программирование и связанные с ним технические возможности карьерного роста
Талант
Нанимайте технических специалистов и создавайте свой бренд работодателя
Реклама
Обратитесь к разработчикам и технологам со всего мира
- О компании
Загрузка…
- Авторизоваться
зарегистрироваться текущее сообщество
.
Строковые типы данных MySQL
Какие типы данных String в MySQL?
Пояснение
Строковые типы данных MySQL:
Различные типы строковых данных в MySQL.
CHAR ():
Это строка фиксированной длины, которая в основном используется, когда данные не будут сильно отличаться по длине. Его длина составляет от 0 до 255 символов. При сохранении значений CHAR они заполняются справа пробелами до указанной длины.При получении значений CHAR конечные пробелы удаляются.
VARCHAR ():
Это строка переменной длины, которая в основном используется, когда данные могут различаться по длине. Его длина составляет от 0 до 255 символов. VARCHAR Значения не дополняются при сохранении.
TINYTEXT, TINYBLOB:
Строка с максимальной длиной 255 символов.
TEXT:
TEXT столбцы обрабатываются как символьные строки (недвоичные строки).Он содержит максимальную длину 65535 символов.
BLOB:
BLOB означает B inary L arge OB ject. Он может содержать переменное количество данных. BLOB столбцы обрабатываются как байтовые строки (двоичные строки). Он содержит максимальную длину 65535 символов.
MEDIUMTEXT, MEDIUMBLOB:
Максимальная длина — 16777215 символов.
LONGTEXT, LONGBLOB:
Максимальная длина — 4294967295 символов.
BINARY:
BINARY аналогичен типу CHAR . Он хранит значение в виде двоичных байтовых строк вместо недвоичных символьных строк.
VARBINARY:
Тип VARBINARY аналогичен типу VARCHAR . Он хранит значение в виде двоичных байтовых строк вместо недвоичных символьных строк.
ENUM ():
Перечисление. Каждый столбец может иметь одно из указанных возможных значений. Он может хранить только одно из значений, объявленных в указанном списке, содержащемся в скобках ().Список ENUM включает до 65535 значений.
НАБОР ():
Набор. Каждый столбец может иметь более одного из указанных возможных значений. Он содержит до 64 элементов списка и может хранить более одного выбора. SET Значения внутренне представлены как целые числа.
Если параметры CHAR и VARCHAR используются в одной и той же таблице, то MySQL автоматически изменит CHAR на VARCHAR по причинам совместимости.Скобка () позволяет ввести максимальное количество символов, которые будут использоваться в столбце. Это все строковые типы данных MySQL
.
.
sql — как использовать GROUP BY для объединения строк в MySQL?
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответы
Переполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегами
Вакансии
Программирование и связанные с ним технические возможности карьерного роста
Талант
Нанимайте технических специалистов и создавайте свой бренд работодателя
Реклама
Обратитесь к разработчикам и технологам со всего мира
- О компании
Загрузка…
- Авторизоваться
зарегистрироваться текущее сообщество
.
Продукты
Переполнение стека
Общественные вопросы и ответы
Переполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегами
Вакансии
Программирование и связанные с ним технические возможности карьерного роста
Талант
Нанимайте технических специалистов и создавайте свой бренд работодателя
Реклама
Обратитесь к разработчикам и технологам со всего мира
Продукты
Переполнение стека
Общественные вопросы и ответы
Переполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегами
Вакансии
Программирование и связанные с ним технические возможности карьерного роста
Талант
Нанимайте технических специалистов и создавайте свой бренд работодателя
Реклама
Обратитесь к разработчикам и технологам со всего мира
зарегистрироваться
текущее сообщество
CHAR ():
Это строка фиксированной длины, которая в основном используется, когда данные не будут сильно отличаться по длине. Его длина составляет от 0 до 255 символов. При сохранении значений CHAR они заполняются справа пробелами до указанной длины.При получении значений CHAR конечные пробелы удаляются.
VARCHAR ():
Это строка переменной длины, которая в основном используется, когда данные могут различаться по длине. Его длина составляет от 0 до 255 символов. VARCHAR Значения не дополняются при сохранении.
TINYTEXT, TINYBLOB:
Строка с максимальной длиной 255 символов.
TEXT:
TEXT столбцы обрабатываются как символьные строки (недвоичные строки).Он содержит максимальную длину 65535 символов.
BLOB:
BLOB означает B inary L arge OB ject. Он может содержать переменное количество данных. BLOB столбцы обрабатываются как байтовые строки (двоичные строки). Он содержит максимальную длину 65535 символов.
MEDIUMTEXT, MEDIUMBLOB:
Максимальная длина — 16777215 символов.
LONGTEXT, LONGBLOB:
Максимальная длина — 4294967295 символов.
BINARY:
BINARY аналогичен типу CHAR . Он хранит значение в виде двоичных байтовых строк вместо недвоичных символьных строк.
VARBINARY:
Тип VARBINARY аналогичен типу VARCHAR . Он хранит значение в виде двоичных байтовых строк вместо недвоичных символьных строк.
ENUM ():
Перечисление. Каждый столбец может иметь одно из указанных возможных значений. Он может хранить только одно из значений, объявленных в указанном списке, содержащемся в скобках ().Список ENUM включает до 65535 значений.
НАБОР ():
Набор. Каждый столбец может иметь более одного из указанных возможных значений. Он содержит до 64 элементов списка и может хранить более одного выбора. SET Значения внутренне представлены как целые числа.
Если параметры CHAR и VARCHAR используются в одной и той же таблице, то MySQL автоматически изменит CHAR на VARCHAR по причинам совместимости.Скобка () позволяет ввести максимальное количество символов, которые будут использоваться в столбце. Это все строковые типы данных MySQL
.
Продукты
Переполнение стека
Общественные вопросы и ответы
Переполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегами
Вакансии
Программирование и связанные с ним технические возможности карьерного роста
Талант
Нанимайте технических специалистов и создавайте свой бренд работодателя
Реклама
Обратитесь к разработчикам и технологам со всего мира
зарегистрироваться