Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РУБД - Теория по SQL .doc
Скачиваний:
4
Добавлен:
27.08.2019
Размер:
691.71 Кб
Скачать

(Например, select name from people; select mydata.People.Name from people ).

Можно задать «*», чтобы указать все колонки. Имена столбцов могут быть определены как column, table.column или database, table.column. Длинные формы необходимы только для того, чтобы отличать столбцы с одинаковыми именами (например, SELECT name FROM people; SELECT mydata.people.name FROM people ).

SELECT можно использовать для извлечения строк, вычисленных без ссылки на какую-либо таблицу. Например: SELECT 1 + 1; -> 2

Aliases AS задает псевдоним. Псевдоним используется в качестве имени столбца в данном выражении и может применяться в ORDER BY или HAVING. Любые сложные имена столбцов или функций можно упростить, создав для них псевдонимы (alias). Внутри оператора SELECT к значению можно всегда обратиться по его псевдониму с любого места.

Пример: SELECT DATE_FORMAT(date, "%W, %M %d %Y") as nice_date FROM calendar

SELECT CONCAT(last_name,', ',first_name) AS full_name FROM mytable ORDER BY full_name;

Псевдонимы столбцов нельзя использовать в выражении WHERE, поскольку находящиеся в столбцах величины на момент выполнения WHERE могут быть еще не определены.

Пример:

# Псевдоним колонки

SELECT long_field_names_are_annoying AS myfield FROM table_name WHERE myfield = 'Joe'

# Псевдоним таблицы в MySQL

SELECT people.names, tests.score FROM tests, really_long_people_table_name AS people

INTO OUTFILE 'filename' delimiters выполняет перенаправление. При его наличии результат запроса SELECT будет помещен в файл, указанный в filename (по умолчанию MySQL возвращает все результаты запроса пользователю на монитор, сделавшему этот запрос). Формат этого файла определяется аргументами delimiters , которые практически те же, что у оператора LOAD DATA INFILE , но со следующими дополнениями:

  • FIELDS ENCLOSED BY можно добавить ключевое слово OPTIONALLY . MySQL будет в этом случае считать, что данные, заключенные в кавычки (или другие указанные символы), являются строками, а прочие данные примет за числовые.

  • FIELDS TERMINATED BY ENCLOSED BY ' ' использование формата с фиксированной шириной. Данные будут экспортированы в соответствии с экранными размерами каждого поля. По умолчанию при экспорте данных без разделителей будет внесено по одной записи на каждую строку, использовано разделение табуляцией и символ обратной косой черты (\) в качестве экранирующего символ

  • INTO DUMPFILE запишет в файл только одну строку без символов завершения столбцов или строк, и без какого, то ни было экранирования. Это полезно для хранения данных типа BLOB в файле.

FOR UPDATE выбранные строки будут заблокированы для записи.

DISTINCT для исключения дубликатов и одновременного упорядочения перечня

ALL напротив, выдаст все возвращенные записи. По умолчанию действует ALL

LIMIT [ start, ] rows Возвращает только указанное количество записей. Значение start (необязательное) определяет на количество записей, которые надо пропустить перед выборкой данных. Нумерация записей начинается с нуля. (Например, SELECT url FROM links LIMIT 5,10 возвращает адреса URL с 5 по 14.)

FROM table_references задает таблицы, из которых надлежит извлекать строки.

Список используемых таблиц может быть указан следующими способами:

Table1, Таblе2, Таblе3, . . .

Для каждой заданной таблицы по желанию можно указать псевдоним.

table_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | FORCE INDEX (key_list)]]

SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 WHERE t1.name = t2.name;

Ссылки на таблицы могут даваться как tbl_name (в рамках текущей базы данных), или как dbname.tbl_name с тем, чтобы четко указать базу данных.

Если указано имя более чем одной таблицы, следует выполнить объединение. Таблицы соединяются так, как MySQL сочтет наиболее эффективным. Этот способ может быть также записан в виде: Table1 JOIN Table2 JOIN Таblе3..... , . В случае если MySQL недостаточно эффективно выполняет соединение, можно указать предикат (ключевое слово) STRAIGHT_JOIN и заставить сервер объединить таблицы в порядке, заданном в запросе. В объединенную таблицу войдут только те записи, которые отвечают условиям обоих столбцов.

