Pythonの学習日記(三〇から四)MySQLデータベースの章2

外部キー(外部キー)

今日の多くの位置は、上記の情報をテーブルがある場合

私たちは、外部キーを使用する方法で二つのテーブルの関連付けに行くことができます

この利点は、テーブル内の重複する位置の名前を書き込む必要がある、あなたの仕事のタイトルは、今日は非常に長いと言う、スペースを節約することができ、それはスペースの無駄であり、制約に加えて、役割を果たしています。

デパートのような外部キーです。

コードを実行します。

作成 テーブルT1(        
    UID BIGINTが AUTO_INCREMENT プライマリ・ キー
    名前VARCHAR32 )、
    DEPARTMENT_IDのINT 
    性別INT 制約 fk_user_depar 外国の キー( "DEPARTMENT_ID"を)参照する部門( "ID") エンジン= InnoDBのデフォルトのcharset = UTF8と、

登録 テーブルT2を(
    識別BIGINT AUTO_INCREMENT プライマリ・ キー
    ジョブCHAR15 )、 エンジン= InnoDBのデフォルトのcharset = UTF8。

主キーを使用しているとき?主キーの役割は何ですか?

データの整合性の維持、テーブルは1つのプライマリキーを持つことができ、マスターキーは、複数列の主キーによって合成することができ、主キーは空ではありません

作成 T1(
    UID BIGINT AUTO_INCREMENT、
    名前VARCHAR32 )、
    DEPARTMENT_IDのint型
    性別のint型プライマリ キー(UID、性別)#主キーとして合成された2
     制約 fk_user_depar 外国 キーを( "DEPARTMENT_ID"は)参考資料課(「IDを「) エンジン= InnoDBののデフォルトのcharset = UTF-8;

PS:外部キーの名前を繰り返すことはできません。

行と別のテーブルの主キーに対応する複数列の複数に:

作成 、テーブルT1(
    UID BIGINTのAUTO_INCREMENT、
    名前のVARCHAR32 )、
    DEPARTMENT_IDのint型
    性別int型 キー(DEPARTMENT_ID、性別)#将两列合成为一个主键
     制約 fk_user_depar 外国 キー( "DEPARTMENT_ID"、 "性別")を参照する部門( "ID"、 "num_gender") エンジン= InnoDBのデフォルトのcharset = UTF8。

登録 テーブルT2を(
    識別BIGINTAUTO_INCREMENT プライマリ・ キー
    ジョブCHAR15 )、
    num_genderのBIGINT 
)エンジン= InnoDBのデフォルトのcharset = UTF8。

 

自動インクリメント開始値

DESCテーブル名;

ショーは、テーブル表名を作成します。

元のテーブルと仮定すると:

コマンド文を実行

G \コマンドに追加

これは、我々は、SQL文を書くために見ることができるものではありませんが、元のテーブルには次の値からここに示した3つのデータを、持っているので、何が「AUTO_INCREMENT = 4」、4です。

私たちはここを参照してくださいになる方法であるために、付加価値のデータから2打を追加して行きます。

 

あなたが変更された値から行く場合は、ALTER TABLEテーブル名AUTO_CREMENT =値を使用します。

 

自動インクリメントのステップサイズ

MySQLのエネルギー自給ステップは、それがセッションレベルに基づいているため、シングルサインオンセッションで、良いではありません

<1>セッションレベルに基づいて:

声明:グローバル変数の「auto_inc%」ビューのようなショーのセッション変数

設定ステップ:設定されたセッションのauto_increment_increment =値;

団結の各セッションにグローバル変数とグローバル行くことを除いて、ステップの各セッションは、独立していることに注意してください

現在のセッションの開始値を変更します。

設定セッションをauto_increment_offset =值。

<2>グローバルレベルに基づいて:

それは人のロギングが統一された値になるように変更されているステップを可能に

set global auto_increment_increment=200;

查看全局变量:

show global variables like 'auto_inc%';

修改全局的起始值:

set global auto_increment_offset=值;

 

唯一索引

唯一索引的作用就是能够加速查找和起到一个约束的作用

 

外键的变种

<1>一对多

例如:用户和部门的关系

<2>一对一

例如:用户表和博客表

需要用Foreign key和唯一索引去约束

如果想要制作一张员工表对应他们的权限关系,但只有高管才能去拥有权限去查看员工资料

这里的Usertype是外键它所对应的是另外一张员工的职位表,但其实只有Usertype中的4是有权限去查看员工的资料的,所以其他员工的密码这一栏会造成资源的浪费,那这里我们可以用另外一种方式去优化:

<3>多对多

一张表表示:

例如:百合网的相亲记录表

这里一共有两个外键Uid1、Uid2共同指向ID

两张表表示:

