MySQL之----在java編程加強知識點
阿新 • • 發佈:2018-02-10
必須 star alter 自己 記錄 mark person primary 父親
多對多
在創建表時指定主鍵---在聲明主鍵時。應該同一時候使用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進行限制。
使用關聯對數據進行查詢 當一個表的數據不能滿足我們的須要時。我們就要從多個表中查詢數據。
總結:
一致性(consistency):在事務處理運行前後,數據庫是一致的(數據庫數據完整性約束)。?
隔離性(isolcation):一個事務處理對還有一個事務處理的影響。
設置事物隔離級別 在mySql的命令行設置隔離級別。
在MySql的命令行設置隔離級別,僅僅對此打開的命令行窗體有效。第一個命令行窗體,就是一個獨立的client。
Select @@tx_isolation; 能夠查看眼下的隔離級別。
在數據中,建表處理是非經常見且非常有用的方法。
表和表之間的關系有 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編程加強知識點