1. 程式人生 > >MySQL之----在java編程加強知識點

MySQL之----在java編程加強知識點

必須 star alter 自己 記錄 mark person primary 父親

在數據中,建表處理是非經常見且非常有用的方法。

表和表之間的關系有 1:1

?1:N

? ? ? ? N:N

三種方式。

1對1的方式

<span style="font-size:18px;">演示樣例:一夫一妻
思考:在一個表中保存著全部人的信息。有男有女。要求查詢出全部的夫妻。即一男一女。
註意以下:王五是光棍不應該能查詢出來。</span>
<span style="font-size:18px;">CREATE TABLE person(
? ?id INT,
? ?NAME VARCHAR(10),
? ?sex CHAR(1),
? ?wife INT,
? ?husband INT
);
INSERT INTO person VALUES(1,‘小花‘,‘0‘,0,3);
INSERT INTO person VALUES(2,‘玉芬‘,‘0‘,0,4);
INSERT INTO person VALUES(3,‘張三‘,‘1‘,1,0);
INSERT INTO person VALUES(4,‘李四‘,‘1‘,2,0);
INSERT INTO person VALUES(5,‘王五‘,‘1‘,0,0);


//一對一關系的操作:查出每對夫妻的姓名
CREATE VIEW w AS SELECT * FROM person WHERE sex=‘0‘;
CREATE VIEW m AS SELECT * FROM person WHERE sex=‘1‘;
//不利用表與表之間的關系
SELECT w.NAME AS 妻子, m.NAME AS 丈夫 FROM w,m WHERE w.husband=m.id AND m.wife=w.id;
//如今更先進的方式:利用表間的關系
SELECT w.NAME AS 妻子, m.NAME AS 丈夫 FROM w INNER JOIN m ON w.husband=m.id AND m.wife=w.id;
</span>


1對多的方式

1對多,多對1。
一個人能夠擁有多輛汽車,要求查詢出某人所擁有的全部汽車。
依據範式的要求,應該設計兩張表。分別表示人的信息和汽車的信息。<strong>
</strong>
//步驟1:畫E-R圖
//步驟2:分別建實體表,並給多方的表加入外鍵約束
CREATE TABLE person2(
? ?id VARCHAR(32) PRIMARY KEY,
? ?pname VARCHAR(30),
? ?sex CHAR(1)
);
CREATE TABLE car(
? ?id VARCHAR(32) PRIMARY KEY,
? ?cname VARCHAR(30),
? ?price NUMERIC(10,2),
? ?pid VARCHAR(32),
? ?CONSTRAINT car_fk FOREIGN KEY(pid) REFERENCES person2(id)
);
DROP TABLE car;


//步驟3:為兩個表加入測試數據
//實體表1
INSERT INTO person2(id,pname,sex) VALUES(‘P001‘,‘Jack‘,‘1‘);
INSERT INTO person2(id,pname,sex) VALUES(‘P002‘,‘Tom‘,‘1‘);
INSERT INTO person2(id,pname,sex) VALUES(‘P003‘,‘Rose‘,‘0‘);
INSERT INTO person2(id,pname,sex) VALUES(‘P004‘,‘Mary‘,‘0‘);
INSERT INTO person2(id,pname,sex) VALUES(‘P005‘,‘Mike‘,‘1‘);
SELECT * FROM person2;


////實體表2
INSERT INTO car(id,cname,price,pid) VALUES(‘C001‘,‘BMW‘,123.5,‘P001‘);
INSERT INTO car(id,cname,price,pid) VALUES(‘C002‘,‘Benz‘,123.5,‘P001‘);
INSERT INTO car(id,cname,price,pid) VALUES(‘C003‘,‘BMW‘,223.5,‘P001‘);


INSERT INTO car(id,cname,price,pid) VALUES(‘C011‘,‘BMW‘,83.5,‘P003‘);
INSERT INTO car(id,cname,price,pid) VALUES(‘C012‘,‘Benz‘,100,‘P003‘);
INSERT INTO car(id,cname,price,pid) VALUES(‘C013‘,‘Audi‘,223.5,‘P003‘);