例如主机和用户的关系表,一个用户能够掌控什么类型的主机

主要去表示的好处能够让我们很清楚的看到一个用户掌握了几台主机且这台主机被什么用户给掌管的,User和HostID它要具有唯一性。

 

SQL语句数据行的一些补充

<1>.增

假设有一张表

通过语法:insert into 表名(第一列数据名,第二列数据名...) values(对应的第一列值一,对应的第二列值一...),(对应的第一列值二,对应的第二列值二...),...;用这种方式可以插入多次的值。

查看一下新增的数据:

同样的我们也可从一个表中提取数据到另外一张表中

原表就是上面新增完数据的表,然后我们再去创建一个新的表:

<2>.删

分为无条件的情况和有条件的情况

无条件:

delete from 表名;

有条件:

1.delete from 表名 where ID != 2;
2.delete from 表名 where ID = 2;
3.delete from 表名 where ID > 2;                  #也可以是小于、大于等于、小于等于
4.delete from 表名 where ID < 2 and name = 'name1';
5.delete from 表名 where ID >= 2 or name = 'name1;

<3>.改

1.改一条

update 表名 set name = 'name1' where id > 2 and name = 'AAA';

2.改多条

update 表名 set name = 'name1',age = 20 where id > 2 or name = 'AAA';

<4>.查

1.select * from 表名;
2.select id,name from 表名;
3.select id,name from 表名 where id > 10 or name = 'name1';
4.select id,name as 新名称 from 表名 where id > 10 or name ='nam1';

原表格:

执行后:

5.select name,age,'数据' from 表名;

原表格:

执行后: 

 

其他:

原表:

1.select * from t1 where id != 1;

执行结果:

2.select * from t2 where id in (1,3,4);

执行结果:

3.select * from t1 where id not in (1,4);    

执行结果:

4.select * from t1 where id between 1 and 4;                  --->[1,4]

执行结果:

5. select * from t1 where id in (select score from t2);

t2表:

执行结果:

通配符:

'%':例如a%,a的后面可以去取任意个数的字符

'_':例如a_,a的后面只能取一个任意字符

1.select * from t1 where name like 'ro%';

执行结果:

2.select * from t1 where name like 'root_';

执行结果:

 

限制:

比如说你去通过百度、谷歌查资料,它后面会给你分页,一次看十条二十条,这样不会让电脑资源不够导致崩溃。

原表格:

1.select * from t1 limit 6;

执行结果:

2.select * from t1 limit 2,5;

这里的2代表起始位址,5代表一共查几笔资料

执行结果:

3.select * from t1 limit 10 offset 20;

这里表示从20开始,往后查10条数据

执行结果:

如果要查找后面10笔数据就要先把整笔数据进行翻转再去查这10笔即可

排序:

从大到小查:

1.select * from t1 order by id desc;

利用id去进行从大到小排列数据,执行结果:

从大到小查:

2.select * from t1 order by id asc;

利用id去进行从小到大排列数据,执行结果:

查后5笔数据:

多列排序:

按排列优先顺序去排,先把score按从大到小的方式排列,如果有score相同再去按它的id从小到大的方式排列

 组合:

以员工和部门作为例子,先创建部门表:

再创建一个员工表:

添加员工信息和部门信息:

 

查看添加好的员工信息表和部门信息表:

1.select part_id from userinfo group by part_id;

执行结果:

2.select max(id),part_id from userinfo group by part_id;

执行结果:

3.select min(id),part_id from userinfo group by part_id;

执行结果:

 

4.select count(id),part_id from userinfo group by part_id;

执行结果:

5.select sum(id),part_id from userinfo group by part_id;

执行结果:

6.select avg(id),part_id from userinfo group by part_id;

执行结果:

7.select count(id),part_id from userinfo group by part_id having count(id) > 1;

如果对于聚合函数结果进行二次筛选时就必须要用到having关键字,执行结果:

8.select count(id),part_id from userinfo where id = 1 or id < 4 group by part_id having count(id) > 1;

执行结果:

连表操作:

1.select * from userinfo,department where userinfo,part_id = department_id;

把两张表进行一个连接操作,如果后面不加条件就会出现混乱。执行结果:

2.select * from userinfo left join department on userinfo.part_id = department.id;

这种方法按以前SQL版本效能上会有差异,但现在其实没有太大的相差,但推荐使用这一个去进行表的连接。特点:左边的表userinfo会全部显示。执行结果:

3.select * from userinfo right join department on userinfo.part_id =department.id;

特点:右边表department的数据会全部显示

4.select * from userinfo inner join department where userinfo.part_id = department.id;

如果一个表连另外一张表的数据时,出现NULL时,就会把整行数据给隐藏掉

おすすめ

転載: www.cnblogs.com/Fantac/p/11608450.html