Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на билеты 3 курс БД.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
59.91 Кб
Скачать

Часть 2:

CREAT DATEBASE `shop`;

CREATE TABLE `user`(

id mediumint unsigned auto_increment,

email VARCHAR(50) NOT NULL,

f_name VARCHAR(20) NOT NULL,

l_name VARCHAR(30) NOT NULL

PRIMARY_KEY (id));

CREAT TABLE `prise_list`(

id mediumint unsigned auto_increment,

name VARCHAR(20) NOT NULL,

price float DEFAULT (0.0),

on_stock enum (‘Y’,’N’) DEFAULT

PRIMARY_KEY (id));

CREAT TABLE `cart`(

id mediumint unsigned auto_incremrnt,

u_id mediumint unsigned,

p_id mediumint unsigned,

cart_id CHAR(4) NOT NULL,

PRIMARY_KEY (id));

17) Лучше учить то что в тетради!!! Но если у кого-то нет то хотя бы это выучите:

Конструкция JOIN (в сочетании с другими MySQL конструкциями, например, GROUP BY) часто встречается при программировании под базы данных, и применяется в SELECTвыражениях. С помощью инструкции JOIN можно объединить колонки из нескольких таблиц в одну. При этом целостность таблиц не нарушается. Существует три типа JOIN-выражений:

INNER JOIN

OUTER JOIN

CROSS JOIN

В свою очередь, OUTER JOIN может быть LIFT и RIGHT (слово OUTER часто опускается).

В качестве примера создадим две простые таблицы и сконструируем для них SQL-выражения с использованием JOIN. В первой таблице пусть хранится ID пользователя и его логин (nick), а во второй – IDресурса, название ресурса и ID пользователя, который имеет право на администрирование данного ресурса.

Вот как выглядит конструкция join в общем виде:

... join_type JOIN table_name ON condition …

Где join_type – это тип JOIN-выражения, table_name – имя таблицы, которая присоединяется к результату, condition – условие по которому таблицы объеденяются.

Конструкция JOIN располагается сразу после SELECT-выражения. Возможно использование нескольких таких конструкций подряд, для объединения соответствующего количества таблиц. Чаще всего JOIN используется в случае, когда таблица имеет внешний ключ (foreign key).

  • INNER JOIN применяется для получения только тех строк, для которых существует соответствие записей в главной и присоединяемой таблице. Иначе говоря, условие condition должно выполняться всегда. Пример:

SELECT t_resources.t_name, t_users.t_nick

FROM t_resources

INNER JOIN t_users ON t_users.t_id = t_resources.t_userid

Результат данного запроса будет вот таким:

T_NAME T_NICK

res2 user1

res1 user3

res5 user3

  • В случае с LEFT JOIN из главной таблицы будут выбраны все записи, даже если в присоединяемой таблице нет совпадений, то есть условие condition не будет учитывать присоединяемую (правую) таблицу.

Пример:

SELECT t_resources.t_name, t_users.t_nick

FROM t_resources

LEFT JOIN t_users ON t_users.t_id = t_resources.t_userid

Результат выполнения запроса:

T_NAME T_NICK

res1 user3

res2 user1

res3 (null)

res5 user3

Как видно, результат показывает все ресурсы и их администраторов, и не зависит от того есть таковые (администраторы) или нет.

  • RIGHT JOIN выводит все строки удовлетворяющие правой части условия condition, даже если они не имеют соответствия в главной (левой) таблице:

SELECT t_resources.t_name, t_users.t_nick

FROM t_resources

RIGHT JOIN t_users ON t_users.t_id = t_resources.t_userid

Результат данного запроса будет вот таким:

T_NAME T_NICK

res2 user1

res1 user3

res5 user3

(null) user4

Таблица показывает ресурсы и их администраторов. Даже если у адмнистратора нет ресурса то, эта запись тоже будет отображена. Такое вполне даже может быть в случае, например, если ресурс был удален.

Тип CROSS JOIN применяется если необходимо получить все возможные сочетания из обеих таблиц. Обратите внимание, что contition для этого типа оператора JOIN не указывается. Вот пример запроса CROSS JOIN:

SELECT t_resources.t_name, t_users.t_nick

FROM t_resources CROSS JOIN t_users

user1 res1

user1 res2

user1 res3

user1 res5

user2 res1

user2 res2

user2 res3

user2 res5

user3 res1

user3 res2

user3 res3

user3 res5

Этот вид объединения сдедует использовать с большой осторожностью, поскольку он снижает производительность и часто ( что кстати видно из примера содержит избыточную информацию.

  • А что делать если нужно получить все имеющиеся соответствия одной таблицы другой? Вообще-то стандартом SQL для этого предусмотрен специальный оператор: FULL OUTER JOIN (ключевое слово OUTER можно опустить). Но к сожалению MySQL не поддерживает данную функционалность, поэтому в подобных ситуациях следует использовать объединение двух запросов оператором UNION. Вот пример:

SELECT t_resources.t_name, t_users.t_nick

FROM t_resources

LEFT JOIN t_users ON t_users.t_id = t_resources.t_userid

UNION

SELECT t_resources.t_name, t_users.t_nick

FROM t_resources

RIGHT JOIN t_users ON t_users.t_id = t_resources.t_userid

результат выполнения запроса:

T_NAME T_NICK

res1 user3

res2 user1

res3 (null)

res5 user3

(null) user4