Данни и програмен код



Pdf просмотр
страница10/14
Дата03.01.2022
Размер1.13 Mb.
#113246
1   ...   6   7   8   9   10   11   12   13   14
BD
drop table students; – изтрива таблицата „студенти“;
alter table students add stipendy numeric(5,2); - променя таблицата „студенти“, добавяйки поле „стипендия“ с пет цифри, два от които след десетичната запетая;
alter table students modify stipendy numeric(6,2); - променя полето „стипендия“ на шест цифри, два от които след

десетичната запетая;
alter table students change stipendy stip
numeric(6,2); променя полето „стипендия“ като променя името на stip и го увеличава на шест цифри, два от които след десетичната запетая;
alter table students drop stipendy; - изтрива полето
„стипендия“ от таблицата „студенти“.
Във вече създадена таблица могат да се вмъкват данни с израза: insert into course values ('CS-437', 'Databases', 'CST', 4);
Командата вмъква в таблицата course стойностите ’CS-437’ в първото поле, ’Databases’ във второто поле, ’CST’ в третото и
‘4‘ в четвъртото поле.
Командата: insert into course (course_id, title, dept_name, credits) va lues ('CS-437', 'Databases', 'CST', 4); прави същото, но описва имената на полетата, където се вмъкват данните. Така те могат и да не са в реда, в който са дефинирани в таблицата.
Командата: insert into student values ('3003', 'Ivanov', 'CST', null); вмъква в таблицата „студенти“ стойностите „3003“ в първото,
„Ivanov”във второто и “CST” в третото поле. В четвъртото поле вмъква стойност “Null”.
Операцията „проекция“ избира една или повече колони от дадена таблица. Тя е често използвана, когато искаме да изберем, обработим или отпечатаме само част от данните, съдържащи се в таблица от базата данни. Например ако в таблицата „Преподаватели“ има много колони, но нас ни

интересуват само имената им, можем да използваме командата: select name from instructor;
Ако искаме да изберем повече полета, можем да използваме: select name, department from instructor;
По подразбиране ако при проекцията има повтарящи се редове, те се премахват. Ако искаме да изберем дали да се премахват или не повтарящите се резултати, можем да използваме служебните думи distinct или all. Първата команда премахва повторенията, а втората оставя повторенията в резултата. select distinct dept_name from instructor; select all dept_name from instructor;
Възможно е дадено поле да се промени при прочитането му от базата данни и да бъде различо в текущото копие в паметта, например: select ID, name, salary/12 from instructor;
В този пример полето salary, което в базата е записано като годишна заплата се изчита от диска, стойността се разделя на
12 месеца и в копието в паметта е месечната заплата.
С клаузата Where могат да се задават условия кои записи да бъдат избирани: select name from instructor where dept_name = 'CST' and salary > 800;
Като ключови думи могат да бъдат използвани „and”, “or” и
„not”.


Селекцията представлява избор на един или повече редове от таблица, най-често при определени условия. Възможно е да не се задава условие, тогава ще бъдат избрани всички редове от таблицата: select * from instructor;
Най-често обаче не ни интересуват всички редове, а само някои, отговарящи на определено условие. Условията обикновено отново се задават с клаузата Where: select * from instructor where salary > 800;
Както беше описано при проектирането на бази данни, правилата изискват различните данни да се разполагат в различни таблици. За да използваме информация, намираща се в две или повече таблици, трябва да направим съединение между таблиците. За да се направи съединение, двете таблици трябва да имат поне едно еднакво поле (с еднакъв смисъл), което може да бъде дефинирано като чужд ключ в едната таблица (foreign key) или да не бъде. Съществуват различни видове съединения, които могат да дадат различни резултати.
При съединение таблиците се свързват по полетата, които имат еднакви имена или потребителят трябва да зададе по кои полета да се направи съединението.
Да вземем за пример двете таблици, показани на фигура 4.1.
Фигура 4.1. Примерни таблици за съединение


В таблицата Instructor се записва информацията за преподавателите, а в таблицата Disciplines – информация за дисциплините. В полето Instr_ID е записан номерът на преподавателя, който преподава дадената дисциплина. В този пример преподавател с номер 1001 не води дисциплина, както и дисциплината с номер 103 не е осигурена от преподавател.
Вариантите за съединение са:
4.8.1 Естествено съединение (Natural Join)
При естественото съединение двете таблици се сливат по едноименното поле (или полета), като резултатът е таблица, съдържаща всички останали колони на двете таблици, а колоните по които се сливат таблиците се обединяват в една обща. В редовете на резултатната таблица присъстват само тези, за които стойностите от двете полета, по които правим съединението съвпадат. Заявката за естествено съединение на таблиците от фигура 4.1 е: select * from Instructor natural join Disciplines;
Ако има две едноименни полета и искаме да укажем по кое поле да се направи сливането, можем в заявката да посочим желаното поле така: select * from Instructor natural join Disciplines using (Ins tr_ID);
Пример за резултата от естественото съединение e показан на фигура 4.2.


