第69節:Java中數據庫的多表操作
前言
學習數據庫的多表操作,去電商行業做項目吧!!!
達叔,理工男,簡書作者&全棧工程師,感性理性兼備的寫作者,個人獨立開發者,我相信你也可以!閱讀他的文章,會上癮!,幫你成為更好的自己。
感謝!承蒙關照!
數據庫的創建:
create database 數據庫名 character set 字符集 collate 校對規則
數據庫的刪除:
drop database 數據庫名
修改
alter database 數據庫 character set 字符集
查詢
show databases
show create database 數據庫的名字
select database();
當前數據庫
切換數據庫
use
數據庫名字
表操作:
create table 表名(
列名 列的類型 列的約束,
列名 列的類型 列的約束
)
列的類型:
char/varchar
列的約束
primary key
主鍵的約束
unique
唯一約素
not null
非空約素
自動增加 auto_increment
刪除: drop table
表名
修改: alter table
表名(add, modify, change, drop
)
修改表名:
rename table
舊表名 to
新表名
alter table 表名 character set 字符集
查詢:
show tables;
查詢所有表
show create table 表名;
查詢表的定義,表的創建語句
desc
用於查詢表的結構
表的插入:
insert into
表名(列名,列名) values
(值1,值2);
表的刪除:
delete from 表名 [where 條件]
表的修改:
update 表名 set 列名='值', 列名='值' [where 條件];
表的查詢:
select [distinct] * [列名1,列名2] from 表名 [where 條件];
where
的使用
>, >=, <, <=, !=, <>
is null is not null
in
between...and
and or not
like:
_:代表單個字符
%:代表多個字符
分組: group by
條件過濾: having
聚合函數:
sum();
avg();
count();
max();
min();
排序:
order by
asc: 升序
desc: 降序
多表查詢
查看數據庫
show databases;
創建數據庫
create database dashu;
使用數據庫
use dashu;
多表之間的約束
多表間的關系如何維護:
添加外鍵約束:
forerign key
alter table product add foreign key(cno) references category(cid);
從product
添加到category
里.con
等於cid
之間有關系.
category
product
如果建立了表的外鍵約束,比如是產品,和產品分類,如果要刪除產品分類,就要把產品分類對應產品的編碼刪除掉.
一個項目建立一個數據庫
多表之間的關系:
一對多:商品和分類
分類是1,商品是多.
添加外鍵指向主鍵;
口訣:在多的一方添加一個外鍵,指向一的一方的主鍵.
多對多: 老師和學生,學生選課
多對多的關系很難表示?
口訣:多對多建表,多建一張中間表,中間表至少要有兩個外建,這兩個外鍵分別指向原來的那張表.
就是把多對多的關系弄成一對多的關系.
中間表的關系就是一對多的關系,一個學生學課表,一對多.
有兩個外鍵以上,課表的編號對應學生.
建表的原則是,多對多的關系,中間要建立一個中間表連接, 中間表的字段就是外鍵, 至少要有兩個以上, 建表嘛, 至少兩個字符, 將多對多的關系拆分成一對多的關系,然后分別指向原來的那兩張表.
一對一的關系: 公民和身份證
在一對一里添加一個外鍵指向id
主鍵,添加唯一約素,外鍵,m->1
.一對一是當作一對多處理,在任意一張表中添加一個外鍵,並且指向另一張表.將兩張表合並為一張,可以將兩張表的主鍵建立起來,連接,並讓兩張表中的主鍵相等.
拆表:
用於將個人常用的信息和不常用的信息拆分出來,使得查詢效率更好,提供更好用戶的體驗.在表關系里,多對多用得比較多,一對多,然后才一對一.
用戶表,訂單表, 商品表,分類表
用戶表:
用戶ID
用戶名
密碼
手機號
訂單表
訂單編號
訂單總價
創建時間
收貨地址
商品表
商品編號
商品名稱
商品價格
商品分類
分類ID
分類名稱
分類描述
用戶id,地址
分析
用戶表到訂單表->1對多
訂單表創建一個外鍵,然后指向用戶id.
商品表->商品分類
商品表中加外鍵->指向商品分類的id
訂單表 和 商品表 -> 中間表
一個訂單可以買多個商品
一個商品可以被多個用戶去買,可以被多個訂單所選擇
m對n:
中間表 -> 外鍵約束多 -> 指向訂單表 和 商品表為一.
訂單表 商品表
中間表-> 訂單編號 商品編號
// 用戶表
create table user (
uid int primary key auto_increment,
username varchar(31),
password varchar(31),
phone varchar(11)
);
insert into user(1,'zhangsan','12345','13344442333');
// 訂單表(訂單編號,訂單時間,總價,地址,外鍵
create table orders(
oid int primary key auto_increment,
sum int not null,
otime timestamp,
address varchar(100),
uno int,
foreign key(uno) references user(uid)
);
insert into orders values(1,200, null, '廣州',1);
insert into orders values(2,300, null, '深圳',2);
// 商品表
// 商品id,商品名稱,商品價格,外鍵
create table product(
pid int primary key auto_increment,
pname varchar(10),
price double,
cno int,
foreign key(cno) references category(cid)
);
// 添加商品
insert into product values(null, 'xiaomi', 233, 1);
// 商品分類表
// 分類id,分類名稱,分類描述
create table category(
cid int primary key auto_increment,
cname varchar(15),
cdesc varchar(100)
);
insert into category values(null, '手機', '電子');
中間表,訂單項
// 中間表:訂單id,商品id,商品數量,訂單項總價
create table orderitem(
ono int, // -> oid
pno int, // -> pid
foreign key (ono) references orders(oid),
foreign key (pno) references product(pid)
count int,
subsum double
)
select * from orders;
select * from product;
// 訂單 商品 商品數量 商品總價
insert into orderitem values(1,7,100,100);
insert into orderitem values(1,8,100,100);
// 添加商品
insert into orderitem values(2,5,1,100);
insert into orderitem values(2,3,100,100);
小結
// 多表之間關系的維護是由外鍵約束
foreign key
添加一個外鍵:
alter table product add foreign key (con) references category(cid);
foreign key (cno) references category (cid)
建表原則:
一對多:
口訣: 在多的一方添加外鍵並指向另一張表
多對多:
口訣: 將多對多的情況變成一對多的關系中間有一張中間表
一對一:多用於拆表
將兩張表合並為一張表,將兩張表的主鍵建立起關系,原理將一對一變成一對多去處理
主鍵和唯一約束
唯一約素: 列里面的內容是唯一的,不能有重復的情況,但是可以為空.唯一約素是不能作為其它表的外鍵的,可以有多個唯一約素.
主鍵約束是不能為空的,唯一.外鍵都是指向另外一張表的主鍵,一張表只能有一個主鍵.
一對多:
在多的一方添加一個外鍵指向另一方
多對多:
拆成一對多,中間創建一個表,至少有兩個外鍵,指向原來的表
一對一:
合並一張表,將主鍵建立關系
數據庫軟件
SQLyog
和下載mysql
軟件.
架構設計器
category
orderitem
orders
product
user
// user 1->m
uid
username
password
phone
// orders
oid
sum
otime
address
uno
// orderitem
ono
pno
ocount
subsum
// product
pid
pname
price
cno
//category
cid
cname
cdesc
多表查詢
交叉連接查詢
笛卡爾積:查出來的是兩張表的乘積
select * from product,category cno = cid;
select * from product as p,category as c where p.cno = c.cid;
select * from product p,category c where p.cno = c.cid;
內連接查詢
隱式內連接:
select * from product p, category c where p.cno = c.cid;
顯示內連接
select * from product p inner join category c on p.con = c.cid;
區別:
1.在查詢出結構的基礎上去做的where條件過濾;
2.是帶條件去查詢結果的,執行效率高
// 添加數據
insert into product values(null,'dashujava',10,null);
左外連接
select * from product p left outer join category c on p.cno = c.cid;
左外連接會將左表中的所有數據都查出來,如果右表沒有會用null代替.
// 右category 分類
insert into category values(100, '電腦', '詳情');
右外連接
select * from product p right outer join category c on p.cno = c.cid;
右外連接是只要右邊有就顯示
右外連接會將右表的所有數據都查出來,如果左邊沒有會用null替代.
分頁查詢
limit
select * from product limit 0,10;
select * from product limit 0,3;
select * from product limit 3,3;
startindex = (index-1)*3
計算啟始索引
select * from product
// 查詢分類名為手機
select cid from category where cname='手機';
select * from product where cno=1;
子查詢
select * from product where cno=(select cid from category where cname='手機');
// 查詢信息
左連接:
select * from product p left outer join category c on p.cno = c.cid;
// 子查詢 商品名稱, 商品分類名稱
select pname, cno from product;
select pname, (select cname c from category where p.cno = c.cid) from product p;
select max(sal) from emp;
select min(sal) from emp;
select * from emp where sal = (select max(sal) from emp);
select * from emp where sal = (select min(sal) from emp);
如果看了覺得不錯
點贊!轉發!
達叔小生:往后余生,唯獨有你
You and me, we are family !
90后帥氣小伙,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書博客: 達叔小生
https://www.jianshu.com/u/c785ece603d1
結語
- 下面我將繼續對 其他知識 深入講解 ,有興趣可以繼續關注
- 小禮物走一走 or 點贊