
lecture_8_15_10_14_2003.ppt
- Количество слайдов: 21
Лекция 8 -2014_2015 модуль 2 1. Выражение WHERE 2. Предложение FROM 3. Объединение таблиц за счет условия в предложении WHERE 4. Объединение с использованием предложения JOIN 1
Команда SELECT применяется для извлечения строк, выбранных из одной или нескольких базовых таблиц или представлений. SELECT [TOP n |DISTINCT | DISTINCTROW|ALL] select_выражение, . . . [INTO {OUTFILE | DUMPFILE} ‘file‘ options] [FROM источник_записей ] [WHERE условия_отбора_записей] [GROUP BY {атрибут | формула} [ASC | DESC], . . . ] [HAVING фильтр_группы] [ORDER BY {атрибут | формула} [ASC | DESC], . . . ] [LIMIT колич_строк ] 2
Выражение WHERE задает условие отбора. Отбираются те записи, для которых значение предиката= true, т. е. логическое выражение раздела WHERE оператора выборки разрешает выборку строки в том и только в том случае, когда результатом вычисления логического выражения на данной строке является true (значения false и uknown не являются разрешающими). В выражении WHERE можно использовать любую из функций, которая поддерживается в My. SQL. Логические операторы: Not, Or, And, Xor, Eqv. Операции сравнения (реляционные): = Равно >= Больше или равно > Больше чем <= Меньше или равно < Меньше чем <> Не равно 3
Выражение WHERE Примеры 1. Выдать всех пациентов, проживающих на Сумской, в доме 8, в квартире 1: Select Фам From Пациенты and(Дом=“ 8”) and (Кв=1)); Where ( (Ул=“Сумская”) 2. Выдать всех пациентов, кроме тех, кто проживает на Сумской в квартире 1 дома 8: Select Фам From Пациенты Where ((Улица=“Сумская”) and (Дом=“ 8”) and (Кв=1)); Not 3. Выдать всех пациентов, проживающих на Сумской или Пушкинской: Select Фам From Пациенты or(Улица=“Пушкинская”)); Where ((Улица=“Сумская”) Чем отличается от оператора ? Select Фам From Пациенты Xor(Улица=“Пушкинская”)); Where ((Улица=“Сумская”) 4
Оператор IN определяет набор значений, которому данное значение может принадлежать или не принадлежать (NOT IN). Примеры: 1. Выдать Пушкинской. всех пациентов, проживающих на Сумской или Вариант № 1: Select Фам From Пациенты or(Улица=“Пушкинская”)); Where ((Улица=“Сумская”) Вариант № 2: Select Фам From Пациенты (“Сумская”, “Пушкинская”)); Where (Улица IN 2. Выдать всех пациентов, которые не живут на Сумской и Пушкинской: Select Фам From Пациенты Where (Улица NOT IN (“Сумская”, “Пушкинская”)); 5
Оператор BETWEEN … AND Сравнивает значение с заданным диапазоном, границы включаются: a between b and c a>=b and a<=c Пример: Select Фам, Имя, Отч From Врачи Where (Стаж Between 5 and 10); Not BETWEEN … AND границы не включаются: a not between b and c ac Пример: Select Фам, Имя, Отч From Врачи Where (Стаж Not Between 3 and 20); Как и все операторы сравнения BETWEEN AND действует на символьных полях, представленных в двоичном AXCII эквиваленте. Select Фам, Имя, Отч From Врачи Where Left(Фам, 1) Between “А” and “Г”); 6
Оператор LIKE Отыскивает строки, сравнивая их с образцом (паттерн, шаблон), применим только ко строкам (CHAR, VARCHAR). Типы групповых символов используемых с LIKE: любой одиночный символ (ACCESS - ? , My. SQL- _) любое количество символов (ACCESS - * , My. SQL- %) Примеры 1. Найти всех пациентов, фамилия которых начинается на Ф ACCESS: Select Фам From Пациент Where (Фам Like “Ф*”); My. SQL: Select Fam From Pacient Where (Fam Like ‘Ф%’); Или Select Fam From Pacient Where Left(Fam, 1) Like ‘Ф’; 2. Найти всех, у кого фамилии не начинаются с буквы Ф: Select Fam From Pacient Where Left(Fam, 1)NOT Like‘Ф’; 7
Работа c датой и временем, а также с функциями даты времени в My. SQL Access Форматы даты в My. SQL и Access различны: YYYY-MM-DD My. SQL DD. MM. YYYY Access Примеры функций при работе с датой и временем: 1. Функция YEAR выделяет год из даты: Пример: Запрос на вывод ФИО, даты рождения и полного возраста в My. SQL может выглядеть следующим образом: Select FIO, BIRTH, Current_Date, ( YEAR(Current_Date)YEAR(BIRTH))-(RIGHT(Current_Date, 5)< RIGHT(BIRTH, 5))) as age From Table; Функция RIGHT(Current_Date, 5) выделяет 5 крайних справа символов, т. е. MM-DD и сравнивает два значения, результат работы сравнения 0 или 1. 8
Работа c датой и временем, а также с функциями даты времени в My. SQL Access В Access для вывода полного возраста можно использовать следующие возможности: 1. SELECT Doctor. Name, Doctor. Birth, Birth)/365) AS Age FROM Doctor; Int((Date()- Этот запрос будет давать не верные результаты за счет наличия високосных лет. Сколько дней накопилось в разнице – на столько будет велика ошибка. Пусть текущая дата 01. 03. 2010 Name Новый Новенький Новехонький Новик Номик Нетик Birth 28. 02. 2000 01. 03. 2000 02. 03. 2000 04. 03. 2000 05. 03. 2000 Age 10 10 9 9 9
Работа датой и временем, а также с функциями даты времени в My. SQL Access В Access есть замечательная функция Date. Diff, которая тоже дает не верные результаты вблизи даты рождения. SELECT Name, Birth, Date. Diff("yyyy", Birth, Date()) AS Age FROM Doctor; В данном примере функция Date. Diff возвращаем количество лет между указанной датой и текущей датой. Name Новый Новенький Новехонький Новик Номик Нет Birth 28. 02. 2000 01. 03. 2000 02. 03. 2000 04. 03. 2000 05. 03. 2000 01. 04. 2000 Age 10 10
Функция IIF В Access есть функция Iif, которую можно использовать при написании условий выполнения макрокоманд в макросах. Функция Iif возвращает одну из двух частей в зависимости от оценки выражения. Iif( условие(true/false), оператор1(true), оператор2(false)) Смысл в том, чтобы отнять 1 от результата грубого подсчета возраста, который выглядит как Year(Now()) -Year(Birth) SELECT Name, Birth, Date() AS Текущая_Дата, Year(Now()) -Year(Birth) – (Iif( (Date. Part("m", Now())
Предложение FROM - Указывает таблицы или представления, которые содержат поля, перечисленные в команде SELECT. Объединение таблиц за счет условия в предложении Where 12
Примеры id_sec Name 1 аэробика 2 плавание с кругом Иванов И. И. дон Румата 3 4 1 2 волейбол бег на месте аэробика плавание с кругом 3 3 4 4 Результат представляет собой декартово произведение 24 записи, 4 столбика id_tr Fio 2 Иванов И. И. 2 2 3 3 А) SELECT * from Trener, Section; дон Румата Карась В. Н. 3 4 1 2 волейбол бег на месте аэробика плавание с кругом 4 4 5 Карась В. Н. 3 Карась В. Н. 4 Максимова А. П. 1 волейбол бег на месте аэробика 5 Максимова А. П. 2 плавание с кругом 5 Максимова А. П. 3 волейбол 5 Максимова А. П. 4 бег на месте 10 10 Чирик З. П. 1 2 аэробика плавание с кругом 10 10 11 11 Чирик З. П. Оболенский К. 3 4 1 2 волейбол бег на месте аэробика плавание с кругом 11 11 Оболенский К. 3 4 волейбол бег на месте 13
Б) Запрос SELECT * from Trener, Trener_Section; Результат представляет собой декартово произведение 36 записей, 4 столбика в) Запрос SELECT * from Trener, Section, Trener_Section; Результат представляет собой декартово произведение 6* 4 * 6 = 144 записи, 7 столбиков Г) Запрос SELECT * from Trener, Trener_Section Where Trener. id_tr=Trener_Section. id_tr; Может иметь смысл как выдать всех тренеров и информацию по секциям, кто в данный момент ведет секции. id_tr 2 3 3 4 5 5 Fio Иванов И. И. дон Румата Карась В. Н. Максимова А. П. Id_tr_sec 3 1 2 5 4 6 id_tr 2 3 3 4 5 5 id_sec 1 2 4 3 1 3 Результат: 6 строк, 5 столбиков. Использовано соединение таблиц по эквивалентности. 14
Д) Изменим запрос: SELECT Fio, Birth From Trener, Trener_Section Where (Trener. id_tr=Trener_Section. id_tr); Е) Еще раз изменим запрос: SELECT Distinct Fio, Birth From Trener, Trener_Section Where(Trener. id_tr=Trener_Section. id_tr); 15
Ж) Введем ограничение по возрасту: SELECT Distinct Fio, Birth From Trener, Trener_Section Where (Trener. id_tr=Trener_Section. id_tr) and (Year(Birth)>1940); З) Выдать всех тренеров и названия секций, которые они ведут: SELECT Fio, Name From Trener, Section, Trener_Section Where (Trener. id_tr=Trener_Section. id_tr) And (Section. id_sec=Trener_Section. id_sec); 16
Объединение таблиц с использованием предложение JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в раздел FROM операторов SELECT, UPDATE или DELETE. FROM таблица 1 [ INNER| LEFT| RIGHT|OUTER ] JOIN таблица 2 ON таблица 1. поле 1 оператор_сравнения таблица 2. поле 2 Операция INNER JOIN (внутреннее объединение) состоит из следующих компонентов. Аргумент таблица 1, таблица 2 поле 1, поле 2 оператор_сравнения Описание Имена таблиц, из которых объединяются записи Имена связываемых полей. Если поля не содержат числовых данных, они должны относиться к одному типу данных и содержать некоторые данные. Имена этих полей могут быть разными. Любой оператор сравнения: «=» , «<» , «>» , «<=» , «>=» или «<>» 17
Оператор JOIN Операцию INNER JOIN можно использовать в любом предложении FROM. Это самый распространенный тип объединения. С его помощью происходит объединение записей из двух таблиц по связующему полю, если оно содержит одинаковые значения в обеих таблицах. Табл. «Пац» Код. П 1 2 3 4 6 Фам Крутой Семенов Орлова Онегин Вий PK- Код. П Табл. «Флю» Код. Ф 1 2 3 4 5 6 7 Дата. Ф 10. 2008 20. 03. 2008 30. 12. 2009 05. 12. 2009 09. 10. 2009 30. 12. 2009 25. 12. 2009 Рез ок бр ок ок пн Код. П 1 1 1 2 3 3 FK- Код. П 18
Оператор JOIN Пример 1. Найти всех , кто делал хоть один раз Флюорографию (ФЛЮ) Select Фам, Дата. Ф, Рез From Пац INNER JOIN Флю ON Пац. Код. П =Флю. Код. П; Пац Флю Результат: Фам Крутой Семенов Орлова Дата. Ф 10. 2001 20. 03. 2002 30. 12. 2005 05. 12. 2005 09. 10. 2005 30. 12. 2005 Рез ок бр ок ок пн ок 19
Оператор JOIN Используйте операцию LEFT JOIN, чтобы создать левое внешнее объединение. OUTER – показывает, что это внешнее объединение. С помощью левого внешнего объединения выбираются все записи первой (левой) таблицы, даже если они не соответствуют записям во второй (правой) таблице. Пац Флю Пример 2. SELECT Фам, Дата. Ф, Рез From Пац LEFT OUTER JOIN Флю ON Пац. Код. П =Флю. Код. П; Результат: Фам Крутой Семенов Орлова Онегин Вий Дата. Ф 10. 2001 20. 03. 2002 30. 12. 2005 05. 12. 2005 09. 10. 2005 30. 12. 2005 null Рез ок бр ок ок пн ок null Используйте операцию RIGHT JOIN, чтобы создать правое внешнее 20 объединение.
Значение NULL Оператор IS NULL используется для сравнения текущего значения со значением NULL – специальным значением, указывающим на отсутствие любого значения. NULL – это не то же самое, что знак пробела (пробел – допустимый символ) или ноль (0 – допустимое число). NULL отличается и от строки нулевой длины (пустой строки). IS NOT NULL используется для проверки присутствия значения в поле. Пример 3 Найти всех пациентов, которые не проходили флюорографию: Select Фам, Дата. Ф, Рез From Пац LEFT JOIN Флю ON Пац. Код. П = Флю. Код. П Where (Флю. Код. П is null); Фам Онегин Вий Дата. Ф null Рез null Пример 4 Найти все ошибочные записи в журнале регистрации, когда не указан пациент Select Код. Ф, Дата. Ф, Рез From Пац RIGHT JOIN Флю ON Пац. Код. П= Флю. Код. П Where (Пац. Код. П is null); Код. Ф 7 Дата. Ф 25. 12. 2005 Рез пн 21