MySQL3_外键及查询
生活随笔
收集整理的這篇文章主要介紹了
MySQL3_外键及查询
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- MySQL_外鍵及查詢
- 1.數據的完整性
- (1).保證實體的完整
- (2).保證域的完整性
- (3).引用的完整性
- (4).自定義完整性
- 2.外鍵
- 3.實體之間的關系
- (1).一對一:主鍵關系
- (2)一對多|多對一
- (3)多對多
- 4.數據庫的設計
- 5.數據的規范
- (1)第一范式
- (2)第二范式
- (3)第三范式
- 6.規范化和性能
- 7.查詢語句
- 語句位置順序
- (1)字段表達式
- (2)from子句
- (3)dual(肚哦)表
- (4)where子句
- (5)運算符
- (6)聚合函數
- (7)通配符
- (8)模糊查詢
- 8.分組查詢
- 9.回溯統計
- 10.having(條件)
- 11.order by
- 12.limit
- 13.插入語句的其它用法
MySQL_外鍵及查詢
1.數據的完整性
1.實體的完整性,一條記錄,就是一個實體,如果記錄無法區分,則失去了實體的完整性 2.域完整性:如果有兩個字段無法區分,則失去了域完整性 3.引用的完整性:兩個表的對應記錄不完整,則失去了引用完整性 4.自定義完整性:自己定義的一套規則(1).保證實體的完整
1.主鍵的約束(primary key) 2.自動增長的列(auto_increment) 3.唯一鍵(unique)(2).保證域的完整性
1.數據類型的約束 2.默認值(default) 3.非空約束(not null)(3).引用的完整性
應用外鍵(foreign key)(4).自定義完整性
1.存儲過程(相當于python中的自定義函數) 2.觸發器2.外鍵
外鍵:從表的公共字段
外鍵的約束主要是用來保證引用的完整性的,主外鍵的名字可以不一樣,但是數據類型可以一樣.
#特點 1.主表中不存在的記錄,從表中不能插入 2.從表已存在的記錄,主表中不能刪除 3.先刪除從表,再刪除主表 #學生表 create table stuinfo(id int primary key auto_increment,name char(32) not null );insert into stuinfo set name='孫正'; insert into stuinfo(name) values('周鵬'),('李'); insert into stuinfo set name='李嘉';#成績表#foreign key(本表的外鍵) references 主表(關聯字段)#foreign key(stuno) references stuinfo(id)#cascade 聯動操作 create table score(nid int primary key auto_increment,stuno int ,ch float,math float#foreign key(stuno) references stuinfo(id) on delete cascade on update cascade );insert into score values(null,1,100,100),(null,2,100,100),(null,3,100,100),(null,4,100,100);#兩種串聯的操作: 1.set null: 讓一個字段設置為NUll 2.cascade : 跟著主表的變化而變化#添加外鍵 alter table score add foreign key(stuno) references stuinfo(id) on delete cascade on update cascade; #添加外鍵,并指定外鍵的名稱 alter table score add CONSTRAINT `stuno` FOREIGN KEY (`stuno`) REFERENCES `stuinfo` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;#刪除外鍵 #score_ibfk_1 外鍵的名字,外鍵可以有多個 alter table score drop foreign key score_ibfk_1;#外鍵只能在innodb的引擎上使用3.實體之間的關系
實體的關系:
1.一對一 2.一對多 3.多對一 4.多對多(1).一對一:主鍵關系
stuinfo
| 1 | 王健林 |
| 2 | 許家印 |
| 1 | 100 |
| 2 | 120 |
(2)一對多|多對一
user
| 1 | admin | 123456 | 123@qq.com |
| 2 | root | 123456 | 126@126.com |
order(訂單)
| 201904037000001 | 1 | 7000 | 2019/04/03 |
| 201904047000001 | 1 | 7000 | 2019/04/04 |
(3)多對多
user
| 1 | admin | 123456 | 123@qq.com |
| 2 | root | 123456 | 126@126.com |
address
| 上海徐匯區1208弄A小區3棟1608 | 1 | 13555555555 | 馬云 |
| 上海徐匯區1208弄A小區3棟1608 | 1 | 13666666666 | 雷軍 |
| 上海徐匯區1208弄B小區3棟1608 | 1 | 13777777777 | 吳軍 |
| 上海徐匯區1208弄B小區3棟1608 | 1 | 13888888888 | 李斌 |
| 上海徐匯區1208弄A小區3棟1608 | 2 | 13555555555 | 馬云 |
| 上海徐匯區1208弄A小區3棟1608 | 2 | 13666666666 | 雷軍 |
4.數據庫的設計
公司要做一個項目,首先項目管理獲得需求,知道項目是什么類型的,然后產品經理負責產品的規劃,設計原型UI將需求的草圖給UI,UI可以繪制E-R圖,或者是DB自己構建E-R圖DB自己根據E-R圖設計數據庫,建立表,設定關聯度.碼農看到E-R圖可以干嘛,我們根據E-R圖上的需求寫代碼- E-R圖
博客的E-R圖:
#用戶和板塊之間的關系 1.某個用戶是版主,版主管理板塊 2.普通用戶和版塊之間沒有直接的關系,用戶發帖或者用戶評論間接的和版塊之間形成關系#用戶和帖子之間的關系 1.用戶發表了帖子 2.用戶評論了某個帖子#用戶和評論之間的關系 1.用戶發表了評論 2.用戶發表了帖子,被其他人評論了 3.如果有二級評論,你的評論被人噴了#帖子和版塊之間的關系 帖子屬于版塊5.數據的規范
(1)第一范式
第一范式:確保每一列原子化(不可分割)
(2)第二范式
第二范式:,基于第一范式,一張表只能描述一件事情,非主鍵字段必須依賴主鍵字段(不論在什么情況下主鍵都是唯一的)
(3)第三范式
第三范式:基于第二范式,消除傳遞依賴(一個主鍵字段可以確定其它的信息)
6.規范化和性能
高考成績查詢系統:高并發
不符合三范式
| 1 | 小明 | 130 | 120 | 250 |
select * from gaokao where stuno=1;
規范化:
| 1 | 小明 |
| 2 | 小強 |
| 1 | 130 | 120 |
select *,ch+math as score from A left join B on A.stuno = B.stuno where A.stuno = 1;
總結:性能的完備良好的時候,選擇規范化;性能不足,優先考慮性能
7.查詢語句
所有的查詢都依賴統計分析:
語句位置順序
select 字段(結果集) from 表名(數據源) [where 條件] [group by 分組] [having 條件] [order by 排序 asc|desc] [limit 限制 m,n]; create table stuinfo(sid int primary key auto_increment comment'學號(主鍵)',sname varchar(32) not null comment'姓名',sex enum('男','女','不詳') default '不詳',age tinyint unsigned not null comment'年齡',city varchar(64) comment'地級市' );create table score(stuno int not null comment'學號',python float,java float );insert into stuinfo values(null,'挺正',1,18,'重慶'),(null,'李野',1,60,'北京'),(null,'勁宇',1,81,'深圳'),(null,'楊冪',1,18,'重慶'),(null,'趙薇',1,20,'北京'),(null,'迪麗熱巴',1,18,'深圳');insert into score values(1,88,99),(2,78,100),(3,30,60),(4,100,99),(5,70,69),(6,100,0);(1)字段表達式
select 既可以做查詢,也可以做輸出select now(); #顯示當前時間 select rand(); #隨機數 select unix_timestamp(); # 顯示Unix時間戳(2)from子句
from 后面是數據源 數據源可以寫多個,返回的是一個笛卡爾積 select * from A,B,C;(3)dual(肚哦)表
dual是一個語法,是一個關鍵字dual表示為了保證select完整性的select now() from dual;(4)where子句
where是做條件查詢,只返回結果為True的數據select * from stuinfo where age <50;- is null | is not null
- between | not between
(5)運算符
- 算術運算符
- 比較運算符
- 邏輯運算符
(6)聚合函數
max() #最大值 min() #最小值 sum() #求和 avg() #平均值 count() #計數#聚合函數使用在結果集上(7)通配符
_ #一次只匹配一個字符 % #一次匹配任意數量的字符#在模糊查詢的時候使用(8)模糊查詢
關鍵字:like #like寫在where后面select * from stuinfo where sname like '_麗__';select * from stuinfo where sname like '%麗%';8.分組查詢
將查詢的結果分類顯示,為了方便統計
group by,如果有where要放在where的后面select * from stuinfo group by sex;#mysql57默認不支持group by #修改配置文件 #vim /etc/my.cnf#sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONselect count(sid) from stuinfo group by sex;#在group將需要的結果拼接 select group_concat(sid) from stuinfo group by sex;#添加where語句 select group_concat(sid) from stuinfo where age>20 group by sex ;9.回溯統計
在統計的基礎上,在做一次統計 with rollup 添加在group by之后select count(sid) from stuinfo group by sex with rollup;10.having(條件)
select * from stuinfo where age>=20; select * from stuinfo having age>=20;select sid from stuinfo where age>=20; select sid from stuinfo having age>=20; #錯誤select * from stuinfo where age>=20 having city='北京'; select * from stuinfo where age>=20 and city='北京';select * from stuinfo having sum(age>=20); select * from stuinfo where max(age); #錯誤select * from stuinfo group by sex where age >=20; #錯誤的 select * from stuinfo group by age having age >=20; where:條件的查詢,where后面不能加上聚合函數,只能寫在.數據源的后面 having:條件查詢,having條件字段必須要在結果集中,having可以寫在group by的后面11.order by
order by 寫在 groupby后面 ,如果有having也要寫在having的后面 #主要作用是排序 #拍訊分為升序asc 降序desc,默認asc(可以不寫)select * from stuinfo order by age; select * from stuinfo order by age desc;12.limit
#主要作用,限制數據的顯示數量,limit位置放在最后select * from stuinfo limit 3; #顯示前三行#從索引為0開始,向后取3行 select * from stuinfo limit 0,3; #從索引為3的開始,向后取3條 select * from stuinfo limit 3,3;select * from stuinfo where city='北京' order by age desc limit 3; #distinct去除相同的字段值 #我們需要查詢數據表中一共有哪些那些地方的人注冊了 select distinct city from stuinfo; select city from stuinfo group by city;13.插入語句的其它用法
#拷貝數據 insert....select..... #復制表 create table stuinfo1 like stuinfo;insert into stuinfo1 select * from stuinfo;#插入重復值 on duplicate key update....#如果主鍵已經存在,則不能覆蓋 insert into stuinfo values(1,'tom',1,18,'大阪');#如果不存在直接插入,如果存在則更新 insert into stuinfo values(7,'tom',1,18,'大阪') on duplicate key update sname='tom',city='大阪';總結
以上是生活随笔為你收集整理的MySQL3_外键及查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习:EM算法
- 下一篇: 金山词霸 [2009牛津版] 金山词霸