БАЗЫ ДАННЫХ ЯЗЫК СТРУКТУРИРОВАННЫХ ЗАПРОСОВ SQL - Structured Query Language 1 ПЕРВОЕ ПРЕДСТАВЛЕНИЕ О РЕЛЯЦИОННЫХ СУБД Id Name Address Status 1111111 John 123 main freshman 2345678 Mary 456 cedar sophmore 4433322 Art 77 so. 3rd senior 7654321 Pat 88 no. 4th sophmore Student 2 ПЕРВИЧНЫЙ КЛЮЧ – ВНЕШНИЙ КЛЮЧ a1 v1 v2 v3 v4 -v3 R1 Внешний ключ a2 v3 v5 v1 v6 v2 v7 v4 R2 Первичный ключ 3 ПЕРВИЧНЫЙ КЛЮЧ – ВНЕШНИЙ КЛЮЧ EMP WORKS ENO ENAME TITLE E1 E2 E3 E4 E5 E6 E7 E8 J. Doe M. Smith A. Lee J. Miller B. Casey L. Chu R. Davis J. Jones Elect. Eng. Syst. Anal. Mech. Eng. Programmer Syst. Anal. Elect. Eng. Mech. Eng. Syst. Anal. ENO PNO E1 E2 E2 E3 E3 E4 E5 E6 E7 E7 E8 P1 P1 P2 P3 P4 P2 P2 P4 P3 P5 P3 RESP Manager Analyst Analyst Consultant Engineer Programmer Manager Manager Engineer Engineer Manager DUR 12 24 6 10 48 18 24 48 36 23 40 PROJ PNO PNAME BUDGET P1 P2 P3 P4 P5 Instrumentation Database Develop. CAD/CAM Maintenance CAD/CAM 150000 135000 250000 310000 500000 4 ОТНОШЕНИЯ: ОДИН К ОДНОМУ, ОДИН КО МНОГИМ, МНОГИЕ КО МНОГИМ ОДИН К ОДНОМУ ОДИН КО МНОГИМ МНОГИЕ КО МНОГИМ 5 РЕЛЯЦИОННАЯ МОДЕЛЬ - ТЕРМИНОЛОГИЯ СУЩНОСТЬ КОРТЕЖ АТРИБУТ ОТНОШЕНИЕ ЗАПИСЬ ПОЛЕ ТАБЛИЦА СТРОКА СТОЛБЕЦ, КОЛОНКА 6 SQL - ИСТОРИЯ Edgar Frank 'Ted' Codd (Эдгар Френк Кодд) [23.08.1923, Dorset, England - 18.04.2003, Williams Island, Florida] создал и описал концепцию реляционных баз данных и реляционную алгебру [19691970]; для проектирования БД предложил аппарат нормализации отношений 7 12 ПРАВИЛ КОДДА • Реляционная СУБД должна быть способна полностью управлять базой данных через ее реляционные возможности. • Информационное правило - вся информация в реляционной БД (включая имена таблиц и столбцов) должна определяться строго как значения в таблицах. • Гарантированный доступ - любое значение в реляционной БД должно быть гарантированно доступно для использования через комбинацию имени таблицы, значения первичного ключа и имени столбца 12 ПРАВИЛ КОДДА • Поддержка пустых значений (null value) - СУБД должна уметь работать с пустыми значениями (неизвестными или неиспользованными значениями), в отличие от значений по умолчанию и независимо для любых доменов. • Онлайновый реляционный каталог - описание БД и ее содержания должны быть представлены на логическом уровне как таблицы, к которым можно применять запросы, используя язык базы данных. • Исчерпывающий язык управления данными - по крайней мере, один из поддерживаемых языков должен иметь четко определенный синтаксис и быть всеобъемлющим. Он должен поддерживать описание структуры данных и манипулирование ими, правила целостности, авторизацию и транзакции. 12 ПРАВИЛ КОДДА • Правило обновления представлений (views) все представления, теоретически обновляемые, могут быть обновлены через систему. • Вставка, обновление и удаление - СУБД поддерживает не только запрос на отбор данных, но и вставку, обновление и удаление • Физическая независимость данных - на программы-приложения и специальные программы логически не влияют изменения физических методов доступа к данным и структур хранилищ данных. 12 ПРАВИЛ КОДДА • Логическая независимость данных - на программыприложения и специальные программы логически не влияют, в пределах разумного, изменения структур таблиц. • Независимость целостности - язык БД должен быть способен определять правила целостности. Они должны сохраняться в онлайновом справочнике, и не должно существовать способа их обойти. • Независимость распределения - на программыприложения и специальные программы логически не влияет, первый раз используются данные или повторно. • Неподрывность - невозможность обойти правила целостности, определенные через язык базы данных, использованием языков низкого уровня SQL - ИСТОРИЯ 13 SQL - ИСТОРИЯ Работы по созданию языка запросов к СУБД проводились в 1975-1979 гг. в исследовательском центре IBM. Результатом этой работы стало создание экспериментальной реляционной СУБД SYSTEM R. Одним из важнейших элементов SYSTEM R стал язык SEQUEL (Structered English Query Language) явившийся прототипом для SQL. Основными авторами языка являются Д. Чемберлен и Р. Бойс. На ряду с работами Чемберлена и Бойса в IBM развивалось другое направление в области реляционных языков, которым руководил М. Злуф. В отличае от SEQUEL это был графически-ориентированный язык для интерактивной работы. Он получил название QBE (Query-By-Example) – запросы на примерах. 14 ПРЕДЛОЖЕНИЯ SQL ОПРЕДЕЛЕНИЕ ДАННЫХ Создать: CREATE TABLE – создать таблицу CREATE INDEX – создать индекс CREATE VIEW – создать представление Удалить: DROP TABLE – удалить таблицу DROP INDEX – удалить индекс DROP VIEW – удалить представление Очистить таблицу: TRUNCATE TABLE 15 ПРЕДЛОЖЕНИЯ SQL МАНИПУЛИРОВАНИЕ ДАННЫМИ INSERT – добавить записи DELETE – удалить записи UPDATE – обновить (изменить значение) записи SELECT – выбрать 16 ПРЕДЛОЖЕНИЯ SQL СОЗДАТЬ ТАБЛИЦУ - CREATE CREATE TABLE name (column1_name column1_type, column2_name column2_type, ...); 17 ПРЕДЛОЖЕНИЯ SQL ТИПЫ ДАННЫХ ТИП ДАННЫХ ОПИСАНИЕ integer(size) int(size) smallint(size) tinyint(size) Только целые числа. Максимальное число цифр определено значением в круглых скобках. decimal(size,d) numeric(size,d) Десятичные числа с фиксированной точкой. Максимальное число значащих цифр определено size. Максимальное число цифр после запятой определено "d". float Число с плавающей точкой. char(size) Строка заданной длинны (может содержать символы, числа, и специальные характеры). varchar(size) Строка переменной длины (может содержать символы, числа, и специальные символы). Длина строки не может быть больше, чем указанная в скобках. Меньше – может! date(yyyymmdd) Дата и время. 18 ПРЕДЛОЖЕНИЯ SQL СОЗДАТЬ ТАБЛИЦУ - CREATE CREATE TABLE Student ( Id INTEGER, Name CHAR(20), Address CHAR(50), Status CHAR(10)); Id 101222333 234567890 Name Address John 10 Cedar St Mary 22 Main St Status Freshman Sophomore Student 19 ПРЕДЛОЖЕНИЯ SQL СОЗДАТЬ ТАБЛИЦУ - CREATE Значение по умолчанию CREATE TABLE Student ( Id INTEGER, Name CHAR(20) NOT NULL, Address CHAR(50), Status CHAR(10) DEFAULT ‘freshman’, PRIMARY KEY (Id)); 20 ПРЕДЛОЖЕНИЯ SQL СОЗДАТЬ ТАБЛИЦУ - CREATE Ограничения на значения CREATE TABLE Transcript ( StudId INTEGER, CrsCode CHAR(6), Semester CHAR(6), Grade CHAR(1), CHECK (Grade IN (‘A’, ‘B’, ‘C’, ‘D’, ‘F’)), CHECK (StudId > 0 AND StudId < 1000000000) ); 21 ПРЕДЛОЖЕНИЯ SQL СОЗДАТЬ ТАБЛИЦУ - CREATE Ограничения на значения (продолжение) CREATE TABLE Employee ( Id INTEGER, Name CHAR(20), Salary INTEGER, MngrSalary INTEGER, CHECK ( MngrSalary > Salary)); 22 ПРЕДЛОЖЕНИЯ SQL СОЗДАТЬ ТАБЛИЦУ - CREATE CREATE TABLE Teaching ( ProfId INTEGER, CrsCode CHAR (6), Semester CHAR (6), PRIMARY KEY (CrsCode, Semester), FOREIGN KEY (ProfId) REFERENCES Professor (Id) ON DELETE NO ACTION ON UPDATE CASCADE, FOREIGN KEY (CrsCode) REFERENCES Course (CrsCode) ON DELETE SET NULL ON UPDATE CASCADE ); 23 ПРЕДЛОЖЕНИЯ SQL СОЗДАТЬ ИНДЕКС - CREATE CREATE [UNIQUE] INDEX index_name ON table_name (column_name) CREATE INDEX PersonIndex ON Person (LastName) CREATE INDEX PersonIndex ON Person (LastName DESC) DESC – убывание ASC - возрастание CREATE INDEX PersonIndex ON Person (LastName, FirstName) ПРЕДЛОЖЕНИЯ SQL УДАЛЕНИЕ ТАБЛИЦ И ДАННЫХ DROP TABLE Students; Удалить таблицу полностью TRUNCATE TABLE Students; Удалить все записи из таблицы 25 ПРЕДЛОЖЕНИЯ SQL МОДИФИКАЦИЯ ТАБЛИЦ Добавить столбец в таблицу ALTER TABLE table_name ADD column_name datatype Person: LastName FirstName Pettersen Kari Address Storgt 20 ALTER TABLE Person ADD City varchar(30); Person: LastName FirstName Address City Pettersen Kari Storgt 20 26 ПРЕДЛОЖЕНИЯ SQL МОДИФИКАЦИЯ ТАБЛИЦ Удалить столбец из таблицы ALTER TABLE table_name DROP COLUMN column_name Person: LastName FirstName Address City Pettersen Kari Storgt 20 ALTER TABLE Person DROP COLUMN Address Person: LastName FirstName City Pettersen Kari 27 ПРЕДЛОЖЕНИЯ SQL ДОБАВЛЕНИЕ ЗАПИСЕЙ - INSERT INSERT INTO "table_name" ("column1", "column2", ...) VALUES ("value1", "value2", ...); INSERT INTO Store_Information (store_name, Sales, Date) VALUES ('Los Angeles', 900, 'Jan-10-1999'); INSERT INTO "table1" ("column1", "column2", ...) SELECT "column3", "column4", ... FROM "table2" ; INSERT INTO Store_Information (store_name, Sales, Date) SELECT store_name, Sales, Date FROM Sales_Information WHERE Year(Date) = 1998 ; 28 ПРЕДЛОЖЕНИЯ SQL ИЗМЕНЕНИЕ УЖЕ СУЩЕСТВУЮЩИХ ЗАПИСЕЙ UPDATE UPDATE "table_name" SET "column_1" = [new value], "column_2" = [new value]… WHERE {condition} Store_Information store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 Los Angeles $300 Jan-08-1999 Boston $700 Jan-08-1999 Store_Information UPDATE Store_Information SET Sales = 500 WHERE store_name = "Los Angeles" AND Date = "Jan-08-1999"; store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 Los Angeles $500 Jan-08-1999 Boston $700 Jan-08-1999 UPDATE TABLE "table_name" SET ("column_1", "column_2") = ([new value 1], [new value 2]) WHERE {condition} 29 ПРЕДЛОЖЕНИЯ SQL УДАЛЕНИЕ ЗАПИСЕЙ - DELETE DELETE FROM "table_name" WHERE {condition} Store_Information store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 Los Angeles $300 Jan-08-1999 Boston $700 Jan-08-1999 DELETE FROM Store_Information WHERE store_name = ‘Los Angeles’; Store_Information store_name Sales Date San Diego $250 Jan-07-1999 Boston $700 Jan-08-1999 30 ПРЕДЛОЖЕНИЯ SQL ВЫБОРКА - SELECT SELECT [предикат] { * | таблица.* | [таблица.]поле_1 [AS псевдоним_1] [, [таблица.]поле_2 [AS псевдоним_2] [, ...]]} FROM выражение [, ...] [IN внешняяБазаДанных] [WHERE... ] [GROUP BY... ] [HAVING... ] [ORDER BY... ] [WITH OWNERACCESS OPTION] 31