Resumo do problema do MySQL e registro de aprendizagem 3: O relacionamento entre tabelas e a adição, exclusão e modificação de registros

Registro de aprendizagem MySQL 3

Relacionamento de tabela:

1. Muitos para um

2. Muitos para muitos

3. Um para muitos

1. Muitos para um

Basta criar a tabela associada e a tabela associada, chave estrangeira

create table press(
    id int primary key auto_increment,
    name varchar(20)
);

create table book(
    id int primary key auto_increment,
    name varchar(20),
    press_id int not null,
    foreign key(press_id) references press(id)
    on delete cascade
    on update cascade
);

insert into press(name) values
('出版社1'),
('出版社2'),
('出版社3');

insert into book(name,press_id) values
('饺子',1),
('包子',2),
('馄饨',2),
('玉米',3),
('馒头',3);
2. Muitos para muitos

Uma tabela intermediária precisa ser estabelecida para estabelecer o relacionamento entre as duas tabelas

#先建立book表(1中已建立),author表如下
create table author(
    id int primary key auto_increment,
    name varchar(20)
);

#建立两表格的关系
create table author2book(
    id int not null unique auto_increment,
    author_id int not null,
    book_id int not null,
    constraint fk_authon foreign key(author_id) references author(id)
    on delete cascade
    on update cascade,
    constraint fk_book foreign key(book_id) references book(id)
    on delete cascade
    on update cascade,
    primary key(author_id,book_id)
);

#插入author,id依次排开
insert into author(name) values('dumpling'),('corn');

#每个作者的代表作
dumpling:
饺子
包子
玉米
馄饨
馒头
corn:
玉米
馒头

insert into author2book(author_id,book_id) values
(1,6),(1,7),(1,8),(1,9),(1,10),(2,9),(2,10);

#查看对应关系,只需查看关联表即可。
3. Individualmente

chave estrangeira + única

create table customer(
    id int primary key auto_increment,
    name varchar(10) not null,
    qq varchar(10) not null,
    phone char(16) not null
);

create table student(
    id int primary key auto_increment,
    class_name varchar(20)not null,
    customer_id int unique,#该字段必须唯一
    foreign key (customer_id) references customer(id)#外键的字段必须保证unique
    on delete cascade
    on update cascade
);

insert into customer(name,qq,phone) values
('饺子','9218127214',19827191228),
('包子','9218123144',19241121238),
('汤圆','9218231145',11298319412);

insert into student(class_name,customer_id) values
('BB1班',1),
('AA2班',3);

Adição, exclusão, modificação e verificação de registros

Inserir dados : Além do uso anterior de valores, existe outro:

insert into 表名(字段1,字段2,...,字段n)
select(字段1,字段2,...,字段n) From 表2
where...;

atualizar atualização de dados

update 表名 set
	字段1 = 值1,
	字段2 = 值2,
	where condition;

#示例:更改密码
	update mysql.user SET password = password('123'),
	where user='root' and host = 'localhost';

**Excluir dados:** Exclua apenas determinados dados no local especificado

delete from 表名
	where condition;
	
#示例
	delete from mysql.user
	where password='';

truncar tabela: exclui todos os registros da tabela

**Seleção de dados de consulta: **Consulta de tabela única, consulta de várias tabelas

Consulta de tabela única:

selecione distinto (remover duplicação) campo 1, campo 2, campo 3 de biblioteca.table

onde condição

agrupar por condição de agrupamento

tendo filtro

ordenar por campo de classificação

limite n; limite

Consultar dados

Consulta de tabela única:
#简单查询:
select xxx,xx,xxx from xxx;
select * from xxx;

#避免重复
select distinct xx from xxx;#筛去重复项

#通过四则运算查询
select xxx*12 as xxxA from xxx;#可以直接将原数据*12的结果查出来(所得为虚拟表),xxxA为该新数据的表头名称

#定义显示格式
concat()#函数用于连接字符串
select concat('姓名:',name) as xxxB,concat('性别:',sex) as xxxC from xxx;#按照该格式查出name包含的数据,xxxB为标题;
concat_ws()#第一个参数为分隔符
select concat_ws(':',name,sex) as xxxD from xxx;
select concat(name,':',sex) from xxx;#与上一条相同,当数据多的时候使用concat_ws指定分隔符更好
onde restrições:

A cláusula where pode ser usada:

1. Operadores de comparação de comparação: >< >= <= !=

2, entre 80 e 100 valor entre 80 e 100

3. O valor de in(80,90,100) é 80 ou 90 ou 100

4、como 'xxx%'

5. Operadores lógicos: Você pode usar operadores lógicos diretamente e ou não em múltiplas condições.

#单条件查询
select xxx from xxx where id>7;

