ホームページ  >  記事  >  データベース  >  MySQL データベースとは何かを知ろう (3)

MySQL データベースとは何かを知ろう (3)

coldplay.xixi
coldplay.xixi転載
2021-02-15 08:57:162984ブラウズ

MySQL データベースとは何かを知ろう (3)

無料学習の推奨事項: mysql ビデオ チュートリアル

# #ディレクトリ

  • ##ファジークエリ
      ##テーブルの制約
    • ##テーブル間の関連付け
    • # #多対 1 の関連付け
    • #多対多の関連付け
    • #1 対 1 の関連付け
      • ファジークエリ
    大まかに与えられた内容から欲しいデータを見つけることができます =クエリとは異なります char型データとvarchar型データを例にします:
create table c1(x char(10));create table c2(x varchar(10));insert c1 values('io');insert c2 values('io');
ファジークエリでは like

select * from c1 where x like 'io';select * from c2 where x like 'io';
c1 の x が char 型であることが分かりますが、存在するかどうかファジークエリでは表示できません。 =

ファジー クエリの方が正確です。この方法でクエリを実行するには、クエリを実行する前に、このフィールドの内容全体を入力する必要があります。データはここに char 型で格納されており、長さは 10 未満であるため、スペースがそれを補うために使用されるため、クエリを実行するときはスペースを含める必要があります。

MySQL データベースとは何かを知ろう (3) 提供されたクエリ メソッドを使用することもできます。ファジークエリでは、% は 0 個以上の任意の文字を意味します。

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

MySQL データベースとは何かを知ろう (3) 2 番目の数字が o であることだけがわかっていて、最初と最後がわからない場合は、_ を使用して任意の 1 文字を表し、% を使用して次のことを行うことができます。次の文字と一致します

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

MySQL データベースとは何かを知ろう (3)
SQL ファジー クエリの構文は "SELECT columns FROM table WHERE column LIKE ';pattern';" です。

MySQL データベースとは何かを知ろう (3)SQL には 4 つのマッチング モードが用意されています。

MySQL データベースとは何かを知ろう (3)% は 0 個以上の任意の bai 文字を表します。次のステートメント:
SELECT * FROM user WHERE name LIKE ';%三%';
では、「Zhang San」、「Three-legged Cat」、「Tang Sanzang」などの名前が入力されます。

#__ は任意の 1 文字を表します。ステートメント:

SELECT * FROM user WHERE name LIKE ';

';
    名前が 3 文字で中央の文字が「三」である「Tang Sanzang」のみを検索します;
  1. SELECT * FROM user WHERE name LIKE ';三__';
    名前が 3 文字で最初の文字が「三」である「三本足の猫」のみを検索します;
  2. [ ] は次のいずれかを表します括弧内にリストされた文字 (正規表現と同様)。ステートメント:
  3. SELECT * FROM user WHERE name LIKE ';[张李王]三';
    では、(「Zhang Li Wang San」ではなく) 「Zhang San」、「Li San」、「Wang San」が検索されます。 "); [ ] に一連の文字 (01234、abcde など) が含まれる場合、「0-4」、「a-e」と省略できます SELECT * FROM user WHERE name LIKE '; old [1 -9]';
    は "Old 1"、"Old 2"、...、"Old 9" を検索します。
    "-" 文字を検索したい場合は、それを最初に入力してください。 ';Zhang San [-1-9]';
  4. [^ ] は、括弧内にリストされていない単一の文字を表します。ステートメント:
  5. SELECT * FROM user WHERE name LIKE ';[^Zhang Liwang]三';
    は、姓が「Zhang」、「Li」、「Wang」ではない「Zhao San」、「Sun」を検索します。 Three" など;
    SELECT * FROM user WHERE name LIKE ';老[^1-4]';
    「old 1」から「old 4」を除外して「old 5」、「old」を検索します6"、...、「古い 9」。


  6. #テーブル制約



  7. はじめに:
制約とデータ型 幅は次のとおりです。同じであり、すべてオプションのパラメータです

関数: データの整合性と一貫性を確保するために使用されます

    主に次のように分かれています:
  • PRIMARY KEY (PK)    标识该字段为该表的主键,可以唯一的标识记录FOREIGN KEY (FK)    标识该字段为该表的外键NOT NULL    标识该字段不能为空UNIQUE KEY (UK)    标识该字段的值是唯一的AUTO_INCREMENT    标识该字段的值自动增长(整数类型,而且为主键)DEFAULT    为该字段设置默认值UNSIGNED 无符号
    ZEROFILL 使用0填充

    not null: リテラルの意味は、設定後、値が挿入されるたびにフィールドに値を設定する必要があるということです。

  • default: フィールドに値が設定されていない場合は、その値を使用します「デフォルト後のデフォルト値」で定義しました
  • UNIQUE KEY: フィールドがこの制約を設定した後、設定される値は、テーブル全体でこのフィールドに対して 1 つの (一意の) 値のみを持つことができます

  • PRIMARY KEY : 主キーは、innodb ストレージ エンジンがデータを整理するための基礎です。Innodb では、これをインデックス構成テーブルと呼びます。テーブルには主キーが 1 つだけ存在する必要があります。
主キーはレコードを決定できる一意の識別子です

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。