* Заявки за еднотабличен оператор SELECT
Публикувано на 28 февруари 2009 в раздел Бази от Данни.
Заявките SELECT имат за цел да четат информация от таблица по дадени критерии. Най-общо казано синтаксисът е:
SELECT <редове от колони> FROM <таблица> WHERE <условие>;
Ще демонстрираме как се използва с няколко примера с базата данни от миналата тема:
1. Извежда списък с имената и датата на основаване на всички университети:
SELECT name, founded FROM university.university;
Резултатът ще бъде следният:
+---------------------+------------+ | name | founded | +---------------------+------------+ | Sofia University | 1889-01-29 | | Techical University | 1941-06-12 | +---------------------+------------+ 2 rows in set (0.00 sec)
В тази заявка пропуснахме клаузата WHERE, т.е. ще извикаме списък от всички редове.
2. Списък на id и име на факултетите от университет с id=2:
SELECT id, name FROM university.faculties WHERE univ_id=2; +----+----------------------------------+ | id | name | +----+----------------------------------+ | 1 | Avtomatika | | 2 | Elektronna Tehnika i Tehnologii | | 3 | Elektrotehnicheski | | 4 | Energo-mashinostroitelen | | 5 | Kompiutarni sistemi i upravlenie | | 6 | Mashino-tehnologichen | +----+----------------------------------+ 6 rows in set (0.00 sec)
Както виждате в този пример се използва външния ключ univ_id.
3. Име, фамилно име и телефон на преподавателите от факултет с id=4:
SELECT firstname, lastname, phone FROM university.professors WHERE faculty_id=4; +-----------+----------+---------+ | firstname | lastname | phone | +-----------+----------+---------+ | Boncho | Bonev | 9652295 | | Hristina | Antonova | 9652359 | | Ivailo | Banov | 9652209 | | Emanuil | Agoncev | 9652436 | | Hristo | Petkov | 9653629 | +-----------+----------+---------+ 5 rows in set (0.00 sec)
4. Списък на всички данни за преподаватели с първо име "Ivan":
SELECT * FROM university.professors WHERE firstname="Ivan";
5. Възможно е използването на логическите оператори AND и OR. Следният пример показва всички преподаватели с първо име "Daniela" и фамилно име "Gotceva":
SELECT * FROM university.professors WHERE firstname="Daniela" AND lastname="Gotceva";
Следният пример показва списък с телефоните на преподавателите и първо име "Ivan" или "Dimitar":
SELECT * FROM university.professors WHERE firstname="Ivan" OR firstname="Dimitar";
6. Можете да използвате операторите за сравнение <, <=, =, >, >=, !=. Следният пример ще покаже телефоните на преподавателите с id>=20:
SELECT id, phone FROM university.professors WHERE id>=20;
7. Можете да правите проверка за неопределеност чрез оператора IS. Следният пример ще изведе имената и телефоните на преподавателите, чиито телефонни номера не са NULL:
SELECT firstname, lastname, phone FROM university.professors WHERE phone IS NOT NULL;
8. Както виждате подредбата на резултатът е неопределена. Чрез използване на допълнителна клауза "ORDER BY" ние можем да подреждаме данните. В предишния пример сме подредили резултатите по първото име на преподавателите в азбучен ред:
SELECT firstname, lastname, phone FROM university.professors WHERE phone IS NOT NULL ORDER BY firstname;
Възможно е и подреждане "наобратно":
SELECT firstname, lastname, phone FROM university.professors WHERE phone IS NOT NULL ORDER BY firstname DESC;
Ако искате да подредите по няколко полета, то ги изредете едно след друго. Първо ще се сортира по първото поле, после по второто и т.н. Например ако искаме да извлечем имената на всички преподаватели по азбучен ред, подредени първо по малкото си име, а после по фамилно ще напишем:
SELECT firstname, lastname, phone FROM university.professors ORDER BY firstname, lastname;
Добавяйки DESC след някой от параметрите ще обърнете реда на подреждането.
9. Чрез оператор IN можете да проверявате за принадлежност към множество. Ето пример за списък с имената и id на преподавателите от факултети 1, 3 и 5, подредени по азбучен ред на първото си име:
SELECT id, firstname, lastname FROM university.professors WHERE faculty_id IN (1, 3, 5) ORDER BY firstname;
10. Чрез оператор LIKE можете да правите "маски" за търсене. Следния пример ще изведе id, имената и телефона на всички преподаватели с първа буква на фамилното име "I":
SELECT id, firstname, lastname, phone FROM university.professors WHERE lastname LIKE 'I%';
Виждате, че ключова роля играе символа '%'. Следващата заявка ще върне всички преподаватели, които имат буквата "P" във фамилното си име:
SELECT id, firstname, lastname, phone FROM university.professors WHERE lastname LIKE '%P%';
11. Накрая ако не желаете да виждате всички резултати, а само част от тях, то може да се използва операторът LIMIT. Следния пример ще покаже само първите 10 резултата от заявка за показване на имената на всички преподаватели:
SELECT firstname, lastname FROM professors LIMIT 10;
Това е изключително подходящо при програми, които четат големи обеми от информация, като например статистики. Най-често подреждаме информацията по колона от тип timestamp в обратен ред и правим LIMIT, за да видим само последните записи, които ни интересуват.
Задача: Въведете учебни предмети, които изучавате в таблицата subjects и въведете ваши данни и данни на ваши колеги в таблицата students. Преди това използвайте оператор SELECT, за да намерите id на преподавателя, който води дадения предмет. Ако такъв преподавател не е въведен в базата данни - въведете го.
Задача: Въведете данни за изучаваните от вас предмети в таблицата "записани студенти".
Въя вторият пример на 5. след SELECT не трябва ли да има phone,тъй като трябва да изкара номерата на преподавателите Иван или Димитър? :)
Има го - заявката е "SELECT *", т.е. "изведи всичко". Това включва и телефона.