Язык запросов DQL (2)

Оглавление

Кросс-соединение:

Основной формат перекрестного соединения:

 Основной формат перекрестного соединения

Декартово произведение:

Условное перекрестное соединение:

2. Внутреннее соединение:

Основной формат внутреннего соединения:

Внутреннее соединение без условий:

Разница между внутренним соединением и перекрестным соединением:

3. Внешнее подключение:

1. Левое внешнее соединение (называемое левым соединением)

Основной формат левого соединения:

    2. Внешнее подключение:

Внешнее соединение является завершением результата запроса внутреннего соединения (результат запроса отображается полностью).Внешнее соединение будет отображать данные, которые не имеют сопоставления во внутреннем соединении (несопоставленные данные заменяются на Null).Левое внешнее соединение левое соединение (левое соединение):

Правое внешнее соединение (называемое правым соединением):

3. Полное внешнее соединение (называемое полным соединением)

Базовый формат полного подключения:

4. Запрос соединения нескольких таблиц:

    Основной формат:

Пять, использование псевдонимов:

нравиться:

Использование псевдонимов:


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

Кросс-соединение:


Основной формат перекрестного соединения:

select <[数据库1.]表1.属性1>
	[,[数据库2.]表2.属性2,...,[数据库n.]表n.属性n]
from<[数据库1,]表1>
	[,数据库2.]表2,...,[数据库n.]表n];

-- Это включает в себя концепцию декартова произведения, то есть все данные в нескольких таблицах совпадают друг с другом один раз.


 Основной формат перекрестного соединения
 

-- 交叉连接
-- 交叉连接的基本格式
	-- 查询所有班级所在班级的班级名称
select student.s_id,student.s_name,class.c_name from student,class;

Декартово произведение:

select student.*,class.* from student,class;
	-- 笛卡尔积:连接查询的多个表格中所有的数据都相互匹配一次,形成一个包含所有可能情况的临时数据表
    -- 笛卡尔积会显示一些无效的数据,非常影响查询性能,会降低查询效率,所以要尽量避免产生笛卡尔积
    
    -- 交叉连接会产生笛卡尔积
    

Условное перекрестное соединение:

-- 查询所有学生所在班级的班级名称
    select student.s_id,student.s_name,class.c_name from student,class
		where student.s_cid = class.c_id; -- 等待连接:外键值等于主键值

2. Внутреннее соединение:


Внутреннее соединение сначала оценивает условия соединения и перечисляет данные, которые соответствуют условиям соединения, в соответствии с соответствующими полями в таблице, то есть могут быть запрошены только те результаты, которые соответствуют друг другу.
Ключевое слово внутренней связи: внутреннее соединение
 

Основной формат внутреннего соединения:

slect[数据库1.]表1,属性1,
	[数据库2.]表2.属性2,....,[数据库n.]表n.属性n
from[数据库1.]表2.属性2,...,[数据库2.]表2 on 条件表达式1
	inner join....inner join [数据库n.] 表n on 条件表达式n;
    
- 内连接inner join
内连接的基本格式:
	-- 查询所有学生所在班级的班级名称
    select student.s_id,student.s_name,class.c_name from student inner join class
		on student.s_cid = class.c_id;-- 等值连接:外键值=主键值
        -- 相同条件下,交叉连接和内连接的查询效果一致
        

Внутреннее соединение без условий:

-- 查询所有学生所在班级的班级名称
select student.s_id,student.s_name,class.c_name from student inner join class;

Разница между внутренним соединением и перекрестным соединением:


Кросс-соединение заключается в том, чтобы сначала соединить все условия, а затем запросить данные, соответствующие условиям, то есть сначала сгенерировать декартово произведение, а затем оценить условия для фильтрации данных , Соединения выполняются, чтобы избежать декартовых произведений
.
Таким образом, производительность запросов внутреннего соединения лучше, чем у перекрестного соединения.
Внутреннее соединение создает декартово произведение, а эффективность запроса внутреннего соединения намного выше, чем у перекрестного соединения.


3. Внешнее подключение:


Внешние соединения используются для фильтрации внутренних соединений и делятся на левые внешние соединения (левые соединения), правые внешние соединения (правые соединения) и полные внешние соединения (полные соединения).


1. Левое внешнее соединение (называемое левым соединением)


На основе левой таблицы отобразите все записи поля запроса в левой таблице, а в правой таблице отображаются только записи, соответствующие левой таблице, если совпадения нет, вместо этого используйте Null Ключевое слово левого соединения:
левое соединение 


Основной формат левого соединения:

select [数据库1.]表1.属性1,
    [数据库2.]表2.属性2,...,[数据库n.]表n.属性n
from [数据库1.]表1 left join [数据库2.]表2 on 条件表达式1
    left join ... left join [数据库n.]表n on 条件表达式n;


    
2. Внешнее соединение:


Внешнее соединение является завершением результатов запроса внутреннего соединения (результат запроса отображается полностью).Внешнее
 соединение будет отображать данные, которые не имеют сопоставления во внутреннем соединении (если совпадение отсутствует, замените его на Null ).Левое

    