Tablel STRAIGHT_JOIN Table2 таблица слева всегда читается раньше таблицы справа.

WHERE указывает, какие именно строки должны использоваться, и позволяет определить, каким образом должны объединяться две таблицы. Обычно фраза является сравнением какого-либо типа, но также может содержать любые функции, кроме агрегатных. Также могут быть использованы имена, такие как имена столбцов и псевдонимы, числовые константы и строки.

Строки автоматически конвертируются в числа и наоборот по мере необходимости.

При использовании операторов = <> <= >= < > левая сторона определяет, выполняется ли тест с числами или со строками. Все сравнения строк независимы от регистра.

Если выражение не задано, SELECT вернет все данные из выбранных таблиц (таблицы).

Фраза WHERE включает набор условий для отбора строк:

WHERE [NOT] WHERE_условие [[AND|OR][NOT] WHERE_условие]...

где WHERE_условие – одна из следующих конструкций:

значение { = | <> | < | <= | > | >= } { значение | ( подзапрос ) }

значение_1 [NOT] BETWEEN значение_2 AND значение_3

значение [NOT] IN { ( константа [,константа]... ) | ( подзапрос ) }

значение IS [NOT] NULL

[таблица.]столбец [NOT] LIKE 'строка_символов' [ESCAPE 'символ']

EXISTS ( подзапрос )

Кроме традиционных операторов сравнения (= | <> | < | <= | > | >=) в WHERE фразе используются условия BETWEEN (между), LIKE (похоже на), IN (принадлежит), IS NULL (не определено) и EXISTS (существует), которые могут предваряться оператором NOT (не). Критерий отбора строк формируется из одного или нескольких условий, соединенных логическими операторами:

AND - когда должны удовлетворяться оба разделяемых с помощью AND условия;

OR - когда должно удовлетворяться одно из разделяемых с помощью OR условий;

AND NOT - когда должно удовлетворяться первое условие и не должно второе;

OR NOT - когда или должно удовлетворяться первое условие или не должно удовлетворяться второе, причем существует приоритет AND над OR (сначала выполняются все операции AND и только после этого операции OR). Для получения желаемого результата WHERE условия должны быть введены в правильном порядке, который можно организовать введением скобок.

Группировка — позволяет объединять в одну строки с аналогичными значениями с целью их совместной обработки. Обычно это делается для применения к результатам агрегатных функций.

GROUP BY column [, column2,... ]

SELECT name, MAX(age) FROM people GROUP BY name ).

HAVING clause Аналог выражения WHERE, но выполняется над уже полученными из базы данными. С помощью HAVING хорошо выполняются агрегатные функции над относительно небольшими наборами даных. В этом случае будет идти работа не с целой таблицей, а только с выбранными данными

Упорядочение -- по умолчанию порядок, в котором появляются результаты выборки, не определен. Можно потребовать от базы данных, чтобы выводимые результаты были упорядочены по некоторой колонке. Например, если указать, что запрос должен упорядочить результаты по полю last_name , то результаты будут выведены в алфавитном порядке по значению поля last_name . Упорядочение осуществляется с помощью предложения ORDER BY:

ORDER BY column [ASC |DESC][, column2 [ASC |DESC], . . . ] Сортирует возвращаемые данные по заданному столбцу (или столбцам). Если указать DESC, данные будут отсортированы по убыванию. По умолчанию принята сортировка в возрастающем порядке, который можно задать явно при помощи ключевого слова ASC.

Пример: SELECT name, age FROM people ORDER BY age DESC

В ORDER BY для ссылок на столбцы, выбранные для вывода информации, можно использовать либо имена столбцов, либо их псевдонимы, либо их позиции (местоположения). Нумерация позиций столбцов начинается с 1:

SELECT college, region, seed FROM tournament ORDER BY region, seed;

