Содержание
-
Выборка данных с использованием предложения SELECT
-
SELECT -
команда запроса, который получает любое количество данных из одного или нескольких отношений. Результат запроса – другое отношение. Предложение SELECT может использоваться как: самостоятельная команда на получение и вывод кортежей отношения; в качестве вложенного подзапроса; фраза выбора в командах определения схемы данных и модификации отношений; средство присвоения глобальным переменным значений кортежей сформированного отношения (INTO-фраза).
-
Упрощенный синтаксис SELECT
SELECT [DISTINCT] FROM [WHERE ] [ORDER BY ] [GROUP BY ] [HAVING ] [UNION ]; В [ ] необязательные элементы в запросе. SELECT FROM [ [ [ [ [ [ ] ] ] ] ] ] обязательно в конце! ; SELECT – запрос на извлечение информации; - наименование полей, содержимое которых запрашивается (через запятую); FROM – обязательное ключевое слово; - имена таблиц, из которых извлекается информация (через запятую).
-
Есть таблица STUDENT: STUDENT_ID – числовой код, идентифицирующий студента; SURNAME – фамилия студента; NAME – имя студента; STIPEND – стипендия, которую получает студент; KURS – курс, на котором учиться студент; CITY – город, в котором живет студент; BIRTHDAY – дата рождения студента; UNIV_ID – числовой код, идентифицирующий университет, в котором учиться студент.
-
Пример 1:SELECTNAME, SURNAMEFROMSTUDENT;
-
Осуществляет выборку всех значений полей NAME и SURNAME из таблицы STUDENT. Порядок следования столбцов в этой таблице соответствует порядку полей, указанному в запросе. Результат запроса:
-
Пример 2:SELECT*FROMSTUDENT;
В данном случает результатом выполнения будет таблица STUDENT полностью. * Вывод значений всех столбцов таблицы
-
Пример 3:SELECTCITYFROMSTUDENT;
-
В полученной таблице несколько раз повторяется значение поля CITY: Воронеж. Для того, чтобы избежать повторяющихся записей используется команда DISTINCT. Результат запроса:
-
Получаемые в результате выполнения SQL-запроса таблицы не в полной мере отвечают определению реляционного отношения: в них могут оказаться кортежи с одинаковым значением атрибутов. Для исключения из результата SELECT-запроса повторяющихся записей используется ключевое слово DISTINCT. Если запрос SELECT извлекает множество полей, то DISTINCT исключает дубликаты строк, в которых значения всех выбранных строк идентичны.
-
Пример 3 (переделанный Пример 2):SELECTDISTINCTCITYFROMSTUDENT;
С помощью DISTINCT избавились от повторяющихся записей. Результат запроса:
-
Вместо DISTINCTможет использоваться ключевое слово ALLдля вывода повторяющихся. Режим, задаваемый ключевым словом ALL, действует по умолчанию, поэтому в реальных запросах для этих целей оно практически не используется. Использование в операторе SELECTпредложения WHERE(где), позволяет задавать выражение условия (предикат), принимающее значение истина или ложь. Предложение WHERE определяет, какие строки должны быть выбраны. В таблицу, являющуюся результатом запроса, включаются только те строки, в которых WHEREпринимает значение истина.
-
Пример 4:SELECTNAME, SURNAMEFROMSTUDENTWHERE SURNAME=’Петров’;
-
В задаваемых в предложении WHERE условиях могут использоваться операции сравнения, а также логические операторы AND, OR, NOT. Результат запроса:
-
Пример 5:SELECTNAME, SURNAMEFROMSTUDENTWHERE KURS=3 AND STIPEND>0;
-
Запрос для получения имен и фамилий студентов, обучающихся на третьем курсе и получающих стипендию. Результат запроса:
-
Операторы INиNOT IN
IN – равен любому из списка NOT IN – не равен ни одному из списка Используются для сравнения проверяемого значения поля с заданным списком. Этот список значений указывается в скобках справа от оператора IN. Построенный с использованием IN предикат, считается истинным, если значение поля, имя которого указано слева от IN, совпадает (подразумевается точное совпадение) с одним из значений, перечисленных в списке. Предикат, построенный с использованием NOTIN, считается истинным, если значение поля не совпадает ни с одним из значений , перечисленных в списке.
-
Есть таблица EXAM_MARKS: EXAM_ID – идентификатор экзамена; STUDENT_ID – идентификатор студента; SUBJ_ID – идентификатор предмета обучения; MARK – экзаменационная оценка; EXAM_DATE – дата экзамена.
-
Пример 1:SELECT*FROMEXAM_MARKSWHERE MARK IN(4,5);
Результат запроса:
-
Пример 2:SELECT*FROMEXAM_MARKSWHERE MARK NOT IN(4,5);
Результат запроса:
-
Оператор BETWEEN
Используется для проверки условия вхождения значения поля в заданный интервал, то есть вместо списка значений атрибута этот оператор задает границы его изменения. Замечание! Граничные значения входят во множество значений, с которыми производится сравнение.
-
Есть таблица SUBJECT: EXAM_ID – идентификатор экзамена; STUDENT_ID – идентификатор студента; SUBJ_ID – идентификатор предмета обучения; MARK – экзаменационная оценка; EXAM_DATE – дата экзамена.
-
Пример :SELECT*FROMSUBJECTWHERE HOUR BETWEEN 30 AND 40;
Результат запроса:
-
ОператорLIKE
Применим только к символьным полям. Этот оператор просматривает строковые значения полей с целью определения, входит ли заданная в операторе LIKE строка (образец поиска) в символьную строку-значение проверяемого поля. Для выборки строковых значений по заданному образцу подстроки можно применять шаблон искомого образца строки, использующий следующий символ: «_» - определяет возможность наличия в указанном месте одного любого символа; «%» - допускает присутствие в указанном месте проверяемой строки последовательности любых символов произвольной длины.
-
Пример :SELECT*FROMSTUDENTWHERE SURNAME LIKE‘С%’;
-
ОператорLIKE
В случае необходимости включения в образец самих символов «_» и «%» применяют так называемые escape-символы. LIKE‘_\_P’ ESCAPE‘_\’ В этом выражении символ '\' с помощью ключевого слова ESCAPE объявляется escape-символом. Первый символ «_» будет соответствовать, как и ранее, любому символу в проверяемой строке. Однако второй символ «_», следующий после символа «\», объявленного escape-символом, уже будет интерпретироваться буквально как обычный символ.
-
IS NULL используется для проверки на пустое значение. Пример :SELECT*FROMSTUDENTWHERE CITY IS NULL;
-
Числовые и символьные константы
Несмотря на то, что SQL работает с данными в понятии строк и столбцов таблиц, имеется возможность применения значений выражений, построенных с использованием встроенных функций, констант, имен столбцов, определяемых как своего рода виртуальные столбцы. Они помещаются в списке столбцов и могут сопровождаться псевдонимами. Если в запросе вместо спецификации столбца SQL обнаруживает число, то оно интерпретируется как числовая константа. Символьные константы должны указываться в одинарных кавычках. SELECT 'Фамилия', SURNAME, 'Имя', NAME, 100 FROMSTUDENT;
-
Пример 1 :SELECTSURNAME, NAME, STIPEND, -(STIPEND*KURS)/2FROMSTUDENTWHERE KURS=4 AND STIPEND>0;
-
Можно использоваться следующие арифметические операции: унарный минус, +, -, *, /. Пример 1 :SELECTSURNAME, NAME, STIPEND, -(STIPEND*KURS)/2FROMSTUDENTWHERE KURS=4 AND STIPEND>0; Результат запроса:
-
Операция конкатенации «||» позволяет соединять значения двух или более столбцов символьного типа или символьных констант в одну строку. В СУБД Access для этой цели в запросах SQL применяется символ «&». Пример 2 :SELECTSURNAME || ‘_’ || NAME, STIPENDFROMSTUDENTWHERE KURS=4 AND STIPEND>0; Результат запроса:
-
Агрегирование и групповые функции
Позволяют получать из таблицы сводную (агрегированную) информацию, выполняя операции над группой строк таблицы. COUNT – определяет количество строк или значений поля и не являющихся NULL-значениями; SUM– вычисляет арифметическую сумму; AVG – вычисляет среднее значение; MAX– вычисляет наибольшее из значений; MIN – вычисляет наименьшее из значений; В SELECT-запросе агрегирующие функции используются аналогично именам полей, при этом имена полей используются в качестве аргументов этих функций.
-
Пример 1 :SELECTAVG(MARK) , COUNT(*)FROMEXAM_MARKS;
Результат запроса: SUM/n COUNT
-
GROUP BY
Предложение GROUP BY (группировать по) позволяет группировать записи в подмножества, определяемые значениями какого-либо поля, и применять агрегирующие функции уже не ко всем записям таблицы, а раздельно к каждой сформированной группе. В конструкции GROUP BY для группирования может быть использовано более одного столбца. Замечание! В GROUP BY должны быть указаны все выбираемые столбцы, приведенные после ключевого слова SELECT, кроме столбцов, указанных в качестве аргумента в агрегирующей функции.
-
Пример 2 :SELECTSTUDENT_ID, MAX (MARK)FROMEXAM_MARKSGROUP BY STUDENT_ID;
Результат запроса:
-
Пример 3 :SELECTSTUDENT_ID, SUBJ_ID, MAX (MARK)FROMEXAM_MARKSGROUP BY STUDENT_ID, SUBJ_ID;
-
Результат запроса: В данном случае строки вначале группируются по значениям первого столбца, а внутри этих групп - в подгруппы по значениям второго столбца. Таким образом, предложение GROUP BY не только устанавливает столбцы, по которым осуществляется группирование, но и указывает порядок разбиения столбцов на группы.
-
Пример 4 :SELECTSUBJ_NAME, MAX(HOUR)FROMSUBJECTGROUP BY SUBJ_NAME;HAVINGMAX(HOUR)>=72;
Поскольку группы записей с количеством часов больше 72 нет, то результатом выполнения этого запроса будет пустая таблица.
-
Пустые значения в агрегирующих функциях
Если аргументом функции COUNT является столбец, содержащий пустое значение, то COUNT вернет число строк, которые не содержат пустые значения и к которым применено определенное в COUNT условие или группирование. Поведение функции COUNT(*) не зависит от пустых значений. Она возвратит общее количество строк в таблице. Функция AVG вычисляет среднее значение всех известных значений множества элементов, то есть эта функция подсчитывает сумму известных значений и делит ее на количество этих значений, а не на общее количество значений, среди которых могут быть NULL-значения. Если столбец состоит только из пустых значений, то функция возвратит NULL.
-
Условные операторы
При отсутствии пустых значений условные операторы возвращают либо TRUE либо FALSE. Если в столбце присутствуют пустые значения, то может быть возвращено третье значение: UNKNOWN. Оператор OR: Если результат двух условий, объединенных OR известен, то применяются правила булевой логики; Если результат одного утверждения TRUE, а второго – неизвестен, то результат будет TRUE; Если результат одного утверждения FALSE, а второго – неизвестен, то результат будет неизвестен; Если результат обоих утверждений неизвестен, то и результат будет UNKNOWN.
-
Оператор NOT: Обычный унарный оператор NOT обращает оценку FRUE в FALSE и наоборот, но NOT NULL по прежнем у будет возвращать пустое значение NULL. Следует отличать проверку IS NULL (IS NOT NULL). Оператор AND: Если результат двух условий, объединенных AND известен, то применяются правила булевой логики; Если результат одного из утверждений UNKNOWN, а второго – TRUE, то состояние неизвестного утверждения является определяющим (т.е. результат будет UNKNOWN); Если результат одного из утверждений UNKNOWN, а второго – FALSE, то результат будет FALSE; Если результат обоих утверждений неизвестен, то и результат будет UNKNOWN
-
ORDER BY
Записи в реляционной БД не упорядочены, однако в результате выполнения запроса, данные можно упорядочить. Для этого используется оператор ORDER BY, который позволяет упорядочивать выводимые записи в соответствии со значениями одного или нескольких выбранных столбцов. При этом можно задать возрастающую (ASC) или убывающую (DESC) последовательность сортировки.
-
Пример 1:SELECT*FROMSUBJECTORDER BY SUBJ_NAME;
Результат запроса:
-
Пример 1(по убыванию):SELECT*FROMSUBJECTORDER BY SUBJ_NAME DESC;
Результат запроса: Предыдущий запрос, упорядоченный по убыванию.
-
Пример 2:SELECT*FROMSUBJECTORDER BY SEMESTER, SUBJ_NAME;
Результат запроса: Предложение ORDER BY может использоваться для упорядочения групп записей. При этом оператор ORDER BY в запросе всегда должен быть последним.
-
Вложенные запросы
SQL позволяет использовать одни запросы внутри других запросов, то есть вкладывать запросы друг в друга. Алгоритм работы запроса SQL со связанным подзапросом: Выбирается строка из таблицы, имя которой указано во внешнем запросе. Выполняется подзапрос и полученное значение применяется для анализа этой строки в условии предложения WHERE внешнего запроса. По результату оценки этого условия принимается решение о включении или не включении строки в состав выходных данных. Процедура повторяется для следующей строки таблицы внешнего запроса.
-
В некоторых случаях для гарантии получения единственного значения выполнения подзапроса используется DISTINCT. Одним из видов функций, которые автоматически возвращают в результате единственное значение для любого количества строк, являются агрегирующие функции. Оператор IN также широко применяется в подзапросе. Он задает список значений, с которыми сравниваются другие значения для определения истинности задаваемого этим оператором предиката.
-
-
Пример:Известна фамилия студента (Петров), но неизвестно значение его идентификатора.SELECT*FROMEXAM_MARKSWHERESTUDENT_ID = (SELECTSTUDENT_IDFROMSTUDENTWHERESURNAME = ’Петров’);
Результат запроса:
-
Пример2 :Данные обо всех оценках студентов из Воронежа.SELECT*FROMEXAM_MARKSWHERESTUDENT_ID IN(SELECTSTUDENT_IDFROMSTUDENTWHERECITY = ‘Воронеж’);
-
Результат запроса:
-
Пример 3:Определить количество предметов обучения с оценкой, превышающей среднее значение оценки студента с идентификатором 55.SELECTCOUNT(SUBJ_ID), MARKFROMEXAM_MARKSGROUPBYMARKHAVINGMARK >(SELECTAVG(MARK)FROMEXAM_MARKSWHERESTUDENT_ID = 55);
5:2=2,5 2
-
Результат запроса:
-
Формирование связанных подзапросов
При использовании подзапросов во внутреннем запросе можно ссылаться на таблицу, имя которой указано в предложении FROM внешнего запроса. В этом случае такой связанный подзапрос выполняется по одному разу для каждой строки таблицы основного запроса.
-
Пример 1:Выбрать сведения обо всех предметах обучения, по которым проводился экзамен 20 января 1999 года.SELECT*FROMSUBJECTas SUWHERE‘20/01/1999’ IN( SELECTEXAM_DATEFROMEXAM_MARKS as EXWHERESU.SUBJ_ID = EX.SUBJ_ID);
-
Пример 1:Выбрать сведения обо всех предметах обучения, по которым проводился экзамен 20 января 1999 года.SELECT*FROMSUBJECT AS SUWHERE‘20/01/1999’ IN( SELECTEXAM_DATEFROMEXAM_MARKS AS EXWHERESU.SUBJ_ID = EX.SUBJ_ID);
В некоторых СУБД для выполнения этого запроса может потребоваться преобразование значения даты в символьный тип. В приведенном запросе SU и EX являются псевдонимами (алиасами). Эту же операцию можно решить при помощи соединения таблиц: SELECTSU.SUBJ_ID, SUBJ_NAME, HOUR, SEMESTER FROMSUBJECT AS SU, EXAM_MARKS AS EX WHERESU.SUBJ_ID = EX.SUBJ_ID ANDEX.EXAM_DATE = #20/01/1999#; Результат запроса:
-
Пример 2:Найти студентов, которые получают стипендию выше средней на курсе.SELECTDISTINCTSTUDENT_ID, SURNAME, NAME, STIPENDFROMSTUDENT AS E1WHERESTIPEND>(SELECTAVG(STIPEND)FROMSTUDENT AS E2WHEREE1.KURS = E2.KURS);
AVG(STIPEND) – средняя стипендия по курсам 1 курс: 150:1=150; 2 курс: (250+0):2=125; 3 курс: (200+0+200):3=133; 4 курс: (150+200):2=175
-
Пример:Найти студентов, которые получают стипендию выше средней на курсе.SELECTDISTINCTSTUDENT_ID, SURNAME, NAME, STIPENDFROMSTUDENT AS E1WHERESTIPEND>(SELECTAVG(STIPEND)FROMSTUDENT AS E2WHEREE1.KURS = E2.KURS);
Результат запроса:
-
Второй вариант этой же задачи: SELECTDISTINCTSTUDENT_ID, SURNAME, STIPEND FROMSTUDENT E1, (SELECTKURS, AVG(STIPEND) AS AVG_STIPEND FROMSTUDENT E2 GROUPBYE2.KURS) E3 WHEREE1.STIPEND>AVG_STIPEND ANDE1.KURS=E3.KURS;
-
Пример3:По данным из таблицы EXAM_MARKS определить сумму полученных студентами оценок, сгруппировав значения оценок по датам экзаменов и исключив те дни, когда число студентовбыло больше 10.SELECTEXAM_DATE, SUM(MARK)FROMEXAM_MARKS AS AGROUPBYEXAM_DATEHAVING10 > (SELECTCOUNT (MARK)FROMEXAM_MARKS AS BWHEREA.EXAM_DATE = B.EXAM_DATE);
-
Пример3:По данным из таблицы EXAM_MARKS определить сумму полученных студентами оценок, сгруппировав значения оценок по датам экзаменов и исключив те дни, когда число студентовбыло больше 10.SELECTEXAM_DATE, SUM(MARK)FROMEXAM_MARKS AGROUPBYEXAM_DATEHAVING10 > (SELECTCOUNT (MARK)FROMEXAM_MARKS BWHEREA.EXAM_DATE = B.EXAM_DATE);
Предикат предложения HAVING оценивается не для каждой строки результата, а для каждой группы выходных записей, сформированных предложением GROUP BY внешнего запроса. Результат запроса:
-
Оператор EXISTS
Генерирует значение истина или ложь. Используя подзапросы в качестве аргумента, этот оператор оценивает результат выполнения подзапроса как истинный, если этот подзапрос генерирует выходные данные. В противном случае результат подзапроса ложный. Оператор EXISTS не может принимать значения UNKNOWN. При использовании связанных подзапросов предложение EXISTS анализирует каждую строку таблицы, на которую имеется ссылка во внешнем запросе. Главный запрос получает строки-кандидаты на проверку условия. Для каждой строки-кандидата выполняется подзапрос. Как только подзапрос находит строку, где в столбце значение удовлетворяет условию, он возвращает значение ИСТИНА внешнему запросу, который затем анализирует свою строку-кандидата. Часто EXISTS применяется с оператором NOT. Тогда запрос интерпретируется, как «не существует». Замечание! В подзапросе, указываемом в операторе EXIXTS нельзя применять агрегирующие функции.
-
Пример 1:Из таблицы студентов извлечь строки для каждого студента, сдавшего более одного предмета.SELECT *FROMSTUDENT FWHEREEXISTS(SELECTSUBJ_IDFROMEXAM_MARKS SWHEREF.STUDENT_ID=S.STUDENT_IDGROUPBYSUBJ_IDHAVINGCOUNT(SUBJ_ID)>1);
-
Пример 1:Из таблицы студентов извлечь строки для каждого студента, сдавшего более одного предмета.SELECT *FROMSTUDENT AS FWHEREEXISTS(SELECTSUBJ_IDFROMEXAM_MARKS AS SWHEREF.STUDENT_ID=S.STUDENT_IDGROUPBYSUBJ_IDHAVINGCOUNT(SUBJ_ID)>1);
Результат запроса:
-
Оператор UNION
Используется для объединения выходных данных двух или более SQL-запросов в единое множество строк и столбцов. Использование оператора UNION возможно только при объединении запросов, соответствующие столбцы которых совместимы по объединению, то есть совпадающие числовые поля должны иметь полностью совпадающие тип и размер, символьные поля должны иметь точно совпадающее количество символов. Если NULL-значения запрещены для столбца хотя бы одного любого подзапроса объединения, то они должны быть запрещены и для всех соответствующих столбцов в других подзапросах объединения.
-
Есть таблица LECTURER: LECTURER_ID – числовой код, идентифицирующий преподавателя; SURNAME – фамилия преподавателя; NAME – имя преподавателя; CITY – город, в котором живет преподаватель; BIRTHDAY – дата рождения студента; UNIV_ID – числовой код, идентифицирующий университет, в котором преподает преподаватель.
-
Пример 1:Получить в одной таблице фамилии и идентификаторы студентов и преподавателей из Москвы.SELECT‘Студент_____’, SURNAME, STUDENT_IDFROMSTUDENTWHERECITY = ‘Москва’UNIONSELECT‘Преподаватель ’, SURNAME, LECTURER_IDFROMLECTURERWHERECITY = ‘Москва’;
-
Пример:Получить в одной таблице фамилии и идентификаторы студентов и преподавателей из Москвы.
Результат запроса: SELECT‘Студент’ AS STATUS, SURNAME, STUDENT_IDFROMSTUDENTWHERECITY = ‘Москва’UNIONSELECT‘Преподаватель ’ AS STATUS, SURNAME, LECTURER_IDFROMLECTURERWHERECITY = ‘Москва’;
-
В отличие от обычных запросов UNION автоматически исключает из выходных данных дубликаты строк, например в запросе: SELECT CITY FROM STUDENT UNION SELECT CITY FROM LECTURER; Совпадающие наименования будут исключены.. Если все же необходимо в каждом запросе вывести все строки независимо от того, имеются ли такие же строки в других объединяемых запросах, то следует использовать во множественном запросе конструкцию с оператором UNION ALL. SELECTCITY FROMSTUDENT UNIONALL SELECTCITY FROMLECTURER;
-
Еще один пример использования UNION. Необходимо составить отчет, содержащий для каждой даты сдачи экзаменов сведения по каждому студенту, получившему максимальную и минимальную оценки.SELECT ‘MAX MARK’, A.STUDENT_ID, SURNAME, MARK, EXAM_DATEFROM STUDENT A, EXAM_MARKS BWHERE (A.STUDENT_ID = B.STUDENT_IDANDB.MARK= (SELECT MAX(MARK)FROMEXAM_MARKS CWHEREC.EXAM_DATE = B.EXAM_DATE))UNIONALLSELECT ‘MIN MARK’, A.STUDENT_ID, SURNAME, MARK, EXAM_DATEFROM STUDENT A, EXAM_MARKS BWHERE (A.STUDENT_ID = B.STUDENT_IDANDB.MARK= (SELECT MIN(MARK)FROMEXAM_MARKS CWHEREC.EXAM_DATE = B.EXAM_DATE));
-
В приведенном запросе агрегирующие функции используются в подзапросах. Это является нетрадиционным с точки зрения времени, затрачиваемого на выполнение запроса. Более эффективна форма запроса, возвращающего аналогичный результат. SELECT ‘MAX MARK’, A.STUDENT_ID, SURNAME, E.MARK, E.EXAM_DATE FROM STUDENT A,(SELECT B.STUDENT_ID, B.MARK, B.EXAM_DATE FROMEXAM_MARKS B, (SELECT MAX(MARK) AS MAX_MARK, C.EXAM_DATE FROMEXAM_MARKS C GROUPBYC.EXAM_DATE) D WHEREB.EXAM_DATE = D.EXAM_DATE AND B.MARK = MAX_MARK) E WHERE A.STUDENT_ID = E.STUDENT_ID UNIONALL SELECT ‘MIN MARK’, A.STUDENT_ID, SURNAME, E.MARK, E.EXAM_DATE FROM STUDENT A,(SELECT B.STUDENT_ID, B.MARK, B.EXAM_DATE FROMEXAM_MARKS B, (SELECT MIN(MARK) AS MIN_MARK, C.EXAM_DATE FROMEXAM_MARKS C GROUPBY C.EXAM_DATE) D WHEREB.EXAM_DATE = D.EXAM_DATEAND B.MARK = MIN_MARK) E WHERE A.STUDENT_ID = E.STUDENT_ID;
-
Предложение ORDER BY применяется для упорядочения выходных данных объединения запросов так же, как и для отдельных запросов. Модифицировать предыдущий пример, добавив упорядочение по фамилиям студентов и датам экзаменов можно с помощью добавления последней строки в запрос ORDERBY SURNAME, E.EXAM_DATE;
-
Есть таблица UIVERSITY: UNIV_ID – идентификатор университета; UNIV_NAME – название университета; RATTING – рейтинг университета; CITY – город, в котором расположен университет.
-
Пример1:Составить список студентов с указанием наименования университета для тех студентов, у которых эти данные есть, но при этом не исключая и студентов, у которых университет не указан.SELECTSURNAME, NAME, UNIV_NAMEFROMSTUDENT, UNIVERSITYWHERESTUDENT.UNIV_ID = UNIVERSITY.UNIV_IDUNIONSELECTSURNAME, NAME, ‘UNKNOWN UNIV’FROMSTUDENTWHEREUNIV_ID IS NULLORDERBY1;
Связь с таблицей UNIVERSITY
-
Результат запроса:
-
Оператор JOIN
Если в операторе SELECT после ключевого слова FROM указывается не одна, а две таблицы, то в результате выполнения запроса, в котором отсутствует предложение WHERE, каждая строка одной таблицы будет соединена с каждой строкой второй таблицы. Такая операция называется декартовым произведением или полным соединением таблиц. Сама по себе эта операция не имеет практического значения, более того, при ошибочном использовании может привести к неожиданным нештатным ситуациям. Соединение таблиц имеет смысл, в случае, если объединяются не все строки исходных таблиц, а только нужные пользователю. Такое ограничение может быть осуществлено с применением предложения WHERE.
-
Пример 1:Получить фамилии студентов и для каждого студента – названия университетов, расположенных в городе, где живет студент. Т.е. необходимо получить все комбинации записей о студентах и университетах в двух таблицах, в которых значение поля CITY совпадает.SELECTSTUDENT.SURNAME, UNIVERSITY.UNIV_NAME, STUDENT.CITYFROMSTUDENT, UNIVERSITYWHERESTUDENT.CITY = UNIVERSITY.CITY;
-
Результат запроса:
-
Соединение, использующее предикаты, основанные на равенствах, называется эквисоединением. Рассмотренный пример соединения таблиц относится к виду внутреннего (INNER) соединения. При этом соединяются только те строки, для которых истинным является предикат, задаваемые в предложении ON выполняемого запроса. Приведенный выше пример может быть записан иначе с использованием ключевого слова JOIN. SELECTSTUDENT.SURNAME, UNIVERSITY.UNIV_NAME, STUDENT.CITY FROMSTUDENT INNERJOIN UNIVERSITY ON STUDENT.CITY = UNIVERSITY.CITY; Ключевое слово INNER в запросе может быть опущено, так как эта опция в запросе JOIN действует по умолчанию.
-
Пример полного соединения таблиц с использованием JOIN: SELECT* FROMSTUDENT JOIN UNIVERSITY; В Access данный запрос не идет. JOIN не поддерживается в Oracle.
-
Операции объединения таблиц
Информация из таблиц студентов и экзаменационных оценок связана посредством поля STUDENT_ID. Причем в данном соединении поддерживается требование целостности по ссылкам. База данных обладает свойством ссылочной целостности, когда для любой пары связанных внешним ключом отношений в ней условие ссылочной целостности выполняется. Если вышеприведённое условие не выполняется, говорят, что в базе данных нарушена ссылочная целостность. Такая БД не может нормально эксплуатироваться, так как в ней разорваны логические связи между зависимыми друг от друга фактами. Непосредственным результатом нарушения ссылочной целостности становится то, что корректным запросом не всегда удаётся получить корректный результат.
-
SELECTSURNAME, MARK, SUBJ_IDFROMSTUDENT, EXAM_MARKSWHERESTUDENT.STUDENT_ID = EXAM_MARKS.STUDENT_ID;
С оператором JOIN: SELECTSURNAME, MARK FROMSTUDENTINNERJOINEXAM_MARKSONSTUDENT.STUDENT_ID = EXAM_MARKS.STUDENT_ID; Пример 1: Получить список фамилий студентов с полученными ими оценками и идентификаторами предметов. Результат запроса:
-
SELECTSUBJ_NAME, SURNAME, MARKFROMSTUDENT, SUBJECT, EXAM_MARKSWHERESTUDENT.STUDENT_ID=EXAM_MARKS.STUDENT_IDAND SUBJECT.SUBJ_ID = EXAM_MARKS.SUBJ_IDAND EXAM_MARKS.MARK = 3;
С оператором JOIN: SELECTSUBJ_NAME, SURNAME, MARK FROMSTUDENT INNERJOIN SUBJECT INNERJOINEXAM_MARKSON STUDENT.STUDENT_ID=EXAM_MARKS.STUDENT_IDANDSUBJECT.SUBJ_ID = EXAM_MARKX.SUBJ_IDANDEXAM_MARKS.MARK = 3; Пример 2: Найти фамилии всех студентов, получивших неудовлетворительную оценку, вместе с названиями предметов, по которым получена эта оценка. Результат запроса:
-
Внешнее соединение таблиц
Получить записи о студентах с полученной оценкой и идентификатором предмета, включая тех, которые еще не сдавали экзамены и которые следовательно отсутствуют в таблице EXAM_MARKS. Левое внешнее соединение: SELECTSURNAME, MARK FROMSTUDENT LEFTOUTERJOIN EXAM_MARKS ON STUDENT.STUDENT_ID = EXAM_MARKS.STUDENT_ID; При использовании левого соединения расширение выводимой таблицы осуществляется за счет записей входной таблицы, имя которой указано слева от оператора JOIN. Правое внешнее соединение: SELECTSURNAME, MARK FROMEXAM_MARKS RIGHTOUTERJOIN STUDENT ON STUDENT.STUDENT_ID = EXAM_MARKS.STUDENT_ID; Здесь таблица STUDENT, за счет записей которой осуществляется расширение выводимой таблицы, указана справа от оператора JOIN.
Нет комментариев для данной презентации
Помогите другим пользователям — будьте первым, кто поделится своим мнением об этой презентации.