8. MySQL 8 - SELECT - выборка данных
SELECT - оператор выборки данных. Позволяет находить данные из MySQL таблиц (и не только!), выполнять расчёты, выгружать данные во внешний файл, записывать данные в переменную. Вам без него не обойтись!
SELECT - оператор выборки данных. Позволяет находить данные из MySQL таблиц (и не только!), выполнять расчёты, выгружать данные во внешний файл, записывать данные в переменную. Вам без него не обойтись!
Пікірлер: 81
Это не только самый длинннный урок, еще и самый "заряженный":) Аплодирую стоя!
@HtmllabRu
2 жыл бұрын
Андрей, спасибо за поддержку)
Спасибо большое за твои видео, все понятно и очень качественно снято.
Очень хорошие уроки, смотрю с удовольствием, спасибо большое и моё вам почтение!
@HtmllabRu
2 жыл бұрын
Спасибо за классный коментарий!
Спасибо, СУПЕР!!! Давай ещё!!!
Здравствуйте. Спасибо Вам за Ваш труд и Ваше время! Шпаргалка для выгрузки данных в файл на Ubuntu (вдруг, кому надо): SHOW VARIABLES LIKE "secure_file_priv"; (в выводе будет папка для сохранения, например, /var/lib/mysql-files), соответственно командля для выгрузки данных в файл: SELECT continent, SUM(population) INTO OUTFILE '/var/lib/mysql-files/query.txt' FROM country GROUP BY 1 HAVING SUM(population) > 400000000;
Доступно, лайк.
Я просто ВОЮ от кайфа просмотра твоего видео)!!
@HtmllabRu
3 жыл бұрын
Значит материал хорошо заходит) 👍
@natalya.provkova2002
3 жыл бұрын
@@HtmllabRu +)
круто!
Сначала лайк потом просмотр)
@HtmllabRu
3 жыл бұрын
Спасибо👍)
Спасибо!
Спасибо
ЛАЙК!!!
@HtmllabRu
4 жыл бұрын
Балуете лайками, спасибо)
Также кому интересно дополню: переменная может хранить 1 столбец, если много будет ошибка.. Пытался закинуть таблицу в переменную:)
31:30 - выгрузка данных из таблицы в файл
загуглил Adamstown. в самом центре тихого океана.... думал там только акулы живут ))
@HtmllabRu
4 жыл бұрын
Вы первый, кто на моих курсах так далеко раскопал материал 😊
@yakut54
4 жыл бұрын
@@HtmllabRu Пытливый ум ))
Когда стану разработчиком, с меня донат
Спасибо большое за видео! Всё стало понятно, всё очень хорошо объяснено. Единственное что, у меня возникла непонятка с одним из запросов: SELECT continent, region, sum(population) FROM country GROUP BY region, continent WITH ROLLUP; Я его написал сам, работал также с бд world. В итоге вышел "бред", покопавшись и сравнив с вашим запросом понял, что у вас так: > GROUP BY continent, region у меня в этом запросе так: > GROUP BY region, continent То есть смена порядка входных значений при использовании ключевой конструкции GROUP BY имела значение, но как-то сложно осознать каким образом это влияет, при выводе запроса видно, что получается каша в моём случае, но вот каким же образом порядок аргументов в этой конструкции влияет на результат?
@HtmllabRu
3 жыл бұрын
Дело в том, что в один континент входит много регионов, но одному региону соотвествует один континент. Если взять ваш запрос и переставить местами выбираемые поля (то есть сначала region, потом континент), то запрос SELECT region, continent , sum(population) FROM country GROUP BY region, continent WITH ROLLUP; Сначала сгруппирует регионы, а потом для каждого покажет результат - одна строка 'промежуточная' + одна строка итог. Получится что-то вроде region continent sum(population) Antarctica Antarctica 0 Antarctica NULL 0 Australia and New Zealand Oceania 22753100 Australia and New Zealand NULL 22753100 Baltic Countries Europe 7561900 Baltic Countries NULL 7561900 Потому мы в запросе SELECT continent, region, sum(population) FROM country GROUP BY continent, region WITH ROLLUP указываем сначала то поле, которое более "общее", а затем более "детальные": continent region sum(population) Asia Eastern Asia 1507328000 Asia Middle East 188380700 Asia Southeast Asia 518541000 Asia Southern and Central Asia 1490776000 Asia NULL 3705025700 Так, если бы мы делали запрос к базе с продажами, то в GROUP BY указали сначала поле с годом, потом с месяцами, и так далее
@alexeicodes
3 жыл бұрын
@@HtmllabRu Всё понял теперь, при использовании 2+ аргументов в GROUP BY первым мы указываем более общий и далее на снижение. Спасибо большое :) И самое главное спасибо за такой замечательный плейлист, ещё и бесплатный! Надеюсь в вашем портфолио этот курс не затеряется:)
Решение проблемы secure_file_priv (Урок 8, время 31.23) 1. Задаём команду show variables like "secure_file_priv"; Результат показывает папку в которую и из которой разрешено импортировать и экспортировать файлы, а также путь до неё. У меня - это C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ 2. Перейти в C:\ProgramData. Папка скрыта, поэтому делаем её видимой (Вид - скрытые элементы, ставим галочку. На С: появляется папка ProgramData); 3. В ProgramData\MySQL\MySQL Server 8.0\Uploads идём до последней папки (Uploads) Uploads - именно та папка, куда sql будет выгружать файлы; Копируем весь путь (C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\) и вставляем его в код select continent, sum(population) into outfile "C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\pop.txt" from country group by 1 having sum(population) > 400000000; И ДОБАВЛЯЕМ К КАЖДОМУ СЛЭШУ ЕЩЁ ОДИН СЛЭШ и в конце пути произвольное название файла: select continent, sum(population) into outfile "C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\pop.txt" from country group by 1 having sum(population) > 400000000; Результат: в Uploads появляется файл pop.txt с содержимым North America 482993000 Asia 3705025700 Africa 784475000 Europe 730074600 Внимание! Для работы с файлами в папке Uploads требуются права админа. (На случай, если захочется удалить содержимое Uploads). О том, как изменить папку для выгрузки данных, см видео kzread.info/dash/bejne/Y6et2tF_Y5eveqw.html Там чел всё показывает с комментариями на плохом английском.
слешы в скрипте в пути файла отличаются от тех, которые задаются в файле конфига.
@denis_galkin
3 жыл бұрын
человек, это самый важный комментарий в моей жизни!!!!
Здравствуйте, подскажите пожалуйста как решить мою задачу. Сначала через SELECT TaskBase INTO @Base ... Получаю переменную название таблицы. Она воспроизводится - всё хорошо. Потом стоит задача сделать ещё один SELECT, но чтоб FROM являлся переменной. Такое возможно? Выбивает ошибку синтаксиса хотя такая таблица точно существует: SELECT str1 FROM @Base WHERE BStatus=0 ORDER BY RAND() LIMIT 1;
@HtmllabRu
4 жыл бұрын
Только через склейку строки запроса и потом подготовленный запрос (prepared statement)
@user-bo4bc9ts3e
4 жыл бұрын
@@HtmllabRu Спасибо, буду копать в эту сторону!🧐🧐🧐
Здравствуйте, подскажите пожалуйста, как можно получить подробную информацию о типе данных в таблице? Имеется тестовая таблица, в которой заведомо известны типы данных, одна колонка (при создании таблицы) USER_ID INT UNSIGNED AUTO INCREMENT PRIMARY_KEY. И если пользоваться запросом: SELECT data_type FROM information_schema.COLUMNS WHERE table_schema = 'my_database' AND table_name = 'my_table' AND column_name = 'my_users'; отобразит всего-лишь то, что колонка USER_ID имеет тип INT, а часть UNSIGNED пропала, как быть в таком случае в серьезных рабочих ситуациях?
@HtmllabRu
2 жыл бұрын
Здравствуйте! Если посмотрите остальные поля SELECT * FROM information_schema.COLUMNS WHERE table_schema = 'my_database' AND table_name = 'my_table' AND column_name = 'my_users'\G там будет COLUMN_TYPE с упоминанием об UNSIGNED
@dasfenster8953
2 жыл бұрын
@@HtmllabRu Огромное Вам СПАСИБО!
Спасибо большое DESC 54321 и Без DESC 12345 ????
Вопрос, почему при текущей версии воркбенча и базы world не пашет функция sum? (26-27 и далее минута)
@HtmllabRu
3 жыл бұрын
пробел не оставили между SUM и круглой скобкой ?
@es2367
3 жыл бұрын
@@HtmllabRu Пробела не было, другую ошибку нашел. Спасибо
Здраствуйте написал группировки: SELECT continent, region, sum(population) as jojo from country GROUP BY 1, 2; А вот аналог: SELECT continent, region, sum(population) as jojo from country GROUP BY 2 ORDER BY continent, region; Возникает вопрос, в чем смысл двойной группировки, если возвращает оно одно и тоже, и скорость выполнение кода одинаковые.. Заранее спасибо за ответ
@HtmllabRu
3 жыл бұрын
@Лииар, здраствуйте. Второй SQL-запрос оказался для меня неожиданным, но действительно возвращает такой же результат. Спасибо за вопрос! Единственное, что пока бросается в глаза, это с двойной группирокой сработает WITH ROLLUP: SELECT continent, region, sum(population) as jojo from country GROUP BY 1, 2 WITH ROLLUP;
Здраствуйте. есть таблица с сообщениями. в ней хранится поле private = 0 для всех пользователей сообщение. со значением 1 - для отправившего и кому отправили. как составить запрос чтобы выводились все сообщения private = 0 и private = 1 только если это либо получатель, либо отправитель? спасибо.
@HtmllabRu
3 жыл бұрын
Макс, здравствуйте. Можете показать структуру таблицы, несколько строк данных и пример того, что должно стать результатом?
@base-color
3 жыл бұрын
@@HtmllabRu CREATE TABLE `test_table` ( `id` int UNSIGNED NOT NULL, `id_who` int NOT NULL, `id_to_whom` int NOT NULL, `private` enum('0','1') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0', `message` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; таблица, а результат необходимого вывода делает этот запрос: $id_user = 3; $sql = "SELECT * FROM `test_table` WHERE (`id_who` = '$id_user' AND private = '0') OR (`id_who` = '$id_user' AND private = '1') OR (`id_who` != '$id_user' AND private = '0') OR (`id_to_whom` = '$id_user' AND private = '1') LIMIT 5" все работает так, как вроде хочется, но нет ли подхода более лаконичного? необходимо выбрать те поля, где приватные сообщения являются отправителем или получателем, а так же те все поля, где приватное значение = 0
@HtmllabRu
3 жыл бұрын
попробуйте так (могу ошибаться): $id_user = 3; $sql = "SELECT * FROM `test_table` WHERE private = '0' OR (`id_who` = '$id_user' AND private = '1') OR (`id_to_whom` = '$id_user' AND private = '1') LIMIT 5"
@base-color
3 жыл бұрын
@@HtmllabRu А ВЕДЬ И ВЕРНО! доставать все поля private со значением 0 и только со значение 1 с условием что это автор или получатель. спасибо !
А как это все в phpmyadmin создавать?
@HtmllabRu
3 жыл бұрын
в phpmyadmin есть секция SQL - там можно создавать запросы. Если только начинаете знакомиться, можно тренироваться на локальной сборке типа ospanel.io/ - там удобно запускать и экспериментировать phpMyAdmin
А если допустим хочу сделать подобное ... ввод : Пр%^5и%#/5вет*^%"мир^&"...ввывод привет мир.?
@HtmllabRu
Жыл бұрын
Неудобно, но можно воспользоваться функцией replace - dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_replace или написать свою функцию для фильтрации на основе replace.
при ошибке --secure-file-priv можно посмотреть куда сохраняются файл в консоли mysql: SELECT @@global.secure_file_priv; и далее прописать при запросе этот путь при сохранении: SELECT continent, SUM(population) INTO OUTFILE 'D:/ProgramData/MySQL/MySQL Server 8.0/Uploads/1.txt' FROM country GROUP BY 1 HAVING SUM(population) > 40000000;
@r4m1_l
4 жыл бұрын
Странная штука, @@global.secure_file_priv указывает правильный путь, но все равно вылетает ошибка ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti on so it cannot execute this statement
@rostlee
4 жыл бұрын
@@r4m1_l такая же ерунда. Вам удалось как-то решить данную проблему?
@r4m1_l
4 жыл бұрын
streepski если повторить все в точности как на видео, чтобы сервер при запуске выдал ошибку указывающую на отсутсвие файла, в который все должно выгрузиться и потом его создать, то должно получиться
@HtmllabRu
4 жыл бұрын
@@rostlee вы меняете значение настройки до запуска сервера? Примечание: динамически, то есть во время работы сервера, изменения не приведут к результату. Ещё место, где спотыкаются на занятиях - слеши, убедитесь что с ними всё норм
@rostlee
4 жыл бұрын
htmllab как оказалось перепутал слэши в самой команде 🤦🏻♂️. Поменял и все заработало! Спасибо за подсказку!
Файл содержит my.ini [mysqld] basedir=C:/mysqld datadir=C:/mysqld/data secure-file-priv=C:/mysql/shar Запрос SHOW VARIABLES LIKE "secure_file_priv"; Возвращает null
@HtmllabRu
4 жыл бұрын
Проверьте в конфиге secure_file_priv (dev.mysql.com/doc/refman/5.7/en/security-options.html)
@dr-cary
4 жыл бұрын
@@HtmllabRu Вы имеете ввиду разделитель сделать через нижнее подчеркивание!?б уже пробовал не помогло
@HtmllabRu
4 жыл бұрын
Давайте проверю.
@dr-cary
4 жыл бұрын
@@HtmllabRu Договорились
@young_ceaser
4 жыл бұрын
РЕШЕНИЕ: ПРОВЕРЬТЕ ФАЙЛ MY.INI. ОН ДОЛЖЕН БЫТЬ ФОРМАТА .INI , А НЕ .TXT И Т.Д ТАК КАК ОН ИГРАЕТ РОЛЬ КОНФИГУРАТОРА, АТО MYQSL НЕ ВИДЕТ ЕГО