#多条件查询
select xxx from xxx where id>7 and age<10;

#between and

#关键词is null(判断某个字段是否为null不能用等号,需要用is)

#关键词in
select xxx from xxx where age in(28,45,22);#可直接取出这三个age的数据

#关键词like模糊查询(模糊匹配)
#eg:比如姓李的开头:
select * from xxx where name like "李%";#%后面可以是任意字符
select * from xxx where name like "李__";#下划线可指定后面有几个字符

Ordem lógica: primeiro de, depois de onde e depois selecione.

agrupar por: agrupar

1. O agrupamento ocorre após onde e é baseado nos registros obtidos após onde.

2. Agrupamento: Classifique todos os registros de acordo com um determinado campo, como agrupar cargos na tabela de informações de funcionários, ou agrupar por gênero, etc.

3. Retire a categoria de cada tipo de dados, etc. Como o maior salário, o número de funcionários de um determinado departamento.

4. Premissa principal: você pode agrupar por qualquer campo, mas após agrupar, como agrupar por postagem, você só pode visualizar o campo de postagem. Se precisar visualizar as informações dentro do grupo, você precisará usar uma função de agregação.

select * from xxx group by post;
set global sql_mode ="ONLY_FULL_GROUP_BY";#设置分组只能取分组的组名,即
select post from xxx group by post;

#聚合函数
max
min
avg#平均值
sum#和
count#数个数

#eg.每个职位有多少个员工
select post,count(id) as emp_count from employee group by post;

#分组之后,只能取分组的字段,以及每个组聚合结果
#没有group by则默认整体算作一组

group_concat(xxx)#可将xxx的所有数据提取出来eg:
select post,group_concat(name) from employee group by post;
tendo: filtragem

1. Prioridade de execução: onde>agrupar por>tendo>selecionar campos

2. Pode haver qualquer campo onde, mas não pode haver funções agregadas.

3. Pode-se usar campos agrupados. Outros campos não podem ser obtidos diretamente. Funções de agregação podem ser usadas.

ordenar por: classificar

Método de classificação original, classificação natural (1, 2,…)

A prioridade de execução é depois distinta (mas antes do limite)

select * from employee order by age asc;#默认也为asc(升序)
select * from employee order by age desc;#降序
select * from employee order by age asc,id desc;#先按照age升序,如果一样则按照id降序
limit: limita o número de itens exibidos
select * from employee limit 3;#选择出前三条来显示
select * from employee limit 0,5;#从0开始往后数五条
select * from employee limit 5,5;#从5开始往后再数五条
#该方法效率不太高

Resumo: Ordem gramatical:

select distinct(去重) 字段1,字段2,字段3 from 库.表 
where 条件
group by 分组条件
having 过滤
order by 排序字段
limit n;限制

Ordem de execução:

def from(db,table):

def where(conditon,f):

def group(lines):
	
def having(group_res):

def distinct(having_res):

def order(distinct_res):

def limit(order_res):

def select():
	#按顺序执行以上函数。
Suplemento: consulta regular

Expressão regular:

select * from xxx where name like 'jin%';#jin开头的字段
select * from xxx where name regexp'^jin';#

Operação de junção de mesa

Junção interna, junção à esquerda, junção à direita, junção externa completa

#引入,加入逻辑关联(内连接)
select * from employee,department where employee.dep_id = department.id;

Junção interna: pegue apenas a parte comum das duas tabelas

select * from xxx1 inner join department on xxx1.id1 = xxx2.id2;

Junção esquerda: retém os registros da tabela esquerda com base na junção interna

select * from xxx1 left join department on xxx1.id1 = xxx2.id2;

Junção direita: retém os registros da tabela correta com base na junção interna

select * from xxx1 right join department on xxx1.id1 = xxx2.id2;

Junção externa completa: retém registros nas tabelas esquerda e direita que não possuem relacionamento correspondente com base na junção interna.

select * from xxx1 full join department on xxx1.id1 = xxx2.id2;
#这个不行的话可以使用联合左右连接的操作,union
select * from xxx1 right join department on xxx1.id1 = xxx2.id2
union
select * from xxx1 left join department on xxx1.id1 = xxx2.id2;

Resumo da ordem de definição das palavras-chave principais da instrução select

A ordem de definição e a ordem lógica das palavras-chave da instrução select (o número de série é a ordem lógica)
(7)select 
(8)distinct<select list>
(1)from <left_table>
(3)<jion_type>join<right_table>
(2)on<jion_condition>
(4)where<where_condition>
(5)group by<group_by_list>
(6)having<having_condition>
(9)order by<order_by_condition>
(10)limit<limit_number>

Guess you like

Origin blog.csdn.net/weixin_47723114/article/details/131833985