5. Команда SELECT в MySQL

Загальна структура команди SELECT

  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
   Пр. 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

Оператор JOIN в MySQL

Вираз 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;