Guest User

Untitled

a guest
May 25th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 36.41 KB | None | 0 0
  1. 1. Прости заявки
  2.  
  3. Езикът за създаване на заявки към релационни СУБД
  4. (Система за Управление на Бази от Данни) - SQL
  5.  
  6. СУБД = DBMS (Database Management System)
  7.  
  8. SQL - Structured Query Language
  9.  
  10. В името на примерите, дефинираме релацията - Movie(title, year, length, incolor, studioName, producerC#)
  11.  
  12. Примерна заявка:
  13. SELECT *
  14. FROM Movie
  15. WHERE studioName='Disney' AND year=1990
  16.  
  17. - във FROM клаузата - изброяваш релациите, към които се отнася заявката
  18. - в WHERE клаузата - задаваш условията, които трябва да бъдат удовлетворени от кортежите, за да отговорят на заявката (кортеж = query ?)
  19. - SELECT - задава кои атрибути на кортежите (удовлетворяващи условията от WHERE клаузата) да бъдат изведени
  20.  
  21. Сравняване на низове:
  22. - С оператор за сравнение '='
  23. - С шаблон чрез ключовата дума LIKE
  24. s LIKE p (s - низ, p - шаблон)
  25. шаблони - низове, в които могат да се използват
  26. - '%' - последователност от 0 или повече символи
  27. - '_' - 1 произволен символ (като . в regex)
  28. - отрицанието на LIKE е NOT LIKE
  29.  
  30. DATETIME (???)
  31.  
  32. NULL - стойност на атрибут, когато:
  33. - не знаем, каква трябва да е стойността или няма смислена стойност, която да се зададае
  34. - NB: може изрично да се зададе определени атрибути да не могат да приемат стойност NULL
  35. - NULL стойностите не удовлетворяват нито едно условие освен IS NULL
  36. - резултати от сравнение - TRUE или FALSE; Върху стойности с NULL - UNKNOWN (виж табличката в слайдовете за повече инф.)
  37.  
  38. Сортиране на резултата:
  39. - Указва се чрез клаузата ORDER BY
  40. - ORDER BY <list of attributes or expressions> [ASC|DESC]
  41. - Пример:
  42. SELECT *
  43. FROM Movie, MovieExec
  44. WHERE "PRODUCERC#"="CERT#"
  45. ORDER BY title ASC;
  46. - NB: ASC by default
  47.  
  48. 2. Заявки върху две или повече релациите
  49.  
  50. Пример:
  51. Movie(title, year, length, incolor, studioName, producerC#)
  52. MovieExec(name, address, cert#, networth)
  53.  
  54. SELECT name
  55. FROM Movie, MovieExec
  56. WHERE title='Star Wars' AND producerC#=cert#;
  57.  
  58. При дублиране на имена на атрибути:
  59. Ако имаме релациите:
  60. MovieStar(name, address, gender, birthdate)
  61. MovieExec(name, address, cert#, networth)
  62.  
  63. Тогава вместо:
  64. SELECT name
  65. FROM MovieStar, MovieExec
  66.  
  67. Ползваме:
  68. SELECT MovieStar.name, MovieExec.name
  69. FROM MovieStar, MovieExec
  70.  
  71. Обединение, сечение и разлика:
  72.  
  73. SQL предлага оператори, с които можем да изпълняваме едноименните операции на релационната алгебра - UNION, INTERSECT, EXCEPT
  74.  
  75. UNION - пример:
  76. Ако имаме релациите:
  77. Movie(title, year, length, incolor, studioName, producerc#)
  78. StarsIn(movieTitle, movieYear, starName)
  79.  
  80. (SELECT title, year FROM Movie)
  81. UNION
  82. (SELECT movieTitle, movieYear FROM StarsIn)
  83.  
  84. NB: двете заявки трябва да връщат таблици, за които:
  85. - Броят на колоните е еднакъв
  86. - Колоните от двете таблици са със съвместими типове
  87. - Имената НЕ е нужно да съвпадат
  88.  
  89. INTERSECT - пример:
  90. Ако имаме релациите:
  91. MovieStar(name, address, gender, birthdate)
  92. MovieExec(name, address, cert#, networth)
  93.  
  94. (SELECT name, address FROM MovieStar WHERE gender='F')
  95. INTERSECT
  96. (SELECT name, address FROM MovieExec WHERE networth > 10000000)
  97.  
  98. EXCEPT - пример:
  99. Ако имаме релациите:
  100. MovieStar(name, address, gender, birthdate)
  101. MovieExec(name, address, cert#, networth)
  102.  
  103. (SELECT name, address FROM MovieStar)
  104. EXCEPT
  105. (SELECT name, address FROM MovieExec)
  106. ORDER BY address
  107.  
  108. NB: Релациите са мултимножества
  109. - Отстраняване на повторенията чрез ключовата дума DISTINCT
  110. - UNION, INTERSECT и EXCEPT - повтарящите се кортежи се премахват автоматично. За запазване на повтарящите се кортежи се използват - UNION ALL, INTERSECT ALL, EXCEPT ALL
  111.  
  112. 3. Подзаявки
  113.  
  114. Заявки, които са част от други заявки
  115.  
  116. Подзаявките се ограждат със ()
  117.  
  118. Подзаявките могат да връщат:
  119. - единствена скаларна стойност
  120. - списък от стойности
  121. - релация
  122.  
  123. Нека R е релация, а L е списък от стойности:
  124. - EXISTS(R) - връща TRUE, ако R има кортежи
  125. - s IN (L) - връща TRUE, ако s е сред елементите на L
  126. - s NOT IN (L) - връща TRUE, ако s НЕ е сред елементите на L
  127. - s > ALL(L) - връща TRUE, ако s е по-голям от всеки един елемент на L
  128. - s > ANY(L) - връща TRUE, ако s е по-голям от поне 1 от елементите на L
  129.  
  130. Пример:
  131. Имаме релациите:
  132. MovieStar(name, address, gender, birthdate)
  133. StarsIn(movieTitle, movieYear, starName)
  134.  
  135. - () връща скалар:
  136. SELECT *
  137. FROM StarsIn
  138. WHERE starname = (SELECT name
  139. FROM MovieStar
  140. WHERE address='X path');
  141.  
  142. - () връща списък:
  143. SELECT *
  144. FROM StarsIn
  145. WHERE starName in (SELECT name
  146. FROM MovieStar
  147. WHERE gender='M');
  148.  
  149. Корелативни подзаявки:
  150. - Това е подзаявка, която има зависимост от заявката, в която участва.
  151.  
  152. Пример:
  153. Заявка, която извежда заглавия на филми, които са използвани в поне два филма (от различни години):
  154. SELECT DISTINCT title
  155. FROM movie M
  156. WHERE year < ANY (SELECT year
  157. FROM movie
  158. WHERE title = M.title);
  159.  
  160. Подзаявки във FROM клаузата:
  161.  
  162. Пример:
  163. SELECT movieTitle, starName, birthdate
  164. FROM StarsIn s, (SELECT name, birthdate
  165. FROM MovieStar
  166. WHERE gender='M') t
  167. WHERE s.starname=t.name;
  168.  
  169. 4. Свързване на таблици
  170.  
  171. SELECT *
  172. FROM MovieExec m1, Movie m2
  173. WHERE m1.PrCert# = m2.PrCert#
  174.  
  175. е същото като
  176.  
  177. SELECT *
  178. FROM MovieExec m1 JOIN Movie m2
  179. ON m1.PrCert# = m2.PrCert#
  180.  
  181. CROSS JOIN:
  182. Синтансис:
  183. SELECT *
  184. FROM MovieExec CROSS JOIN Movie;
  185.  
  186. - прави точно каквото очакваш да прави - декартово произведение на елементите от MovieExec с елементите от Movie
  187.  
  188. inner JOIN (Theta Join):
  189. Синтаксис:
  190. SELECT *
  191. FROM MovieExec m1 [inner] JOIN Movie m2
  192. ON m1.PrCert#=m2.PrCert#;
  193.  
  194. - все едно сечение на многествата от елементите на m1 и m2
  195.  
  196. LEFT JOIN:
  197. Синтаксис:
  198. SELECT *
  199. FROM MovieExec m1 LEFT [outer] JOIN Movie m2
  200. ON m1.PrCert# = m2.PrCert#;
  201.  
  202. - сечението на двете множества + елементите от m1, които не са обединени с елементи на m2, но с попълнени NULL стойности на местата, където би трябвало да стоят колоните от m2
  203.  
  204. RIGHT JOIN:
  205. Синтаксис:
  206. SELECT *
  207. FROM MovieExec m1 RIGHT [outer] JOIN Movie m2
  208. ON m1.PrCert# = m2.PrCert#;
  209.  
  210. - аналогично на LEFT JOIN но + елементите на m2, които не са обединени с елементи на m1, но с попълнени NULL стойности на местата, където би трябвало да стоят колоните от m1
  211.  
  212. FULL JOIN:
  213. Синтаксис:
  214. SELECT *
  215. FROM MovieExec m1 FULL [outer] JOIN Movie m2
  216. ON m1.PrCert# = m2.PrCert#;
  217.  
  218. - резултатът от LEFT JOIN обединен с резултата от RIGHT JOIN
  219.  
  220. 5. Групиране и агрегация
  221.  
  222. Агрегатни функции:
  223. - SUM (expression)
  224. - AVG (expression)
  225. - MIN (expression)
  226. - MAX (expression)
  227. - COUNT (expression)
  228.  
  229. Използване на DISTINCT:
  230. Пример:
  231. COUNT (DISTINCT column)
  232.  
  233. Примери:
  234. SELECT AVG(netWorth)
  235. FROM MovieExec
  236.  
  237. SELECT COUNT(*)
  238. FROM StarsIn
  239.  
  240. SELECT COUNT(DISTINCT starName)
  241. FROM StarsIn
  242.  
  243. SELECT MAX(Quantity * UnitPrice * (1 - Discount))
  244. FROM "Order Details"
  245.  
  246. Групиране:
  247. GROUP BY
  248.  
  249. Пример:
  250. SELECT studioName, SUM(length)
  251. FROM Movie
  252. GROUP BY studioName
  253.  
  254. Правила при групиране:
  255. - могат да се групират по един или няколко атрибута (израза)
  256. - при групиране, в SELECT може да стоят само атрибутите, по които групираме и/или агрегатни функции
  257. - не можем да имаме агрегатна функция в WHERE клаузата. Може да има само обикновени функции като day(date), year(date) и т.н.
  258.  
  259. HAVING:
  260. Пример:
  261. SELECT studioName, SUM(length)
  262. FROM Movie
  263. GROUP BY studioName
  264. HAVING SUM(length) > 1000
  265.  
  266. NULL стойности в контекста на групиране и агрегация:
  267. NULL стойностите се игнорират при агрегиране
  268. - NULL стойност не може да бъде нито MIN, нито MAX
  269. - NULL стойност не влияе на сумата на стойностите по даден атрибут
  270. - При COUNT се броят само стойности, различни от NULL
  271. - Разлика между COUNT(*) и COUNT(A) (???)
  272. NULL стойностите НЕ се игнорират при групиране
  273. NULL стойностите могат да образуват група
  274.  
  275. Ред на клаузите в една SQL заявка:
  276. SELECT [DISTINCT] ...
  277. FROM ...
  278. ... JOIN ... ON ...
  279. WHERE ...
  280. GROUP BY ...
  281. HAVING ...
  282. ORDER BY ...
  283.  
  284. 6. Модификация на БД
  285.  
  286. Добавяне на кортежи:
  287. INSERT INTO R(A1, ..., An) VALUES(v1, ..., vn)
  288. - default value - NULL
  289.  
  290. Пример:
  291. INSERT INTO Battles(name, date)
  292. VALUES('Battle of the Philippine Sea', '1944-06-19'); #няма да стане по принцип, защото е твърде дълго името за полето в таблицата
  293. Ако спазим последователността на атрибутиъе от релацията, може накратко:
  294. INSERT INTO Battles VALUES('Some Battle', '1944-06-19');
  295.  
  296. Добавяне на повече от един кортеж:
  297. INSERT INTO R(A1, ..., An) <подзаявка>;
  298. Пример:
  299. INSERT INTO Studio(name)
  300. SELECT DISTINCT studioName FROM Movie
  301. WHERE studioName NOT IN
  302. (SELECT name FROM Studio);
  303. # добавя всички студиа, споменати в релацията Movie(...), но липсващи в Studio(...)
  304.  
  305. Изтриване на кортежи:
  306. DELETE FROM R WHERE <условие>;
  307.  
  308. Пример:
  309. DELETE FROM Battles
  310. WHERE name =
  311. 'Some Battle';
  312.  
  313. Промяна на стойностите в кортеж:
  314. UPDATE R SET attribute1=formula1, ...
  315. WHERE <условие>;
  316. Пример:
  317. UPDATE MovieExec
  318. SET name = 'Pres. ' || name
  319. WHERE cert# IN
  320. (SELECT presc# FROM Studio);
  321.  
  322. 7. Дефиниране на схеми на релации
  323.  
  324. Атрибутите имат типове:
  325. VARCHAR(n) - низ с дължина до n символа
  326. CHAR(n) - низ с точно n символа
  327. INT / INTEGER - цяло число, 32-битово, със знак
  328. FLOAT / REAL
  329. DECIMAL(n, d) - дробно число с n цифри, d от тях след дес. запетая
  330. DATE, TIME, DATETIME
  331. и др. - специфични за различните бази данни
  332.  
  333. Дефиниране на релационна схема:
  334. CREATE TABLE MovieStar(
  335. name VARCHAR(30),
  336. address VARCHAR(255)
  337. gender CHAR(1),
  338. birthdate DATE
  339. );
  340.  
  341. Изтриване на релация:
  342. DROP TABLE R;
  343.  
  344. Добавяне на атрибут в релация:
  345. ALTER TABLE MovieStar ADD phone CHAR(16);
  346.  
  347. Изтриване на атрибут в релация:
  348. ALTER TABLE MovieStar DROP COLUMN phone;
  349.  
  350. Задаване на стойност по подразбиране, която не е NULL:
  351. CREATE TABLE MovieStar(
  352. ...
  353. gender CHAR(1) DEFAULT '?',
  354. regdate DATE DEFAULT GETDATE()
  355. ); ##### <- така ако не посочим дата, ще се ползва текущата
  356.  
  357. ALTER TABLE MovieStar ADD phone CHAR(16)
  358. DEFAULT 'unlisted';
  359.  
  360. 8. Ограничения
  361.  
  362. Ключове и външни ключове
  363. (!) ако релация има деклариран ключ, то тя не може да съдържа еднакви кортежи
  364.  
  365. Деклариране:
  366. - чрез ключовия израз PRIMARY KEY
  367. - чрез UNIQUE
  368.  
  369. Една таблица може да има само 1 първичен (primary) ключ, но може да има много уникални ключове.
  370.  
  371. Деклариране на първичен ключ (PK)
  372. Пример:
  373. CREATE TABLE MovieStar(
  374. name CHAR(30) PRIMARY KEY,
  375. address VARCHAR(255),
  376. gender CHAR(1),
  377. birthdate DATETIME
  378. );
  379. или
  380. CREATE TABLE MovieStar(
  381. name CHAR(30),
  382. address VARCHAR(255),
  383. gender CHAR(1),
  384. birthdate DATETIME,
  385. PRIMARY KEY (name)
  386. );
  387.  
  388. Първичен ключ, състоящ се от 2 атрибута, пример:
  389. CREATE TABLE Movie(
  390. title VARCHAR(50),
  391. year INT,
  392. inColor CHAR(1),
  393. studioName VARCHAR(50),
  394. producerC# INT,
  395. PRIMARY KEY (title, year)
  396. );
  397. - ако не се зададе име на ограничението, СУБД му поставя служебно име
  398.  
  399. - име на ограничението се поставя с ключовата дума CONSTRAINT
  400. Пример:
  401. CREATE TABLE MovieStar(
  402. name CHAR(30) CONSTRAINT pk_ms PRIMARY KEY,
  403. address VARCHAR(255),
  404. gender CHAR(1),
  405. birthdate DATETIME
  406. );
  407. или
  408. CREATE TABLE MovieStar(
  409. name CHAR(30),
  410. address VARCHAR(255),
  411. gender CHAR(1),
  412. birthdate DATETIME,
  413. CONSTRAINT pk_ms PRIMARY KEY (name, birthdate)
  414. );
  415.  
  416. Деклариране на UNIQUE ключове:
  417. Разлики с PRIMARY KEY:
  418. - можем да имаме повече от 1 UNIQUE ключ
  419. - PK забранява NULL стойности, UNIQUE - не (NULL не е равно на нищо, включително и на други NULL стойности)
  420.  
  421. Пример:
  422. CREATE TABLE MovieStar(
  423. name CHAR(30) CONSTRAINT pk_ms UNIQUE,
  424. address VARCHAR(255),
  425. gender CHAR(1),
  426. birthdate DATETIME
  427. );
  428. или
  429. CREATE TABLE Movie(
  430. title VARCHAR(50),
  431. year int,
  432. length int,
  433. ...
  434. CONSTRAINT uk_ms UNIQUE(title, year)
  435. );
  436.  
  437. Деклариране на външни ключове (FOREIGN KEY):
  438. В SQL можем да декларираме атрибут(и) от една релация (child table) да бъдат външен ключ и да сочат ("реферират") атрибути от втора релация (parent table).
  439. - допуска се двете таблици да съвпадат
  440. - реферираните атрибути от втората релация трябва да бъдат декларирани като UNIQUE или PRIMARY KEY ограничения за да участват във FK декларация
  441. - стойностите на FK, появяващи се в първата релация, трябва да се появяват като стойности на реферираните атрибути в кортежите на втората релация
  442.  
  443. - REFERENCES <parent_table> (<parent_table_attributes>)
  444. Примери:
  445. CREATE TABLE Studio(
  446. name CHAR(30) PRIMARY KEY,
  447. address VARCHAR(255),
  448. presC# INT REFRENCES MovieExec(cert#)
  449. );
  450. CREATE TABLE Studio(
  451. name CHAR(30) PRIMARY KEY,
  452. address VARCHAR(255),
  453. presC# INT CONSTRAINT fk_me REFRENCES MovieExec(cert#)
  454. );
  455.  
  456. - FOREIGN KEY (<child_table_attributes>) REFERENCES <parent_table> (<parent_table_attributes>)
  457. Примери:
  458. CREATE TABLE Studio(
  459. name CHAR(30) PRIMARY KEY,
  460. address VARCHAR(255),
  461. presC# INT,
  462. FOREIGN KEY (presC#) REFERENCES MovieExec(cert#)
  463. );
  464. CREATE TABLE Studio(
  465. name CHAR(30) PRIMARY KEY,
  466. address VARCHAR(255),
  467. presC# INT,
  468. CONSTRAINT fk_me FOREIGN KEY (presC#) REFERENCES MovieExec(cert#)
  469. );
  470.  
  471. Политики за налагане на FK ограниченията:
  472. Действия, нарушаващи референтната цялост, които не се допускат от СУБД:
  473. - Вмъкване или промяна на записи от child таблицата, които нарушават референтната цялост
  474. - Изтриване или промяна на записи от parent таблицата, които нарушават референтната цялост
  475.  
  476. Каскадност:
  477. При промяна или изтриване на записи в parent таблицата, съответноте "детайлни" записи от child таблицата, които биха нарушили ограничението за референтна цялост, съответно се променят и изтриват.
  478.  
  479. Установяване на NULL стойности:
  480. CREATE TABLE Studio(
  481. name CHAR(30) PRIMARY KEY,
  482. address VARCHAR(255),
  483. presC# INT,
  484. CONSTRAINT fk_me FOREIGN KEY (presC#) REFERENCES MovieExec (cert#)
  485. ON DELETE CASCADE
  486. ON UPDATE SET NULL
  487. );
  488. (!) в MS SQL Server - "Установяване на NULL стойности" не се поддържа:
  489. [ON DELETE {CASCADE | NO ACTION}]
  490. [ON UPDATE {CASCADE | NO ACTION}]
  491.  
  492. NOT NULL ограничение:
  493. Пример
  494. ...
  495. presC#INT REFERENCE MovieExec(cert#) NOT NULL
  496.  
  497. CHECK ограничения на ниво атрибут:
  498. Примери:
  499. ...
  500. presC# INT REFERENCES MovieExec(cert#) CHECK (presC#>=100000)
  501.  
  502. или
  503.  
  504. ...
  505. gender CHAR(1) CHECK (gender in ('M', 'F'))
  506.  
  507. - би трябвал да може да е произволно WHERE условие
  508.  
  509. По-сложен пример:
  510. CREATE TABLE MovieStar(
  511. name CHAR(30),
  512. address VARCHAR(255),
  513. gender CHAR(1),
  514. birthdate DATETIME,
  515. CHECK (gender = 'F' OR name NOT LIKE 'Ms.%')
  516. );
  517.  
  518. или
  519. ...
  520. CONSTRAINT ch_ms CHECK (gender = 'F' OR name NOT LIKE 'Ms.%')
  521.  
  522. Модификация на ограниченията:
  523.  
  524. Изтриване на ограничения:
  525. ALTER TABLE table_name
  526. DROP CONSTRAINT constraint_name1, constraint_name2, ...;
  527.  
  528. Добавяне на ограничения:
  529. ALTER TABLE table_name
  530. ADD CONSTRAINT constraint_name <table constraint declaration>;
  531.  
  532. Пример:
  533. ALTER TABLE Ships
  534. ADD CONSTRAINT pk PRIMARY KEY (name);
  535.  
  536. Промяна на NOT NULL ограничения:
  537. - понеже се дефинира само на ниво колона, може да се промени чрез промяна на дефиницията на съответната колона
  538.  
  539. Пример:
  540. ALTER TABLE table
  541. ALTER COLUMN column_name
  542. { new_data_type [ (precision [, scale])]
  543. [NULL | NOT NULL] }
  544.  
  545. Обобщение:
  546. Валидни типове ограничения:
  547. - NOT NULL
  548. - UNIQUE
  549. - PRIMARY KEY
  550. - FOREIGN KEY
  551. CHECK
  552. - (!) на ниво таблица не може да се задава NOT NULL
  553.  
  554. (в pdf-a с темата има и задачи :))
  555.  
  556. 9. Индекси в MS SQL
  557.  
  558. Индекс - обект от базата данни, който помага за подреждането на данните и ускоряването на изпълнението на заявките
  559.  
  560. 2 вид индекси:
  561. - clustered
  562. - nonclustered
  563.  
  564. Структура на индексите:
  565. - реализират се чрез балансирани B-дървета
  566. - вътрешната структура на индекса зависи от типа му
  567. - ако индексът е nonclustered, вътрешната му структура се определя от наличието/отсъствието на clustered индекс
  568.  
  569. Clustered индекси:
  570. - данните се подреждат по начин, дефиниран от индекса
  571. - в листата на дървото се поместват данните, подредени по ключовите атрибути, върху които е форматиран индексът
  572. - (!) НЕ е задължително ключовите атрибути на индекса да са първичен ключ на релацията
  573. - една таблица може да има само един clustered индекс, защото данните физически се подреждат на диска според ключовите колони на индекса
  574. - по подразбиране първичният ключ (PRIMARY KEY) се създава като clustered index #затова често при заявки, не-изискващи подредба на резултатите, все пак резултатното множество е сортирано по PK
  575.  
  576. Nonclustered индекси:
  577. (като индекс в книга)
  578. - таблицата не се подрежда по структурата на индекса
  579. - пази се информация (указател/референция) за това, къде точно на диска се намират търсените данни
  580. - (за разлика от clustered индексите) са отделени от физическото съхранение на данните
  581. - в листата на дървото се намират указатели (row locators) към мястото на диска, където са разположени реалните данни
  582.  
  583. Row locator-ът се различава в зависимост, дали таблицата, върху която се дефинира nonclustered индексът, има вече дефиниран clustered index
  584.  
  585. Nonclustered index върху таблица с clustered index:
  586. - указателят представлява ключовите колони за clustered индекса (clustering key)
  587.  
  588. Nonclustered index върху таблица БЕЗ clustered index:
  589. - указателят представлява номер на страница във файла с данните + номер на ред в страницата
  590.  
  591. Кога да създаваме индекси?
  592. - върху колони като PK или FK, които се използват често в заявки и по тях се извършват съединения
  593. - за ускоряването на заявки, които търсят интервали от съседни стойности
  594. - при честа нужда от сортиране на резултатните множества по дадена съвкупност от атрибути - създаване на индекс по атрибутите, участващи в сортирането
  595. - множество от атрибути, участващи заедно при агрегиране
  596.  
  597. Кога да НЕ създаваме индекс?
  598. - колона с малък брой уникални стойности # например gender в предходните примерни - със стойности само 'M' и 'F'
  599. - колоната рядко се използва в заявки
  600.  
  601. Създаване/изтриване на индекс:
  602. CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX <index_name> ON <table_name> (column_list);
  603. и
  604. DROP INDEX <index_name> ON <table_name>;
  605.  
  606. Примери:
  607. CREATE UNIQUE CLUSTERED INDEX ci ON Movie (name, year);
  608. и
  609. DROP INDEX ci ON Movie;
  610.  
  611. 10. Изгледи
  612. Логическо представяне на подмножество от данни, съхраняващи се в една или повече таблици.
  613. - съхраняват се като SELECT оператори в речника на данните на съответната СУБД
  614. - в един изглед могат да участват, както таблици, така и други изгледи
  615.  
  616. Основна цел - да преобразуват начина, по който се вижда някаква таблица, част от таблица или група от таблици (без да се създават копия на съответните данни).
  617.  
  618. За какво се ползват?
  619. - ограничаване достъпа до данните
  620. - по-лесно изпълнение на сложни заявки
  621. - осигуряване на по-голяма независимост по отношение структурата на данните
  622. - за преименуване на колони
  623.  
  624. Типове:
  625. - прости (simple)
  626. - сложни (complex)
  627.  
  628. simple complex
  629.  
  630. бр. таблици 1 >= 1
  631.  
  632. съдържа функции не да
  633. съдържа групирани данни не да
  634. могат да изпълняват DML да не винаги
  635. (INSERT, UPDATE, DELETE)
  636. операции върху изгледа
  637.  
  638. CREATE view
  639. [(alias [, alias]...)]
  640. AS subquery
  641. [WITH CHECK OPTION]
  642.  
  643. view - име на изгледа
  644. alias - имена на изразите от заявката на изгледа (трябва да отговаря на броя изрази от изгледа)
  645. subquery - завършен SELECT оператор
  646.  
  647. note: ако искаме да подредим резултата, по-добре да приложим ORDER BY не в SELECT оператора, а заявката към изгледа
  648.  
  649. WITH CHECK OPTION - дали само редове, достъпни за изгледа могат да бъдат вмъквани и променяни
  650.  
  651. Примери:
  652. CREATE VIEW v_USA_classes
  653. AS
  654. SELECT *
  655. FROM classes
  656. WHERE country='USA';
  657.  
  658. CREATE VIEW v_Country_AvgGuns
  659. AS
  660. SELECT avg(numGuns) as average_Guns, country
  661. FROM classes
  662. GROUP BY country;
  663. - резултата от изпълнението можем да видим с:
  664. SELECT *
  665. FROM v_Country_AvgGuns
  666. ORDER BY average_Guns DESC;
  667.  
  668. Пример с таблицата с кораби:
  669. CREATE VIEW v_ships_full_info
  670. (name, type, numGuns, bore, displacement, country, launched)
  671. AS
  672. SELECT s.name, c.type, c.numGuns, c.bore, c.displacement, c.country, s.launched
  673. FROM classes c, ships s
  674. WHERE c.class = s.class
  675.  
  676. Модификация на изглед:
  677. ALTER VIEW view
  678. [(alias [, alias]...)]
  679. AS subquery
  680. [WITH CHECK OPTION]
  681.  
  682. - изгледът се пресъздава без това да се отрази на обектите, зависещи от изгледа (съхранени процедури, тригери и т.н.)
  683. - запазват се и установените права за достъп до изгледа
  684.  
  685. Модифициране на данни с използване на изгледи:
  686. - когато се модифицират данни, използвайки изглед, в действителност се актуализират данните от таблицата
  687. - това се прилага и когато се вмъкват или изтриват данни
  688.  
  689. - не може да се използват следните видове изгледи за модифициране на данни:
  690. -- изгледи с операторите за множества, поддържани от съответната СУБД
  691. -- изгледи с клаузи, съдържащи GROUP BY
  692. -- изгледи с групови функции като AVG, SUM, MAX
  693. -- изгледи използващи DISTINCT
  694.  
  695. Правила за изпълнение на DML операции върху изгледи, базирани на една таблица:
  696. - не може да се изтрива ред от изглед, ако той съдържа групови функции, групирания на данни или DISTINCT
  697. - не може да се модифицира ред от изглед, ако той съдържа групови функции, групирания на данни, DISTINCT или колони дефинирани чрез израз
  698. - не може да се добавят данни чрез изглед, ако той съдържа групови функции, групирания на данни, DISTINCT, колони дефинирани чрез израз или в базовата таблица има NOT NULL колони, които не са включени в изгледа
  699.  
  700. - можем да си гарантираме, че DML операциите изпълнени върху изгледа ще станат в областта на видимост, определена от изгледа като използваме клаузата WITH CHECK OPTION
  701.  
  702. Изтриване на изглед:
  703. DROP VIEW view;
  704.  
  705.  
  706. 11. MS SQL DML тригери
  707.  
  708. INSERT - inserted
  709. DELETE - deleted
  710. UPDATE - inserted / deleted
  711.  
  712. Подходящи за:
  713. - запазване информация за кой кога е правил промени по дадените данни
  714. - архивиране на данни
  715. - отменяне на операции
  716. - проверка състоянието на данните преди и след модификация
  717. - показване на потребителски съобщения при изпълнение на команда
  718.  
  719. AFTER тригери:
  720. - изпълняват се СЛЕД модификация завърши успешно (INSERT, DELETE, UPDATE)
  721. - могат да се създават само върху таблици
  722.  
  723. INSTEAD OF тригери:
  724. - изпълняват се ВМЕСТО модификация
  725. - изпълняват се преди да бъдат проверени ограниченията върху таблицата
  726. - могат да се създават за таблици или изгледи
  727.  
  728. Ред на изпълнение на операциите на тригери:
  729. - извикване на INSERT/UPDATE/DELETE
  730. - ако е дефиниран INSTREAD OF тригер - той се изпълнява
  731. - проверка, дали модификациите са съобразени с дефинираните ограничения. Ако не са - възниква грешка и операцията се прекратява
  732. - изпълняват се AFTER тригерите
  733. -- първият и последният тригер могат да се специфицират изрично, останалите се изпълняват в произволен ред
  734. - транзакцията се затвърждава (COMMIT)
  735.  
  736. CREATE TRIGGER <TriggerName> ON <TableName>
  737. AFTER|FOR|INSTREAD OF Insert|Update|Delete
  738. AS
  739. <TriggerCode>;
  740.  
  741. ALTER TRIGGER <TriggerOne> ON <Target>
  742. AFTER|FOR|INSTREAD OF Insert|Update|Delete
  743. AS
  744. <TriggerCode>;
  745.  
  746. DROP TRIGGER <TriggerName>;
  747.  
  748. Временна отмяна на тригер:
  749. ALTER TABLE <TableName> {Enable|Disable} TRIGGER<TriggerName>;
Add Comment
Please, Sign In to add comment