внешнее соединение левое соединение (левое соединение):

  -- 查询所有学生所在班级的班级名称
select student.s_id,student.s_name,class.c_name from student left join class
    on student.s_cid = class.c_id;

Правое внешнее соединение (называемое правым соединением):


В отличие от левого соединения, оно использует правое в качестве эталона для отображения всех записей в поле запроса правой таблицы.В левой таблице отображаются только записи, соответствующие правой таблице, а если совпадений нет, используется Null вместо этого.Правое ключевое слово соединения: правое соединение Основной формат
правого соединения
:
 

select [数据库1.]表1.属性1,
    [数据库2.]表2.属性2,...,[数据库n.]表n.属性n
from [数据库1.]表1 right join [数据库2.]表2 on 条件表达式1
    right join...right join [数据库n.]表n on 条件表达式n;

#Вывод из одного примера: Можно ли преобразовать левое и правое соединения друг в друга
Ответ: Да, если порядок двух таблиц обратный, особых ограничений нет

-- 右外连接right join(右连接)
-- 查询所有学生所在班级的班级名称
select student.s_id,student.s_name,class.c_name from student right join class
    on student.s_cid = class.c_id;
select student.s_id,student.s_name,class.c_name from class right join student 
    on student.s_cid = class.c_id;
-- 右外连接可以相互转换

3. Полное внешнее соединение (называемое полным соединением)


На левую и правую таблицы полного соединения ограничений нет, и отображаются все данные, а не совпадающие данные заменяются на Null.
Ключевое слово полного соединения: полное соединение


Базовый формат полного подключения:

select[数据库1.]表1.属性1,
    [数据库2.]表2.属性2,...,[数据库n.]表n.属性n
from [数据库1.]表1 full join[数据库2.]表2 on 条件表达式1
    full join ... full join [数据库n.]表n on 条件表达式n;
#注意:mysql不支持全外连接,但可以使用union连接两个查询语句来实现全连接


 

-- 全外连接full join (全连接)
    -- 查询所有学生所在班级的班级名称
select student.s_id,student.s_name,class.c_name from student full join class
    on student.s_cid = class.c_id;
-- mysql不支持全外连接

4. Запрос соединения нескольких таблиц:


    DQL может не только подключать и запрашивать две таблицы, но также подключать и запрашивать данные в нескольких таблицах (как правило, лучше не превышать 4 таблиц).


    Основной формат:

 select 表1.属性1,表2.属性2.[,...,表n.属性n]
    from 表1 连接(inner/left/right/ join)表2 on 连接条件1
        连接(inner/left/right join) 表3 on 连接条件2
        ...... 连接(inner/left/right/ join) 表n on 连接条件n;
        (连接两个表之后写上连接条件,在连接另一个表)

# 进行多表连接查询时应注意连接表之间的外键关系和连接条件,只有表中属性相互有关系的表才能进行连接


  

Запрос подключения к нескольким таблицам:
 -- Запросить имена классов всех классов учащихся и учителей соответствующих классов.

select student.s_id,student.s_name,class.c_name,teacher.t_name
    from student left join class on student.s_cid = class.c_id
    left join teacher on class.c_tid = teacher.t_id;


-- Только запрос на соединение таблицы данных с отношением внешнего ключа имеет смысл
-- запрос на соединение с несколькими таблицами лучше всего не включать соединение более 4 таблиц (исключая 4 таблицы), поэтому эффективность запроса очень низкая, что разработано Проблема базы данных
- запрос соединения таблицы съедает производительность запроса
 

Пять, использование псевдонимов:


mysql поддерживает псевдонимы атрибутов (полей), а также может псевдонимы таблиц.
Ключевое слово псевдонима: как

一般格式:select <属性名> as <属性别名>
    from <表名> as <表别名>;


нравиться:


# 用关键字as给查询的属性取别名
select S.s_id as 学号,S.s_name as 姓名 from students as S;
-- 取别名时as可以忽略
select S.s_id 学号,S.s_name  姓名 from students S;
-- 给表取别名能够缩短连接查询的解析时间,使查询效率更高
select S.s_id 学号,S.s_name 学生姓名,C.c_name 班级名称,T.t_name 任课老师
    from student S left join class C on S.s_cid = C.c_id
    left join teacher T on C.c_tid = T.t_id;

Использование псевдонимов:

 --   查询所有学生所在班级的班级名称,以及对应班级的任课老师
select S.s_id as 学号,S.s-name as 学生姓名,C.c_name as 班级名称,T.t_name as 任课老师
    from student as S left join class as C on S.s_cid = C.c_id
    left join teacher as T on C.c_tid = T.t_id;
    -- 可以使用关键字as给属性名和表名取别名
    -- 给数据表取别名可以减少表名的解析时间,从而提高查询效率


-- Ключевое слово as может быть опущено


-- Запросить имена классов всех классов учеников и учителей соответствующих классов
 

select S.s_id 学号,S.s_name 学生姓名,C.c_name 班级名称,T.t_name 任课老师
    from student S left join class C on S.s_cid = C.c_id
    left join teacher T on C.c_tid = T.t_id;

Guess you like

Origin blog.csdn.net/m0_65334415/article/details/130165947