Фигура 4.2. Резултат от естествено съединение
Колоната Instr_ID е само една. Всички останали колони присъстват в таблицата. От резултатите в редовете липсва преподавателят „Иванов“, защото за него няма съвпадение в таблицата Disciplines, както и дисциплината „Програмиране“, защото за нея няма преподавател. Резултатът от примера отговаря на въпроса: „Кои преподаватели кои дисциплини водят?“.
4.8.2 Вътрешно съединение (Inner join)
Вътрешното съединение без поставяне на условие изпълнява сливане на всеки ред от първата таблица със всеки от втората, което в указания пример е безсмислено – съвпадение на всеки преподавател с всяка дисциплина. Възможно е при други таблици да има някакъв смисъл, например ако имаме две таблици с два отбора състезатели и трябва да направим график на състезания всеки от първия отбор срещу всеки от втория.
В примера по-голям смисъл има вътрешно съединение при поставяне на условие. Резултатът от него е подобен на този при естественото съединение, но с две важни различия.
Първото е, че можем да укажем свързване по две колони с различни имена, например ако полето в таблица Instructor се казваше ID, вместо Instr_ID, нямаше да можем да направим естествено съединение между двете таблици, защото няма колони със съвпадащи имена, но може да направим вътрешно съединение със следната команда:

select * from Instructor inner join Disciplines on ID = Inst r_ID;
Втората важна разлика е, че и двете полета, по които се извършва сливането присъстват в резултата, както е показано на фигура 4.3.
Фигура 4.3. Резултат от вътрешно съединение
4.8.3 Ляво външно съединение (Left outer join)
И двата горни примера са често използваеми, но те не показват в резултата преподавателите, които не водят дисциплини, както и дисциплините, които не са осигурени с преподаватели. Ако въпросът, на който трябва да отговорим беше: „Необходим е списък на всички преподаватели, който да показва кой преподавател коя дисциплина води“, т.е. тези, които нямат дисциплини също трябва да присъстват в списъка, то това може да се направи със следната операция: select * from Instructor left outer join Disciplines on ID =
Instr_ID;
Резултатът от операцията е показан на фигура 4.4.


Фигура 4.4. Резултат от ляво външно съединение
Вижда се, че в резултата присъства и преподавателя
„Иванов“, за когото няма съвпадение в дясната таблица. Нейните колони в този ред се запълват с празна стойност (Null).
4.8.4 Дясно външно съединение (Right outer join)
Неговия смисъл е същия като на предишното съединение, но в него присъстват всички редове от дясната таблица. Например ако въпросът е: „Кои дисциплини са осигурени с преподаватели, кои са предподавателите зад всяка дисциплина и кои дисциплини нямат преподаватели?“, то на него може да се отговори със следната заявка: select * from Instructor right outer join Disciplines on ID = Instr_ID;
Резултатът от заявката е показан на фигура 4.5.


Фигура 4.5. Резултат от дясно външно съединение
Вижда се, че в резултата присъства и дисциплината
„Програмиране“, която не е осигурена с преподавател.
4.8.5 Пълно външно съединение (Full outer join)
При пълното външно съединение присъстват всички редове и от лявата и от дясната таблица, за тези, за които няма съвпадения, клетките се запълват с Null. Тази операция, приложена към примера може да отговори на запитването:
„Необходим е пълен списък на всички преподаватели и дисциплини със съответствия кой преподавател коя дисциплина води“. Необходимата заявка е: select * from Instructor full outer join Disciplines on ID =
Instr_ID;
Резултатът е показан на фигура 4.6.ж
Фигура 4.6. Резултат от пълно външно съединение


Съществуват и други варианти на съединения, например естествено ляво и дясно съединение, но те не са разгледани тук.
Както беше споменато, работата с Null стойности може да доведе до неправилни резултати. При математически операции с клетка, в която има Null се получава резултат Null, например:
5 + Null = Null;
10 * Null = Null;
При съединяване на низове, един от които е Null резултатът е
Null (празен низ):
'Fish ' || NULL || 'Chips' = Null;
При сравнения с Null резултатът е Unknown, например:
5 > Null = Unknown;
6 <= Null = Unknown;
При логически операции с Unknown също може да имаме неочаквани резултати:
OR: (unknown or true) = true,
(unknown or false) = unknown
(unknown or unknown) = unknown
AND: (true and unknown) = unknown,
(false and unknown) = false,
(unknown and unknown) = unknown
NOT: (not unknown) = unknown


Изключване на редове, съдържащи Null стойности може да стане по този начин: select name from instructor where salary is not null;
За резултат от стойност на много редове, можем да използваме функциите:


Сподели с приятели:
1   ...   6   7   8   9   10   11   12   13   14




©obuch.info 2024
отнасят до администрацията

    Начална страница