第69節:Java中數據庫的多表操作


標題圖

第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 點贊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM