1. 程式人生 > >Java第二十六(mysql多表操作)

Java第二十六(mysql多表操作)

SQL建立多表及多表的關係

多表間關係的維護

外來鍵約束:foreign key

		給product中的這個cno新增一個外來鍵約束
		
		alter table product add foreign key(cno) references category(cid);

		再插入cid不匹配的資料會失敗

	從分類表中刪除分類為5的資訊
	delete from category where cid=4;//刪除失敗
	首先得去product表中刪除分類id為4的商品

建資料庫原則

通常情況下,一個專案應用於建一個數據庫

多表之間的建表原則

  • 一對多:商品和分類

      建表原則:在多的一方新增一個外來鍵指向一的一方的主鍵
    
  • 多對多:老師和學生,學生和課程

      建表原則:多建一張中間表,將多對多的關係拆成一對多的關係,中間至少要有兩個外來鍵,這兩個外來鍵分別指向原來的那張表
    
  • 一對一

      建表原則:
      	將一對一的情況,當作是1對多的情況處理,在任意一張表新增一個外來鍵,並且這個外來鍵唯一,指向另一張表
      	直接將兩張表合併成一張表
      	將兩張表主鍵建立起連結,讓兩張表裡面主鍵相等
      實際用途:用的不是很多(拆表操作)
      	相親網站:
      		個人資訊:姓名,性別,年齡,身高,體重,三維,興趣愛好(年收入、特長、學歷、職業、擇偶目標)
      		拆表操作:將個人資訊的常用資訊和不常用資訊拆分出來,減少表的臃腫
    

網上商城表例項分析:使用者購物流程

使用者表(使用者的ID,使用者名稱,密碼,手機)

create table user(
	uid int primary key auto_increment,
	username varchar(31),
	password varchar(31),
	phone varchar(11)
);

insert into user values(1,'Alsa','123','15822224444');

訂單表(訂單編號,總價,訂單時間,地址,外來鍵使用者的ID)

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,'jingsu',1);
insert into orders values(2,1176,null,'lianyungang',1);

商品表(商品ID,商品名稱,商品價格,外來鍵cno)[先建商品分類]

create table product(
	pid int primary key auto_increment,
	pname varchar(30),
	price double,
	cno int,
	foreign key(cno) references category(cid)
);

insert into product values(null,'Wuliangye',998,4);
insert into product values(null,'Cocktail',6,4);
insert into product values(null,'Jenny Bakery',5,3);
insert into product values(null,'Huawei Glory v10',2000,5);
insert into product values(null,'Dress',168,1);
insert into product values(null,'High-heeled shoes',400,2);
insert into product values(null,'Sandals',100,2);
insert into product values(null,'Stewed Chicken Point',42,3);
insert into product values(null,'Mousse Cake',58,3);
insert into product values(null,'Samsung S10',5000,5);
insert into product values(null,'shirt',120,1);

訂單項:中間表(訂單ID,商品ID,商品數量,訂單項總價)

create table orderitem(
	ono int,
	pno int,
	foreign key(ono) references orders(oid),
	foreign key(pno) references product(pid),
	ocount int,
	subsum double
);
給1號訂單新增200塊商品
insert into orderitem values(1,7,1,100);
insert into orderitem values(1,9,1,58);
insert into orderitem values(1,8,1,42);
	給2號訂單新增1176元商品
insert into orderitem values(2,1,1,998);
insert into orderitem values(2,3,2,10);
insert into orderitem values(1,5,1,168);

商品分類表(分類ID,分類名稱,分類描述)

create table category(
	cid int primary key auto_increment,
	cname varchar(15),
	cdesc varchar(100)
);

insert into category values(null,'clothes','Clothes that can not be trimmed are not good fabrics');
insert into category values(null,'shoes','Walking in all directions begins at the foot');
insert into category values(null,'food','Make a tasteful meal');
insert into category values(null,'Beverages','A little tightening makes life better');
insert into category values(null,'Digital','Look at the world without going out');

主鍵約束:預設是指向另一張表的主鍵

外來鍵都是指向另外一張表的主鍵
主鍵一張表只能有一個

唯一約束:列裡面的內容,必須是唯一,不能重複出現重複,可以為空

唯一約束不能作為其他表的外來鍵
可以有多個唯一約束

多表查詢

交叉連線查詢 笛卡爾積

笛卡爾積,查出來是兩張表的乘積結果沒有意義
select * from product,category;

過濾出有意義的資料
select * from product,category where 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;
顯式內連線(inner可省略)
select * from product p inner join category c on p.cno=c.cid;
區別:
	隱式內連線是在查詢出結果的基礎上去做的where條件過濾
	顯示內連線是帶著條件去查詢結果,執行效率要高。

資料準備:在product中插入一個沒有對應cid的資料

insert into product values(null,'flowers',40,null);

左外連線(outer可省略)

select * from product p left outer join category c on p.cno=c.cid;

資料準備:在category中插入一行資料

insert into category values(100,'birds','Birds twitter and fragrance of flowers');

右外連線(outer可省略)

select * from product p right outer join category c on p.cno=c.cid;

分頁查詢

每頁資料10條,起始索引1

select * from product limit 0,3;
select * from product limit 3,3;
第一個引數是資料索引,第二個引數是顯示的個數
起始索引:index代表顯示第幾頁,頁數從1開始
每頁顯示3條資料
每頁開始的資料索引startindex=(index-1)*3

子查詢(瞭解)

查詢出(商品名稱,商品分類名稱)資訊

左連線(outer可省略)
select p.pname,c.cname from product p left outer join category c on p.cno=c.cid;
子查詢
select pname,(select cname from category c where p.cno = c.cid) from product p;

查詢出分類名稱為手機數碼的所有商品

select cid from category where cname='Beverages';
select * from product where cno = (select cid from category where cname='Beverages');

相關推薦

Java第二mysql操作

SQL建立多表及多表的關係 多表間關係的維護 外來鍵約束:foreign key 給product中的這個cno新增一個外來鍵

系統學習 Java IO ()----這麽類,應該用哪個?

寫作 tin nts .com puts tab cto ces 類型 目錄:系統學習 Java IO---- 目錄,概覽 ### Java IO目的和功能 Java IO 包含 InputStream,OutputStream,Reader 和 Writer 類的許多子類

“全棧2019”Java第二章:流程控制語句中迴圈語句do-while

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第二十六章:流程控制語句中迴圈語句do-while 下一章 “全棧2019”Java第二十七

Html學習之表格與單學習--課程表制作

居中 htm meta rowspan title 結果 utf-8 使用 class <!DOCTYPE html> <html> <head> <meta charset="UTF-8">

Django模型層操作

創建 gif 唯一性 add 技術分享 pri 生成 res 自動 創建模型 (一)多表查詢 一對一:models.OneToOneField(to_field=‘id‘,to=‘Authordatil‘) 一對多:(外鍵設置唯一性) m

LNMP架構二php-fpm的open_basedir

二十六、php-fpm的open_basedir        將 PHP 所能開啟的檔案限制在指定的目錄樹,包括檔案本身。本指令不受安全模式開啟或者關閉的影響。       當一個指令碼試圖用例如 fopen() 或者

QT學習之路QWebView實現簡易瀏覽器

QtWebkit 模組介紹   QtWebkit 模組提供了一個在Qt中使用web browser的engine,這使得我們在QT的應用程式中使用全球資訊網上的內容變得很容易,而且對其網頁內容的控制也可以通過native controls 實現  。   QtWebkit具

Oracle關聯更新update關聯

.Oracle沒有update from語法,可以通過兩種實現方式: 1、利用子查詢:      update    A        SET    欄位1=(select    欄位表示式    from    B    WHERE    ...),       

java程式設計師第課 -MySQL資料庫的查詢

課程回顧:MySQL資料庫和SQL語言 資料庫的概述 1.資料庫的作用:倉庫,儲存資料。 2.關係型的資料庫,儲存實體與實體之間的關係。 3.常見的資料庫 * Oracle MySQL SQLServer DB2 MySQL資料庫的安裝和解

Java進階學習第二JavaScript增強、AJAX基礎

一、JavaScript增強 1、什麼是JavaScript ① 基於物件 JS本身就有一些現成的物件可供程式設計師使用,例如:Array、Math、String ② 事件驅動 JS程式碼寫好後,需要外界觸發後,方可執行,例如:單擊事件,定時執行 ③ 解釋性 每

Java進階學習第二JSON基礎、jQuery基礎

一、JSON基礎 1、JSON的定義 ① JSON(Java Script Object Notation)是一種輕量級的資料交換語言,以文字字串為基礎,且易於讓人閱讀 注意:XML就是一個重量級的資料交換語言 ② JSON採用完全獨立於任何程式語言的文字格式,

Java第二二天html單標籤和css

1.html表單標籤 <!DOCTYPE html> <html>   

Java第二五天mysql

Mysquel資料庫與JDBC 1.完成對分類表的CRUD的操作 資料庫的概述 資料庫是一個檔案系統,只不過我們需要通過命

Hibernate中的操作1:單向對一

art 保存 int gen round t對象 情況 映射文件 拋出異常 由“多”方可知“一”方的信息,比如多個員工使用同一棟公寓,員工可以知道公寓的信息,而公寓無法知道員工的信息。 案例一: pojo類 public class Department {

Hibernate中的操作4:單向一對一

odin utf-8 lds () clas string 方式 rdb style 案例一: 註解方式實現一對一 UserBean.java package bean; import java.io.Serializable; import javax.pers

Android實戰簡易教程-第二基於ViewPager實現微信頁面切換效果

stat addview data android tid des viewpage 聊天 == 1.頭部布局文件top.xml:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and

走入計算機的第二內置模塊4

poll 讀取 input stdout 自定義 call 叠代器 流控 ons 一 補充正則表達式的其他一些使用方法 1.貪婪模式:在滿足匹配時,匹配盡可能長的字符串,默認情況下,采用貪婪匹配 1 #貪孌匹配 2 # ret=re.findall("abc+","abc

MYSQL學習筆記2連接查詢

mysql3種連接方式的區別:INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關系的記錄。LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。3個表連接查詢

python全棧開發基礎【第二篇】concurrent.futures模塊、協程、Greenlet、Gevent

會有 什麽 www 上一個 join 開發 tps 初始化 brush 註意 1.不能無限的開進程,不能無限的開線程最常用的就是開進程池,開線程池。其中回調函數非常重要回調函數其實可以作為一種編程思想,誰好了誰就去掉2.只要你用並發,就會有鎖的問題,但是你不能一直去自己加鎖

python學習第二HTML

HTML簡介 HTML是一種超文字標記語言,它有自己的樹型結構,符合HTML結構的檔案稱作HTML檔案。我們使用瀏覽器從服務端獲得的頁面只是一個HTML檔案,然後經過瀏覽器按照固定規則渲染後,才是我們所看的網頁。所以瀏覽器是一個HTML檔案的直譯器。 <!D