day03 MySQLのNavicatは
A.整合性制約
外部キー外部キー
表(対応表:表がある)は、(メインテーブルのテーブルが関連付けられている)別のテーブルのレコードに対応する、外部キー値フィールドを設定します
2つのテーブルを作成する方法?
まず、マスターテーブルを作成します。人々はあなたを関連付けるので、あなたが存在しなければなりません
>表MAS(プライマリーキーAUTO_INCREMENT INT ID、名前VARCHAR(20)NOT NULL、DES VARCHAR(30)NOT NULL)を作成します。
テーブルを再作成します:
>(テーブルのSLAを作成します
主キーAUTO_INCREMENT int型EID、
名char(10)NOT NULL、年齢int型ではないnullを、
nullでないint型mas_id、
制約fk_mas外部キー(mas_id)更新カスケード#上のON DELETE CASCADEを参照のMAS(ID)(制約constraint)(参考文献)(カスケードカスケード)
#外部キー制約は、外部キー(フィールド)テーブル(フィールド)の同期、削除、同期の更新に名前を付けます
);
二つのテーブルにデータを挿入する方法:
GIVEマスタデータテーブルを挿入します
MASへ>挿入(名前、DES)の値( '情報単位'、 'クエリ計画情報')、( '調達'、 '購入クエリ')、( '技術'、 'ITは、クエリ');
テーブルからデータを挿入すると与えます
SLAへ>挿入(名前、年齢、mas_id)の値( 'bajie'、12,1)、( '悟空'、13,3)、( '大唐'、14,2)、( '西渓'、10,1 )、( '母'、19,3)、( 'レレ'、16,1)。
2つのテーブルのレコードを削除する方法、削除のタイミング
主テーブルのレコード
プライマリ・テーブルの値は、フィールドからの参照テーブルである場合、テーブルからの参照がない場合、、、そうでない場合はエラーを削除することができます
あなたが設定するときの同期は、テーブルからの同期更新を削除し、削除し、それがどうなるとき、カジュアル、テーブル内の対応するレコードから外部キーへの注意を払うが、すべて削除されます。削除カスケードに更新カスケードに//(カスケードカスケード)
更新カスケード// MULの削除カスケードに制約fk_mas外部キー(mas_id)参照のMAS(ID):この表に関連付けられています
フレーズを追加します。それは完全な関連テーブルを確立するための方法であります
テーブルのレコードから
場合は、すべての権利を削除させていただきます、無料
ときより多くのテーブルの時間
あまりにも多くの外部キーの確立のためには適していません
II。バリアント外部キー3つの関係
2つのテーブル間の関係を確認する方法
二つのテーブルがあるとします左と右の表は、分析の手順:
左と右のテーブルの上にテーブルに対応する複数のレコードが、テーブルが左への外部キーを持っている場合角度、テーブルの上に放置:ステップ
ステップ2:テーブルスタンドの直角、左テーブルの右テーブル対応する場合、複数のレコード、右上のテーブルは、外部キーを有します
多くのツー:
ステップ1と2の場合:一方のみ真、その後関係があるが多い(数だけ左右交換可能の状態として理解することができるように)
ブックおよびプレス関係:
一个出版社可以出版多本书
但是多个出版社不能出同一种书(除非是盗版)
如何建表:
先建立出版社
再建立书: 给书设置外键
多对多:
如果步骤一和步骤二: 同时成立,需要定义一个这两张表的关系表来专门存放二者的关系
作者和书的关系
一个作者可以写多本书
多个作者可以共同写一本书
如何建表:
创建两张关系表: 为两个普通表
额外建立第三张表: 设置两个外键分别对应两个关系表
代码:
建立三张表
> create table author(id int primary key auto_increment, name varchar(20));
> create table book(id int primary key auto_increment, name varchar(20));
> create table author_book(
id int primary key auto_increment,
book_id int not null,
author_id int not null,
constraint fk_book foreign key(book_id) references book(id) on delete cascade on update cascade,
constraint fk_author foreign key(author_id) references author(id) on delete cascade on update cascade
);
插入数据
> insert into author(name) values('八戒'),('悟空'),('大唐'),('溜溜');
> insert into book(name) values('一本书'),('两本书'),('三本书'),('四本书'),('五本书'),('六本书');
> insert into author_book(author_id,book_id) values(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(2,6),(3,4),(3,6),(4,1),(4,3);
一对一:
如果步骤一和步骤二: 都不成立,这种简单: 就是在左表foreign key基础上,再将外键字段设置唯一"unique"即可
用户和博客的关系
一个用户名只能注册同一个网站上的一个博客
如何建表:
先建立一张表
建立另一张表: 设置外键, 并且设置 unique
三.单表查询
1.单表查询的语法
select 字段1,字段2... from 表名
where 条件 //(condition 条件)
group by field
having 筛选
order by field
limit 显示限制条数
2.关键字的执行优先级
from //找到表
where //条件查询
group by //如果不分组, 则整体看做一组
having //将分组结果: 二次过滤
select //执行select,查询显示出来
distinct //去重: (distinct 不同的)
order by //按条件排序,然后可选升序或降序(默认升序)
limit //限制结果的显示条数
select group_concat(name),salary from employee where salary > 1000 group by salary having count(1) < 10 order by salary desc limit 3;
+--------------------+------------+
| group_concat(name) | salary |
+--------------------+------------+
| wukong | 1000000.31 |
| tianchi | 30000.00 |
| 程咬金 | 20000.00 |
+--------------------+------------+
sql语句的执行过程:
找到表 -> 拿着where指定的约束条件,去表中取出一条条记录 -> 将取出的一条条记录进行group by分组, 如果没有group by,则整体作为一组
-> 将分组的结果进行having过滤 -> 执行select -> 去重 -> 将结果按条件排序order by -> limit限制结果的显示条数
3.准备公司员工表
company.employee(公司.雇员)
员工id id int
姓名 name varchar
性别 sex enum
年龄 age int
入职日期 hire_date date
岗位 post varchar
职位描述 post_comment varchar
薪水 salary double
办公室 office int
部门编号 depart_id int
创建表
create table employee(
id int primary key auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male', #大部分是男的
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, #一个部门一个屋
depart_id int
);
插入记录
insert into employee(name ,sex,age,hire_date,post,salary,office,depart_id) values
('bajie','male',18,'20170301','visitor',7300.33,401,1), #以下是教学部
('wukong','male',78,'20150302','teacher',1000000.31,401,1),
('datang','male',81,'20130305','teacher',8300,401,1),
('shaseng','male',73,'20140701','teacher',3500,401,1),
('bailong','male',28,'20121101','teacher',2100,401,1),
('xizi','female',18,'20110211','teacher',9000,401,1),
('tianchi','male',18,'19000301','teacher',30000,401,1),
('xingjun','male',48,'20101111','teacher',10000,401,1),
('嘻嘻','female',48,'20150311','sale',3000.13,402,2), #以下是销售部门
('呵呵','female',38,'20101101','sale',2000.35,402,2),
('嘚嘚','female',18,'20110312','sale',1000.37,402,2),
('嘞嘞','female',18,'20160513','sale',3000.29,402,2),
('呢呢','female',28,'20170127','sale',4000.33,402,2),
('程咬氢','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬银','female',18,'20130311','operation',19000,403,3),
('程咬铜','male',18,'20150411','operation',18000,403,3),
('程咬铁','female',18,'20140512','operation',17000,403,3)
;
查看表
> select * from employee;
+----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
+----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
| 1 | bajie | male | 18 | 2017-03-01 | visitor | NULL | 7300.33 | 401 | 1 |
| 2 | wukong | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |
| 3 | datang | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 |
| 4 | shaseng | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 |
| 5 | bailong | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 |
| 6 | xizi | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 |
| 7 | tianchi | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 |
| 8 | xingjun | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 |
| 9 | 嘻嘻 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |
| 10 | 呵呵 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 |
| 11 | 嘚嘚 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 |
| 12 | 嘞嘞 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 |
| 13 | 呢呢 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 |
| 14 | 程咬氢 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
| 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 |
| 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 |
| 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 |
| 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 |
+----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
4.where约束
where字句中可以使用
比较运算符: > < >= <= = != <>
between 80 and 100: 值在80到100之间
in(10,20,30): 值是10或20或30
like '_bajie%': _代表一个字符, %号代表任意多个
逻辑运算符: not and or
代码:
> select * from employee where age in (18,28,38);
> select * from employee where name like 'x%'; #隐含条件: x前面没有通配符就是以 x 开头, 若后面也没有就是以什么结尾
5.group by
注意:
当有where时, 分组要放在where的后面.
分组指的是:
分组是按字段进行分组的
分组的作用
取每个部门的员工数 #'每'这个字后面的字段,就是我们分组的依据
取男女的数量
取最高,最低工资
> select * from employee group by post; #确实是按字段进行分组了, 但是得到的是每个分组里只有第一条数据展示了, 因为你使用了 * 查询, 其实这样是没有意义的(自己体会下)
> set global sql_mode='only_full_group_by'; #重启会话后生效: 如果要想分组查询, 这个必须设置, 正常应写到配置文件中(这样你在用 * 就直接报错)
> select @@global.sql_mode; #与select @@sql_mode; 一样
> select post from employee group by post; #根据哪个字段分组的, 只能查哪个字段, 其他字段不行: 而且查出来的只有分组的名字,若想查其他字段信息要通过'聚合函数'查询
#查其他字段的值: 聚合函数:group_concat(sex),用 ,号分隔连接展示
> select count(id),post from employee group by post;
> select sum(salary),post from employee group by post; #聚合函数: group_concat() count() sum() max() min() avg()
> select count(1),sex from employee group by sex; # 1 是什么, 为了优化性能, 隐含字段, 每条记录这个字段的值都是1
> select count(1) as '人数',sex as '性别' from employee group by sex; # 给查询的字段,显示的时候,起一个别名
五.可视化工具navicat的使用
下载地址:
内容总结
1.外键的变种 表和表之间的关系
一对多或多对一
多对多: 使用第三张表建立关系
一对一
2.数据驱动视图: Data Controller View: mysql python服务器 网页展示 (data model)
3.设计模式:26种
MVC
MTV
MVVM
4.单表查询
关键字的优先级
where
group by
having
select
destict
order by
limit
where
< > <= => = != <>
between .. and ..
in(1,2,3)
not and or
group by
sql_mode = only_full_group_by
只能获取分组的字段, 其他用聚合函数: count(1) sum() avg() max() min() group_concat()函数