>데이터 베이스 >MySQL 튜토리얼 >MySQL 데이터베이스가 무엇인지 알아봅시다(3)

MySQL 데이터베이스가 무엇인지 알아봅시다(3)

coldplay.xixi
coldplay.xixi앞으로
2021-02-15 08:57:163014검색

MySQL 데이터베이스가 무엇인지 알아봅시다(3)

무료 학습 권장 사항: mysql 비디오 튜토리얼

Directory

    • 퍼지 쿼리
    • 테이블 제약 조건
    • Re 테이블 간의 관계
      • 다대일 연관
      • 다대다 연관
      • 일대일 연관

퍼지 쿼리


대략 제공되는 내용을 기반으로 원하는 데이터를 찾을 수 있는 = 쿼리와는 다릅니다. char 유형을 취하는 데이터 및 varchar 유형 데이터의 예:

create table c1(x char(10));create table c2(x varchar(10));insert c1 values('io');insert c2 values('io');

Fuzzy 쿼리는 like

select * from c1 where x like 'io';select * from c2 where x like 'io';

MySQL 데이터베이스가 무엇인지 알아봅시다(3)
를 사용합니다. c1의 x는 char 유형임을 알 수 있습니다. 우리는 io 데이터가 있는지 확인하기 위해 퍼지 쿼리를 사용합니다. 표시할 수 없지만 통과함 = 그러나 쿼리할 수 있음

MySQL 데이터베이스가 무엇인지 알아봅시다(3)
퍼지 쿼리가 더 정확합니다. 이러한 방식으로 쿼리하려면 쿼리하기 전에 이 필드의 전체 내용을 입력해야 합니다. 여기서 char 유형은 길이가 10자 미만이므로 공백을 사용합니다. 보충, 쿼리할 때는 공백을 가져와야 합니다.
MySQL 데이터베이스가 무엇인지 알아봅시다(3)
퍼지 쿼리에서 제공하는 쿼리 방법을 사용할 수도 있습니다. %는 0개 이상의 문자를 나타냅니다.

select * from c1 where x like 'io%';

MySQL 데이터베이스가 무엇인지 알아봅시다(3)
두 번째 숫자가 o라는 것만 알고 시작과 끝을 모르는 경우 다음을 사용할 수 있습니다. _를 사용하여 단일 문자를 나타내고 %를 사용하여 다음 문자를 일치시킵니다.

select * from c1 where x like '_o%';

MySQL 데이터베이스가 무엇인지 알아봅시다(3)
SQL 퍼지 쿼리 구문
"SELECT 열 FROM 테이블 WHERE 열 LIKE ';패턴';"의 경우.

SQL은 네 가지 일치 모드를 제공합니다.

  1. %는 0개 이상의 bai 문자를 나타냅니다. 다음 명령문:
    SELECT * FROM user WHERE name LIKE ';%三%';
    는 "Zhang San", "Three-legged Cat", "Tang Sanzang"과 같이 이름에 "3"이 포함된 모든 이름을 찾습니다. 등;
  2. _은 단일 문자를 나타냅니다. 명령문:
    SELECT * FROM user WHERE name LIKE ';';
    이름이 세 글자이고 가운데 글자가 "三"인 "Tang Sanzang"만 찾습니다.
    SELECT * FROM user WHERE name LIKE ' ;三_ _';
    이름이 세 글자이고 첫 글자가 "三"인 "세발 달린 고양이"만 찾습니다.
  3. []는 괄호 안에 나열된 문자 중 하나를 나타냅니다(정규 표현식과 유사). 명령문:
    SELECT * FROM user WHERE name LIKE ';[张李王]三';
    는 "Zhang San", "Li San", "Wang San"("Zhang Li Wang San" 대신)을 찾습니다. [ ]에는 일련의 문자(01234, abcde 등)가 포함되어 있으며 "0-4", "a-e"로 축약할 수 있습니다.
    SELECT * FROM user WHERE name LIKE ';老[1-9]';
    Will 출력 "Old 1", "Old 2", ..., "Old 9" 찾기
    "-" 문자를 찾으려면 먼저 ';张三[-1-9]'를 입력하세요.
  4. [^ ]은 괄호 안에 나열되지 않은 단일 문자를 나타냅니다. 명령문:
  5. SELECT * FROM user WHERE name LIKE ';[^Zhang Liwang]三';
    는 "Zhang", "Li", "Wang"이라는 성이 아닌 "Zhao San", "Sun San" 등을 찾습니다. ;
    SELECT * FROM user WHERE name LIKE ';老[^1-4]';
    는 "old 1"에서 "old 4"를 제외하고 "old 5", "old 6", ..., "를 찾습니다. 오래된 9".

테이블 제약 조건


소개:

  • 데이터 유형의 너비와 같은 제약 조건은 선택적 매개 변수입니다.

  • 기능: 데이터의 무결성과 일관성을 보장하는 데 사용됩니다

주로 다음과 같이 구분됩니다.

PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录FOREIGN KEY (FK)    标识该字段为该表的外键NOT NULL    标识该字段不能为空UNIQUE KEY (UK)    标识该字段的值是唯一的AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)DEFAULT    为该字段设置默认值UNSIGNED 无符号
ZEROFILL 使用0填充
not null: 문자 그대로의 의미는 설정 후 값이 삽입될 때마다 해당 필드에 값을 설정해야 한다는 것입니다.

default: 해당 필드에 값이 설정되지 않은 경우 해당 값을 사용합니다. 우리는 기본값 이후의 기본값에서 정의했습니다

UNIQUE KEY: 필드가 이 제약 조건을 설정한 후, 설정한 값은 전체 테이블에서 하나만(고유) 존재할 수 있습니다.

PRIMARY KEY: 기본 키 기본 키는 innodb 저장소입니다. 엔진 InnoDB에서는 데이터를 구성하는 기본을 인덱스 구성 테이블이라고 합니다. 테이블에는 기본 키가 하나만 있어야 합니다.

기본 키는 레코드를 결정할 수 있는 고유 식별자입니다.

AUTO_INCREMENT: 설정 후 이 필드는 테이블에 값이 삽입될 때마다 자동으로 숫자만큼 증가하지만 이 필드는 정수 유형이어야 하며 또한 기본 키가 됩니다

FOREIGN KEY: 이 테이블의 필드를 다른 테이블의 필드와 연결하는 외래 키입니다. 연결 후 이 필드의 값은 연결된 필드의 값과 일치해야 합니다.

我们创建表,通常会有一个id字段作为索引标识作用,并且会将它设置为主键和自增。

实例:

create table test(
    id int primary key auto_increment,
    identity varchar(18) not null unique key, --身份证必须唯一
    gender varchar(18) default '男');insert test(identity) values('123456789012345678');

MySQL 데이터베이스가 무엇인지 알아봅시다(3)
当身份字段插入相同值,则会报错,因为字段设置了唯一值
MySQL 데이터베이스가 무엇인지 알아봅시다(3)

insert test(identity,gender) values('0123456789012345678','女');

MySQL 데이터베이스가 무엇인지 알아봅시다(3)
我们会发现,id不对劲啊,那是因为笔者之前进行两次插入值操作,但是值并没有成功插入进去,但是这个自增却受到了影响.

这个时候,我们进行两部操作就可以解决这个问题。

alter table test drop id;alter table test add id int primary key auto_increment first;

删除id字段,再重新设置。
MySQL 데이터베이스가 무엇인지 알아봅시다(3)
很神奇是不是,这个MySQL的底层机制。vary 良心

还需要注意的是:我们使用delete删除一条记录时,并不会影响自增

delete from test where id = 2;insert test(identity,gender) values('111111111111111111','男');

MySQL 데이터베이스가 무엇인지 알아봅시다(3)
关于这个操作,如果我们只是删除单条记录的话,可以使用上序提供的方法还调整自增的值,而如果是删除整个表记录的话,使用以下方法:

truncate test;

效果演示:delete删除整个表记录
MySQL 데이터베이스가 무엇인지 알아봅시다(3)
效果演示:truncate删除整个表记录
MySQL 데이터베이스가 무엇인지 알아봅시다(3)

联合主键

确保设置为主键的某几个字段的数据相同

主键的一个目的就是确定数据的唯一性,它跟唯一约束的区别就是,唯一约束可以有一个NULL值,但是主键不能有NULL值,再说联合主键,联合主键就是说,当一个字段可能存在重复值,无法确定这条数据的唯一性时,再加上一个字,两个字段联合起来确定这条数据的唯一性。比如你提到的id和name为联合主键,在插入数据时,当id相同,name不同,或者id不同,name相同时数据是允许被插入的,但是当id和name都相同时,数据是不允许被插入的。

实例:

create table test(
    id int,
    name varchar(10),
    primary key(id,name));
    insert test values(1,1);

MySQL 데이터베이스가 무엇인지 알아봅시다(3)
如果再次插入两个主键相同的数据,则会报错
MySQL 데이터베이스가 무엇인지 알아봅시다(3)
只要设置主键的两个字段,在一条记录内,数据不完全相同就没有问题。
MySQL 데이터베이스가 무엇인지 알아봅시다(3)

外键的话,我们在表之间的关联进行演示

表之间的关联


我们这里先介绍表之间的关联,后面再学习联表查询

通过某一个字段,或者通过某一张表,将多个表关联起来。

我们一张表处理好不行吗,为什么要关联,像这样?
MySQL 데이터베이스가 무엇인지 알아봅시다(3)
有没有发现一个问题,有些员工它们对应的是相同部门,一张表就重复了很多次记录,随着员工数量的增加,就会出现越来越多个重复记录,相对更占用空间了。

那么我们需要将部门单独使用一张表,再将员工这个使用一个字段关联到另一个表内,我们可以使用外键,也可以不使用外键,先来演示外键的好处吧