SELECT college, region AS r, seed AS s FROM tournament ORDER BY r, s;

SELECT college, region, seed FROM tournament ORDER BY 2, 3;

Functions -- MySQL предлагает богатый выбор встроенных функций. Также всегда можно с помощью команды CREATE FUNCTION добавить пользовательские функции (например, SELECT COS(angle) FROM triangle).

ROCEDURE name эта фраза позволяет указать процедуру, модифицирующую результаты запроса перед их возвратом клиенту.

Синтаксис оператора HANDLER

HANDLER tbl_name OPEN [ AS alias ]

HANDLER tbl_name READ index_name { = | >= | <= | < } (value1,value2,...)

[ WHERE ... ] [LIMIT ... ]

HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }

[ WHERE ... ] [LIMIT ... ]

HANDLER tbl_name READ { FIRST | NEXT }

[ WHERE ... ] [LIMIT ... ]

HANDLER tbl_name CLOSE

Оператор HANDLER обеспечивает прямой доступ к интерфейсу обработчика таблиц MyISAM.

Первая форма оператора HANDLER открывает таблицу, делая ее доступной для последовательности команд HANDLER ... READ. Этот объект недоступен другим потокам и не будет закрыт, пока данный поток не вызовет HANDLER tbl_name CLOSE или сам поток не будет уничтожен.

Вторая форма выбирает одну строку (или больше - в соответствии с установкой в выражении LIMIT), для которой(ых) указанный индекс соответствует заданному условию и условие в выражении WHERE также выполняется. Если индекс состоит из нескольких частей (охватывает несколько столбцов), то составляющие его величины указываются в виде разделенного запятыми списка. Обеспечиваются величины только для нескольких первых столбцов.

Третья форма выбирает одну строку (или больше - в соответствии с установкой в выражении LIMIT), из таблицы; в порядке указания индексов в соответствии с условием WHERE.

Четвертая форма (без указания индексов) выбирает одну строку (или больше - в соответствии с установкой в выражении LIMIT), из таблицы, используя естественный порядок строк (как они хранятся в файле данных), в соответствии с условием WHERE. Эта форма работает быстрее, чем HANDLER tbl_name READ index_name, в тех случаях, когда желателен просмотр всей таблицы.

Оператор HANDLER ... CLOSE закрывает таблицу, открытую оператором HANDLER ... OPEN.

Оператор HANDLER представляет собой что-то наподобие низкоуровневой команды. Например, он не обеспечивает целостности таблицы. Т.е. HANDLER ... OPEN НЕ делает моментального снимка таблицы и НЕ блокирует ее. Отсюда следует, что после вызова команды HANDLER ...OPEN данные таблицы могут быть модифицированы (этим или любым другим потоком), а сами модификации в просмотрах таблицы при помощи HANDLER ... NEXT или HANDLER ... PREV могут появляться только частично.

Приемущества HANDLER вместо обычного SQL:

  • Он быстрее чем SELECT, потому что:

    • Выделенный код обработчика таблиц создается в потоке по вызову HANDLER open.

    • Меньше синтаксического анализа.

    • Нет нагрузки на оптимизацию и проверку.

    • Таблицу не нужно блокировать между запросами.

  • Этот интерфейс не обязан предоставлять целостный вид данных (скажем, грязное чтение допускается), что позволяет обработчику таблиц делать оптимизации которые SQL обычно не допускает.

  • Гораздо легче переносить на MySQL приложения, которые используют интерфейс, подобный ISAM.

  • Такой интерфейс позволяет просматривать базу данных способом, который не так легко (или в некоторых случаях и вовсе невозможно) реализовать с помощью SQL. Интерфейс HANDLER является более естественным способом получить данные, когда приходится иметь дело с интерактивными пользовательскими приложениями.

EXPLAIN SELECT statement -- Выводит информацию о структуре и порядке выполнения запроса SELECT. Это может быть полезно для определения эффективности использования ключей.

Пример

EXPLAIN SELECT customer.name, product.name FROM customer, product, purchases

WHERE purchases.customer=customer.id AND purchases.product=product.id