INSERT INTO car(id,cname,price,pid) VALUES(‘C021‘,‘BMW‘,88.5,‘P004‘);
INSERT INTO car(id,cname,price,pid) VALUES(‘C022‘,‘QQ‘,10,‘P004‘);


INSERT INTO car(id,cname,price,pid) VALUES(‘C023‘,‘Audi‘,73,‘P005‘);
INSERT INTO car(id,cname,price) VALUES(‘C033‘,‘Audi‘,1000);
/查詢:哪些人有什麽樣的車 (用"表名.列名"的形式訪問列,假設列名不反復,能夠省略表名)
//利用一方的主鍵和“多方”的外鍵進行關聯
SELECT person2.pname,car.cname FROM person2,car WHERE person2.id=car.pid;
//查詢Jack有什麽車
SELECT person2.pname,car.cname FROM person2,car WHERE person2.id=car.pid AND person2.pname=‘Jack‘ ;
//查詢哪些人有兩輛以上的車
SELECT person2.pname,COUNT(pname) AS 車數量 FROM person2,car WHERE person2.id=car.pid GROUP BY pname HAVING COUNT(pname)>=2 ORDER BY 車數量;
SELECT * FROM person2 WHERE id IN ( SELECT pid FROM car GROUP BY pid HAVING COUNT(pid)>=2 );


//查詢哪些人沒有車
SELECT * FROM person2 WHERE id NOT IN( SELECT pid FROM car );
多對多

多對多:
一個人能夠擁有多種角色。如某人,即是父親、又是兒子、又是丈夫。而同一時候這三個角色又能夠給其它全部的人。

要求查詢出即是父親、又是兒子、又是丈夫的全部人。

查詢出全部人擁有的全部角色。<strong> </strong>

還有學生選課系統都是多對多的情況 
詳細的實現方法在最後的比筆記中貼出來


數據庫的約束

主鍵 primary key
在創建表時指定主鍵---在聲明主鍵時。應該同一時候使用not nullkeyword。
Create table stud(id int primary key,…..)
在創建完畢之後指定主鍵:
Alter table stud add constraint stud_pk primary key(id);
主鍵自己主動增長:
Auto_increment 適合於int類型的字段
外鍵 foreign key-表示一種引用關系
與還有一個表的關聯關系-稱為外鍵。外鍵的作用時當主表中沒有記錄時。無法向子表中寫入無引用的記錄:
Alter table stud ?add constraint stud_fk foreign key(stud_clsid) references cls(id);
主外鍵關系是一種1對多的關系。假設主表中沒有的記錄,子表中將不能添加。
創建主外鍵關聯,兩個表的數據類型和大小必須保持一致否則創建將不會成功。
能夠通過可視化界面操作主外關聯。
唯一 unique – 與主鍵有所差別,主鍵不能為null,而unique能夠有一列為null這是SqlServer的限制,但Mysql能夠寫入多列的null值,所以,在mysql上使用unique時一般再通過not null進行限制。


alter table cls ?add constraint cls_uk unique(name); /* 指定name不能反復*/
默認值 default
在創建表時,能夠指定默認值如:
Create table stud(sex char(1) default ‘1’,…..);

使用關聯對數據進行查詢 當一個表的數據不能滿足我們的須要時。我們就要從多個表中查詢數據。

此時必須使用關聯查詢:
inner join – 內關聯。兩方必須都要存在。?
left join -左關聯。

以左邊數據為準。
right join - 右關聯。在上面的表與表之間的關系用到的

總結: 技術分享圖片

存儲過程

三種方式:

1。最簡單。最主要的方式。

“DELIMITER$$”這句是為了讓解析器把“$$”當作結束標誌(否則默認是把“;“號當作結束標記),這樣存儲過程中的語句結束符";"就不會當作過程的結束標記。

