Mysql筆記3

背景:兩個表,students、classes

– 子查詢 select …. select

-- 標量子查詢  子查詢得到的結構 是一行一列
-- 子查詢的語句 必須在小括號之內
-- 查詢學生的平均身高
select avg(height) from students;

-- 查詢出高於平均身高的信息
select * from students where height > 172;(ps:avg=172)

select * from students where height > (select avg(height) from students);



-- 列級子查詢  查詢的結果是一列多行
-- 查詢哪些班級有學生
-- 主查詢: 班級名字
select classes.name from classes where id in (select distinct cls_id from students);

-- 列級子查詢對應的關鍵字 in

-- 查找哪些班級沒有學生
select classes.name from classes where id not in (select distinct cls_id from students);

-- 也可以通過內連接查詢實現
select classes.name from classes inner join students on classes.id = students.cls_id;
select distinct classes.name from classes inner join students on classes.id = students.cls_id; 


-- 行級子查詢 

-- 表級子查詢

-- 查詢班級上身高最高的學生的信息
select * from students where height = (select max(height) from students);
select * from students where age = (select min(age) from students);

– 數據庫備份與恢復
– 備份
mysqldump liunx下
mysqldump -uroot -p 備份的數據庫名字 > xxx.sql

-- 恢復  需要退出mysql終端交互環境
1. 創建一個數據庫: demo
2. mysql -uroot -p demo < xxx.sql

– 數據庫設計
– 三範式
第一範式(1NF):強調的是列的原子性,即列不能夠再分成其他幾列。
第二範式(2NF):首先是 1NF,另外包含兩部分內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分,即字段必須完全依賴一個主關鍵字。
第三範式(3NF):首先是 2NF,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的情況。

-- E-R模型

E表示entry,實體,設計實體就像定義一個類一樣,指定從哪些方面描述對象,一個實體轉換爲數據庫中的一個表
R表示relationship,關係,關係描述兩個實體之間的對應規則,關係的類型包括包括一對一、一對多、多對多
關係也是一種數據,需要通過一個字段存儲在表中
實體A對實體B爲1對1,則在表A或表B中創建一個字段,存儲另一個表的主鍵值

– 類似京東商城
– 求所有電腦產品的平均價格,並且保留兩位小數
select round(avg(price),2) from goods;

– 查詢所有價格大於平均價格的商品,並且按價格降序排序
– 標量子查詢
select * from goods where price > (select round(avg(price),2) from goods) order by price desc;

– 查詢類型cate_name爲 ‘超級本’ 的商品名稱、價格
select name, price from goods where cate_name = “超級本”;

– 顯示商品的種類
select cate_name from goods group by cate_name;

– 顯示每種商品的平均價格
select cate_name, avg(price) from goods group by cate_name;

– 查詢每種類型的商品中 最貴、最便宜、平均價、數量
select cate_name, max(price), min(price),avg(price), count(*) from goods group by cate_name;

– 查詢每種類型中最貴的電腦信息
– 表級子查詢
select * from goods inner join (select cate_name, max(price) as max_price, min(price),avg(price), count(*) from goods group by cate_name) as temp on goods.cate_name = temp.cate_name and goods.price = temp.max_price;

– insert … select
insert into goods_cates (name) select cate_name from goods group by cate_name;

– 根據goods_cates 表 更新goods 表 goods.cate_name = goods_cates.name
update goods inner join goods_cates on goods.cate_name = goods_cates.name set goods.cate_name = goods_cates.id;

– 修改表結構
alter table goods change cate_name cate_id int unsigned not null;

– brand_name 品牌名稱
– 創建表 並且插入數據 一步到位
– 查詢的字段名需要創建表的字段名一致 才能夠一一對應
– create … select
– create table goods_brands(
– id int unsigned primary key auto_incrment not null,
– name varchar(40) not null
– ) select brand_name from goods group by brand_name;

create table goods_brands(
id int unsigned primary key auto_increment not null,
name varchar(40) not null
) select brand_name as name from goods group by brand_name;
– 字符串某些情況下也可以存儲到int 中 “56” -> int 錯誤:”56bnc” xx–> int

— 根據goods_brand表 來更新 goods表
update goods inner join goods_brands on goods.brand_name = goods_brands.name set goods.brand_name = goods_brands.id;

– 顯示商品的完整信息
– inner join
– 多表的連接 不要添加 逗號 和 and
select * from goods as g inner join goods_cates as c on g.cate_id = c.id inner join goods_brands as b on g.brand_id = b.id;

– left join 左外連接查詢
select * from goods as g left join goods_cates as c on g.cate_id = c.id left join goods_brands as b on g.brand_id = b.id;
– 以最左邊的表做主表 依次向後連接其他的表

– 外鍵
– 對於已經存在的表 設置外鍵約束–> 更新
– goods_brands 必須存在 並且有id這個字段
alter table goods add foreign key (brand_id) references goods_brands(id);

alter table goods add foreign key (cate_id) references goods_cates(id);

– 刪除外鍵約束
alter table goods drop foreign key goods_ibfk_1;

– 索引 提高查詢的效率 新華字典

[1,5,8,10,20,50,60]
– 遍歷查找 時間複雜度: O(n) 最低的效率
– 二分查找 有序的序列: O(logn) 2 ^ n = 8 –> log8 = 3 8 / 2/ 2/ 2 = 1 –> 3 42億 需要32查詢
– 數據庫: 比logn 時間複雜度還要低: B+樹 多路查找的平衡樹
– 創建表的時候 直接設置外鍵約束

– 學習在python調用 mysql
py3.0 pymysql
py2.0 mysqldb

insert into goods (name,cate_id,brand_id,price)
values(‘惠普LaserJet Pro P1606dn 黑白激光打印機’, 12, 4,’1849’);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章