mysql2
三大范式
三大范式是設(shè)計(jì)數(shù)據(jù)數(shù)據(jù)庫(kù)的一個(gè)原則
?1. 對(duì)于屬性(字段)必須是原子性的知给,不可再進(jìn)行分割
? person表 (name,age,gender,tel,birthday)
2. 對(duì)于記錄的唯一性,要求記錄有唯一標(biāo)識(shí)测柠,
? ? 數(shù)據(jù)表中都要求主鍵炼鞠,而且主鍵盡量不要是業(yè)務(wù)字段,單獨(dú)拿個(gè)字段來做主鍵
? ? 字段與主鍵要有直接關(guān)系轰胁,不是間接關(guān)系谒主, 確保一張表中只能存儲(chǔ)一種類型的數(shù)據(jù),不能存儲(chǔ)多種
?3. 對(duì)于字段的冗余性赃阀,要求任何字段不能由其他字段派生過來霎肯,要求字段沒有冗余性
? ? ?person表 (province, abbreviation, name)??
外鍵
當(dāng)我們進(jìn)行表關(guān)聯(lián)的時(shí)候擎颖,我們可以通過外鍵約束一下
? 1. 創(chuàng)建表的時(shí)候直接添加
? Create table 表名(字段 類型,字段 類型观游,..., constraint [外鍵名稱] foreign key(外鍵字段) references 父表(主鍵字段))
? create table stu(id int primary key auto_increment, name varchar(20), card_id varchar(10),clazz_id int,constraint fk_clazz_id_id foreign key(clazz_id) references clazz(id));
2. 通過alert進(jìn)行修改 (外鍵起名要有一個(gè)命名規(guī)則)
?Alter table 表名 add [constraint 外鍵名字] foreign key(外鍵字段) references 父表(主鍵字段);
? alter table stu add constraint fk_clazz_id_id foreign key(clazz_id) references clazz(id);
3. 刪除外鍵
? alter table [表名] drop foreign key [外鍵名稱];
? alter table stu drop foreign key fk_clazz_id_id;
?4. 查詢外鍵
? show create table [表名]
? 4. 級(jí)聯(lián)操作 (級(jí)聯(lián)更新搂捧,級(jí)聯(lián)刪除)
? ? 級(jí)聯(lián)更新 , 當(dāng)父表主鍵發(fā)生變化變化的時(shí)候懂缕,從表中外鍵也跟著更新
? alter table stu add constraint fk_clazz_id_id foreign key(clazz_id) references clazz(id) on update cascade;
? ? 級(jí)聯(lián)刪除 允跑,當(dāng)父表中記錄被刪除時(shí)候,字表外鍵相關(guān)的記錄全部被刪除
? ? alter table stu add constraint fk_clazz_id_id foreign key(clazz_id) references clazz(id) on delete cascade;
? ? 級(jí)聯(lián)更新和級(jí)聯(lián)刪除可以一起使用搪柑,默認(rèn)情況下不帶級(jí)聯(lián)更新和級(jí)聯(lián)刪除的
? 連接查詢
? ? ? 內(nèi)連接? inner join? (on 是關(guān)聯(lián)條件)? 兩張表中符合條件的交集
? ? ? ? select * from stu inner join clazz on stu.clazz_id = clazz.id
? ? ?左連接? left join? 把左表中內(nèi)容都列出來聋丝,右表有匹配的就匹配,沒有匹配的直接為空
? ? ? ? select * from stu left join clazz on stu.clazz_id = clazz.id
? ? ? 右連接? right join 把右表內(nèi)容都列出來工碾,左表中有匹配的就匹配弱睦,沒有匹配的直接為空
? ? ? ? select * from stu right join clazz on stu.clazz_id = clazz.id
?子查詢
一個(gè)查詢的結(jié)果是另外一個(gè)查詢的條件
select name from clazz where id in (select clazz_id from stu where name = 'zhangsan');
?別名(as)
通過as 可以給表起別名, 也可以給字段起別名
select s.name as sname, c.name as cname, c.number cnumber from stu as s inner join clazz as c on s.clazz_id = c.id;
?as 可以省略掉
select s.name sname, c.name cname, c.number cnumber from stu s inner join clazz c on s.clazz_id = c.id;
mysql的函數(shù)
? ? 1. max 最大值
? ? ? 求男生的最大年齡
? ? ? select gender, max(age) mage from stu2 group by gender having gender = 'm';
? ? 2. min? 最小值
? ? ? 求女生最小年齡
? ? ? select gender, min(age) mage from stu2 group by gender having gender = 'g';
? ? 3. count? 數(shù)量和
? ? ? 分別求男生和女生的數(shù)量
? ? ? select gender, count(gender) gcount from stu2? group by gender;
? ? 4. avg 平均數(shù)
? ? 男生和女生的年齡的平均數(shù)
? ? select gender, avg(age) gcount from stu2? group by gender;
? ? 5. concat 字段拼接
? ? ? 全表查詢渊额,把姓名字段和年齡字段拼接輸出
? ? ? select name,age,concat(name,'-','age') cc from stu2;
? ? 6. substring 字段裁剪 substring(字段,begin,count)? begin 是從1開始的
? ? ? 截取姓名的字段的首字母輸出
? ? ? select name ,substring(name,1,1) sub from stu2;