DELIMITER$$
CREATE PROCEDURE p1()
BEGIN
   SELECT * FROM stud;
   INSERT INTO stud(id,sname,age,score,dept) VALUES(1014,‘劉三豐‘,33,55,‘通信學院‘);
END$$
DELIMITER;   //把結束標記還原回來

CALL p1();  //調用存儲過程p1

2。帶參數的方式

//帶參數的存儲過程
DELIMITER$$
CREATE PROCEDURE p2(IN id INT, IN nm VARCHAR(30) )
BEGIN
   INSERT INTO stud(id,sname) VALUES(id,nm);
END$$
DELIMITER ; 

DROP PROCEDURE p2;
CALL p2(1015,‘吊絲‘);

3,帶返回值的

//有返回值的存儲過程----參數與變量問題( @變量名  。一個@為用戶變量。兩個@即 @@為全局的系統變量 )
DELIMITER$$
CREATE PROCEDURE p3(IN id INT, IN nm VARCHAR(30), OUT num INT )
BEGIN
   INSERT INTO stud(id,sname) VALUES(id,nm);
   SELECT COUNT(*) INTO num FROM stud;
END$$
DELIMITER ; 
CALL p3(1016,‘無名‘,@aa);
SELECT @aa; //輸出變量aa的值


MySql差別大寫和小寫的查詢

<span style="font-size: 18px; white-space: pre;">	</span>mysql查詢默認是不區分大寫和小寫的 如:
<span style="white-space:pre">		</span>select? * from? table_name where? a like? ‘a%‘??? 
<span style="white-space:pre">		</span>select? * from? table_name where? a like? ‘A%‘??? 
<span style="white-space:pre">		</span>select * from table_name where a like ‘a%‘
<span style="white-space:pre">		</span>select * from table_name where a like ‘A%‘
<span style="white-space:pre">	</span>效果是一樣的。 
<span style="white-space:pre">		</span>要讓mysql查詢區分大寫和小寫。能夠:
<span style="white-space:pre">		</span>select? * from? table_name where? binary? a like? ‘a%‘??
<span style="white-space:pre">		</span>select? * from? table_name where? binary? a like? ‘A%‘???
<span style="white-space:pre">		</span>select * from table_name where binary a like ‘a%‘
<span style="white-space:pre">		</span>select * from table_name where binary a like ‘A%‘
<span style="white-space:pre">		</span>也能夠在建表時,加以標識? 
<span style="white-space:pre">		</span>create table table_name(
????<span style="white-space:pre">		</span> a varchar(20) binary
<span style="white-space:pre">		</span>)<span style="font-size: 18px;">
</span>

事務transaction:?

原子性(atomicity):組成事務處理的語句形成了一個邏輯單元,不能僅僅運行其中的一部分。?
一致性(consistency):在事務處理運行前後,數據庫是一致的(數據庫數據完整性約束)。?
隔離性(isolcation):一個事務處理對還有一個事務處理的影響。

?
持續性(durability):事務處理的效果能夠被永久保存下來 。
一個事務僅僅會有一個結果:要麽成功、要麽失敗。

Start transaction;開始一個事務。

Commit;提交所做的改動。 Rollback;回滾所做的改動。假設在操作時出錯。應該從新開始一個事務。


技術分享圖片

設置事物隔離級別 在mySql的命令行設置隔離級別。
在MySql的命令行設置隔離級別,僅僅對此打開的命令行窗體有效。第一個命令行窗體,就是一個獨立的client。
Select @@tx_isolation; 能夠查看眼下的隔離級別。


Set transaction isolation level <級別名稱>能夠設置隔離級別。
級別名稱為:{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }?
須要註意的是,隔離級別必須要在事務其中使用,沒有事務,隔離級別也沒有意義了。

※事務處理
START TRANSACTION
  DELETE FROM stud WHERE id=1015;
  DELETE FROM stud WHERE id=1014;
  SELECT * FROM stud;

ROLLBACK /  COMMIT;

MySQL之----在java編程加強知識點