SELECT [ [DISTINCT |DISTINCTROW | ALL] список [виразів |стовпців] [INTO {OUTFILE | DUMPFILE} ‘і'мя_файлу‘ опції експорту | змінна] [FROM таблиці [WHERE умова] [GROUP BY {ціле | і'мя_стовпчика | вираз} [ASC | DESC], ...] [HAVING умова] [ORDER BY {ціле | і'мя_стовпчика | вираз} [ASC| DESC], ...] [LIMIT [зсув,] рядків] [PROCEDURE і'мя_процедури] [FOR UPDATE | LOCK IN SHARE MODE]] ;
Пр. SELECT STRAIGHT_JOIN … FROM tab1 JOIN tab2 ORDER BY tab.name;
Цей результат потім можна отримати за допомогою команди
SELECT FOUND_ROWS()
Особливості команди SELECT в MySQL
SELECT a, COUNT(b) FROM t GROUP BY a DESC
SELECT CONCAT(last_name,', ',first_name) AS full_name FROM tab ORDER BY full_name;
SELECT 1 + 1; -> 2
SELECT college, region, city FROM T ORDER BY region, city; SELECT college, region AS r, city AS s FROM T ORDER BY r, s; SELECT college, region, city FROM T ORDER BY 2, 3;
У виразі WHERE можна використовувати всі функції, які підтримуються в MySQL. Вираз HAVING може посилатись на будь-який стовпець або псевдонім, які вказані після SELECT. HAVING виконується останнім і без оптимізації. Не рекомендується використовувати умову HAVING, якщо вона може бути задана у WHERE. Наприклад, неправильно буде:
SELECT col_name FROM tbl_name HAVING col_name > 0;
Правильно:
SELECT col_name FROM tbl_name WHERE col_name > 0;
У версіях MySQL після 3.22.5 можна писати запити:
SELECT user, MAX(salary) FROM users GROUP BY user HAVING MAX(salary)>10;
В попередніх версіях MySQL замість цього можна було використовувати лише:
SELECT user, MAX(salary) AS sum FROM users GROUP BY user HAVING sum>10;
Для таблиці в FROM можна задати псевдонім (аліас):
і'мя_таблиці [[AS] аліас] [USE INDEX (список_ключів)] [IGNORE INDEX (список_ключів)]
SELECT * FROM t LIMIT 5,10; -- рядки 6-15. SELECT * FROM t LIMIT 0,5 (= LIMIT 5); -- перші 5 рядків.
PROCEDURE pr(.) – опція команди SELECT.
Виконується PROCEDURE pr(), вхідними даними для якої є результуюча таблиця команди SELECT.
SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max_elements, [max_memory]]) SELECT * FROM charac PROCEDURE ANALYSE(5, 24);
Field_name: world.charac
Min_value: A
Max_value: E
Min_length: 1
Max_length: 1
Empties_or_zeros: 0
Nulls: 0
Avg_value_or_avg_length: 1.0000
Optimal_fieldtype: CHAR(1) NOT NULL
Вираз FROM <таблиці> задає всі таблиці, з яких вибираються рядки. Якщо вказано більше, ніж одна таблиця, рекомендується виконати об'єднання JOIN. Для кожної таблиці можна вказати псевдонім.
де t1, t2 визначені, як:
Ім'я_таблиці [[AS] alias] [USE INDEX (key_list)] [IGNORE INDEX (key_list)]
умова_join визначена як:
ON умова | USING (список_стовпців)
NATURAL автоматично перевіряє рівність значень спільних стовпців
Приклад.
SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;
Команда знаходить всі рядки в таблиці t1 з величиною id, яка не присутня в таблиці t2.
Вираз USING в:
A LEFT JOIN B USING (C1, C2, C3, ...)
еквівалентний такому виразу ON:
A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...
Опція
INTO OUTFILE 'Шлях і ім’я файлу' [FILEDS ...] [LINES ...]
Цей файл створюється на сервері і перед цим не повинен існувати. Для використання цієї форми команди SELECT необхідно мати привілей FILE.
Форма SELECT … INTO OUTFILE в першу чергу призначена для швидкого створення дампа таблиці на серверному комп'ютері.
FILEDS і LINES мають той же зміст, що і в команді LOAD DATA.
Команду SELECT… INTO OUTFILE можна використати для резервного копіювання,
а LOAD DATA – для перенесення даних на інший сервер MySQL.
Якщо замість INTO OUTFILE використовується INTO DUMPFILE, то MySQL в файл запише лише один «довгий» рядок без символів завершення стовпців і рядків. Це дозволяє дані типу BLOB зберігати у файлі.
Файл, який був створений за допомогою INTO OUTFILE та INTO DUMPFILE буде доступний для читання всіма користувачами.
При використанні FOR UPDATE з обробником таблиць, які підтримують блокування сторінок/рядків, вибрані рядки будуь заблоковані для запису.
Наприклад:
SELECT * FROM Customers INTO OUTFILE 'C:/data/Customers.txt';
Після цього можна виконати ( інший користувач теж):
LOAD DATA INFILE 'C:/data/Customers.txt' INTO TABLE Custom_copy;
Приклад:
SELECT a, b, a+b INTO OUTFILE "/tmp/result.text" FIELDS TERMINATED BY ',‘ LINES TERMINATED BY "\n" FROM test_table;
LOAD DATA [LOCAL] INFILE 'Шлях в каталозі та ім’я файлу' [REPLACE або IGNORE] INTO TABLE <Ім’я таблиці> CHARACTER SET <кодування> [FIELDS [TERMINATED BY <Розділювач значень в рядку>] [ ENCLOSED BY <Символ, який обмежує значення даних>] [ LINES [TERMINATED BY <Розділювач рядків в файлі>] ] [(<Список стовпців>)] [SET <Ім’я стовпця> = <Вираз>,...];
Приклад. Будь-яким текстовим редактором підготувати дані в файлі Customers.txt. Потім
LOAD DATA LOCAL INFILE 'C:/data/Customers.txt' INTO TABLE Customers CHARACTER SET cp1251;
Щоб ігнорувати обмеження зовнішнього ключа, перед виконанням LOAD DATA потрібно виконати
SET foreign_key_checks = 0
• LOCAL – файл знаходиться на клієнтському комп’ютері. • REPLACE – заміна існуючого рядка (з однаковим ключем), • IGNORE – ігнорування завантаження (з однаковим ключем) • FIELDS TERMINATED BY <Розділювач> – символ відокремлення значень.
Пр. \t – символами табуляції. По замовчуванню – відокремлення комами.
• ENCLOSED BY <Символ обмеження даних>. Якщо всі дані обмежені одинарними лапками, то \, якщо в лапках лише символьні дані, то OPTIONALLY ENCLOSED BY \ • Якщо FIELDS не задане, то по замовчуванню вважається: FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\‘ (значення розділені табуляцією без лапок). • LINES відсутній – рядки закінчуються символом переводу «\n». • (<Список стовпців>) – стовпці таблиці, в які завантажуються дані. Використовується, якщо файл містить дані не для всіх стовпців таблиці.
Можна також вказати додаткові параметри:
DISTINCT – виключає дублювання значень;
ORDER BY – упорядковує результат;
SEPARATOR – задає розділові знаки.
Наприклад,
SELECT GROUP_CONCAT(DISTINCT name ORDER BY name ASC SEPARATOR ';') FROM Customers;