В этой раз Мы будем больше говорить о синтаксисе SQL, нежели о Python. А что поделаешь, разбирать-то базы данных надо.
Прошлую запись Мы закончили разбором оператора LIKE. Как Вы, наверное, догадались, его можно использовать в связке с логическими операторами OR, AND и NOT.
Для начала давайте сделаем такую БД:
| Python | 1
2
3
4
5
6
7
8
9
10
11
| import sqlite3
connection=sqlite3.connect('database')
cursor=connection.cursor()
cursor.execute('create table pupils (name char(20),mark integer(3),town char(20))')
sp=[['Vasya',87,'Moscow'],['Petya',92,'Sochi'],['Sanya',85,'Anapa']]
for i in sp:
cursor.execute('insert into pupils values (?,?,?)',i)
connection.commit()
connection.close() |
|
А теперь запустим скрипт, извлекающий из полученной БД информацию:
| Python | 1
2
3
4
5
6
| import sqlite3
conn=sqlite3.connect('database')
cur=conn.cursor()
cur.execute("select * from pupils where name like 'V%a' or mark>90")
print(cur.fetchall()) |
|
В этом скрипте Мы использовали запрос с оператором OR(или). Как следствие, в ответ Мы получаем список из двух кортежей:
| Python | 1
| [('Vasya', 87, 'Moscow'), ('Petya', 92, 'Sochi')] |
|
Первый соответствует маске 'V%a', второй, в свою очередь, удовлетворяет условию mark>90. Ну, я думаю, лишних пояснений и разбора остальных логических операторов не требуется: если Вы знакомы с программированием(а оно так и есть, иначе Вы бы не читали этот блог), то поймёте всё без лишних слов.
Вот скрипт с ещё двумя очень удобными операторами, помогающими определить, входит ли элемент в заданное множество:
| Python | 1
2
3
4
5
6
7
8
9
| import sqlite3
conn=sqlite3.connect('database')
cur=conn.cursor()
cur.execute("select * from pupils where name in ('Vasya','Sanya')")
print(cur.fetchall())
cur.execute("select name,mark from pupils where mark between 86 and 95")
print(cur.fetchall()) |
|
Оператор IN - проверяет, входит ли указанный атрибут в список.
А BETWEEN определяет, попадает ли выбранный элемент в отрезок [x1 and x2](пограничные элементы, равные х1 и х2, тоже удовлетворяют условию BETWEEN). Кстати, подобные условия можно использовать и для символьных величин:
| Python | 1
| ...where x between 'A' and 'F' |
|
Идём далее. Выборку данных можно сортировать оператором ORDER BY. Например,
| Python | 1
| cur.execute("select * from pupils order by mark") |
|
Полученый список будет упорядочен по возрастанию значений атрибута mark. Если же Вы хотите упорядочить результаты по убыванию, то Вам поможет оператор DESC, который ставится в конце запроса:
| Python | 1
| cur.execute("select * from pupils order by mark desc") |
|
Ну и в заключение, рассмотрим агрегатные функции. Эти самые функции производят обобщение выбранных данных, выдавая при этом одно единственное значение. Вот их список:- max - определяет максимум
- min - определяет минимум
- count - считает кол-во записей
- sum - рассчитывает сумму
- avg - рассчитывает среднее значение
Давайте, например, отыщем ученика с наибольшим кол-вом баллов, а так же выведем средний результат:
| Python | 1
2
3
4
5
| cur.execute("select name from pupils where mark=(select max(mark) from pupils)")
print(cur.fetchall())
cur.execute("select avg(mark) from pupils")
print(cur.fetchall()) |
|
Как видите, использование АФ значительно усложняет запросы. Дело-то всё в том, что агрегатные функции нельзя вот так взять и вставить в любое место. Их нужно обрамлять select'ом и from'ом, иначе Python выдаст Вам ошибку и дело с концом.
Заметьте, функции max(), min() и ORDER BY применимы и для символьных величин. Критерием отбора будет порядок символов в алфавите.
|