多对一关联


如:多个员工对应一个部门。

员工表,先别急着创建,请向下看

create table emp(
	id int primary key auto_increment,
	name varchar(10) not null,
	dep_id int,
	foreign key(dep_id) references dep(id) 
	on update cascade   # 级联更新
	on delete cascade); # 级联删除

上面外键的作用就是:

dep_id字段关联了dep表的id字段:
当dep表的id字段值修改后,该表的dep_id字段下面如果有和dep表id相同值的则会一起更改。
如果dep表删除了某一条记录,当emp表的dep_id与dep表删除记录的id值对上以后,emp表这条记录也会被随之删除。

注意:必须是外键已存在,所以需要先创建部门表,再创建员工表

部门表

create table dep(
	id int primary key auto_increment,
	name varchar(16) not null unique key,
	task varchar(16) not null);

emp表的dep_id字段设置的数据必须是dep表已存在的id

所以我们需要先向dep表插入记录

insert dep(name,task) values('IT','技术'),('HR','招聘'),('sale','销售');

员工表插入记录

insert emp(name,dep_id) values
	('jack',1),
	('tom',2),
	('jams',1),
	('rouse',3),
	('curry',2);
	# ('go',4) 报错,在关联外键的id字段中找不到

注意:如果我们emp表的dep_id字段插入的数据,在dep表中的id字段不存在该数据时,就会报错。

查询我们创建后的效果
MySQL 데이터베이스가 무엇인지 알아봅시다(3)
这样就把这两个表关联起来了,目前我们先不了解多表查询,这个先了解的是,表之间的关联。

我们再来看一下同步更新以及删除,外键的改动被关联表会受到影响

update dep set id=33333 where id = 3;

MySQL 데이터베이스가 무엇인지 알아봅시다(3)
再来体验一下同步删除

delete from dep where id = 33333;

MySQL 데이터베이스가 무엇인지 알아봅시다(3)
这就是外键带给我们的效果,有利也有弊:

  • 优点:关联性强,只能设置已存在的内容,并且同步更新与删除
  • 缺点:当删除外键表的某一条记录,关联表中有关联性的记录会被全部删除

多对多关联


多张表互相关联

如:一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多

这时使用外键会出现一个弊端,那就是先创建哪张表呢?它们都互相对应,是不是很矛盾呢?解决办法:第三张表,关联书的id与作者的id

book表

create table book(
	id int primary key auto_increment,
	name varchar(30));

author表

create table author(
	id int primary key auto_increment,
	name varchar(30));

中间表:负责将两张表进行关联

create table authorRbook(
	id int primary key auto_increment,
    author_id int,
    book_id int,
    foreign key(book_id) references book(id)
    on update cascade
    on delete cascade,
    foreign key(author_id) references author(id)
    on update cascade
    on delete cascade);

多名作者关联一本书,或者一名作者关联多本书,书也要体现出谁关联了它

book表插入数据:

insert book(name) values
	('斗破苍穹'),
	('斗罗大陆'),
	('武动乾坤');

author表插入数据:

insert author(name) values
	('jack'),
	('tom'),
	('jams'),
	('rouse'),
	('curry'),
	('john');

关联表插入数据:

insert authorRbook(author_id,book_id) values
	(1,1),
	(1,2),
	(1,3),
	(2,1),
	(2,3),
	(3,2),
	(4,1),
	(5,1),
	(5,3),
	(6,2);

目前的对应关系就是:

jack:斗破苍穹、斗罗大陆、武动乾坤
tom:斗破苍穹、武动乾坤
jams:斗罗大陆
rouse:斗破苍穹
curry:斗破苍穹、武动乾坤
jhon:斗罗大陆

一个作者可以产于多本书的编写,同时,每本书都会标明产于的作者

一对一关联


路人有可能变成某个学校的学生,即一对一关系。

在这之前,路人不属于学校。

原理就是:学校通过广告,或者通过电话邀请,将路人变成了学生。

路人表

create table passers_by(
	id int primary key auto_increment,
	name varchar(10),
	age int);
	insert passers_by(name,age) values
	('jack',18),
	('tom',19),
	('jams',23);

学校表

create table school(
	id int primary key auto_increment,
	class varchar(10),
	student_id int unique key,
	foreign key(student_id) references passers_by(id)
	on update cascade
	on delete cascade);insert school(class,student_id) values
	('Mysql入门到放弃',1),
	('Python入门到运维',3),
	('Java从入门到音乐',2);

数据存储的设计,需要提前设计好表的关联 关系,将关系全部设计好以后,剩下的只是往里存数据了,后续我们会了解到联表查询相关内容,将有关联性的内容,以虚拟表的形式查询出来,查询出来的数据可能来自多个表。

表的关联,建议使用以下方式

  • 多对多 > 多对一 > 一对一

相关免费学习推荐:mysql数据库(视频)

위 내용은 MySQL 데이터베이스가 무엇인지 알아봅시다(3)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제