MySQL
主要介紹了數(shù)據(jù)表記錄查詢和多表記錄查詢基本方法。謝閱具练!
一.MySQL概述
1.數(shù)據(jù)庫概述
數(shù)據(jù)庫就是一個文件系統(tǒng),通過標準的SQL語句獲取數(shù)據(jù)
2.SQL語言
結(jié)構(gòu)化查詢語言
DDL:數(shù)據(jù)定義語言
create,drop,alter..
DCL:數(shù)據(jù)控制語言
grant华望,if…
DML:數(shù)據(jù)操縱語言
insert,update仅乓,delete…
DQL:數(shù)據(jù)查詢語言
Select
3.MySQL
關(guān)系型數(shù)據(jù)庫赖舟。
一個項目創(chuàng)建一個數(shù)據(jù)庫,一個數(shù)據(jù)庫類有許多表夸楣,一個表內(nèi)有多條記錄宾抓。
在這里我們引入一種ER模型子漩,E指的是Entity Relation(實體關(guān)系)。實體類似于Java中的類石洗,一個類創(chuàng)建一個表幢泼,表中的字段的類似于類中的屬性。類與類之間存在某種關(guān)系(關(guān)系有一對多讲衫,多對多)缕棵。當創(chuàng)建一個實體的實例的時候就在數(shù)據(jù)庫中加入了一條表記錄。
二.MySQL入門操作
1.連接與斷開服務器
為了連接服務器涉兽,當調(diào)用mysql時招驴,通常需要提供一個MySQL用戶名并且很可能需要一個密碼。如果服務器運行在登錄服務器之外的其它機器上枷畏,還需要指定主機名别厘。聯(lián)系管理員以找出進行連接所使用的參數(shù) (即,連接的主機矿辽、用戶名和使用的密碼)丹允。知道正確的參數(shù)后,可以按照以下方式進行連接:
shell> mysql -h host -u user -p
Enter password: ********
2.輸入查詢
命令之間用逗號隔開袋倔,以分號結(jié)束指令雕蔽。
mysql> SELECT VERSION(), CURRENT_DATE;
3.創(chuàng)建并使用數(shù)據(jù)庫
使用SHOW語句找出服務器上當前存在什么數(shù)據(jù)庫:
mysql> SHOW DATABASES;
利用USE訪問已存在的數(shù)據(jù)庫:
mysql> USE test;
①創(chuàng)建數(shù)據(jù)庫
mysql> create database menagerie;
數(shù)據(jù)庫名稱是區(qū)分大小寫的(不像SQL關(guān)鍵字),創(chuàng)建數(shù)據(jù)庫并不表示選定并使用它宾娜,你必須明確地操作批狐。為了使menagerie成為當前的數(shù)據(jù)庫,使用這個命令:
mysql> USE menagerie前塔;
Database changed嚣艇;
數(shù)據(jù)庫只需要創(chuàng)建一次,但是必須在每次啟動mysql會話時在使用前先選擇它华弓。你可以根據(jù)上面的例子執(zhí)行一個USE語句來實現(xiàn)食零。
②創(chuàng)建數(shù)據(jù)庫表
創(chuàng)建數(shù)據(jù)庫是很容易的部分,但是在這時它是空的寂屏,正如SHOW TABLES將告訴你的:
mysql> SHOW TABLES;
Empty set (0.00 sec)
較難的部分是決定你的數(shù)據(jù)庫結(jié)構(gòu)應該是什么:你需要什么數(shù)據(jù)庫表贰谣,各數(shù)據(jù)庫表中有什么樣的列。
創(chuàng)建一個表迁霎,申明表明吱抚,并給表中列元素申明類型
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
VARCHAR適合于name、owner和species列考廉,因為列值是變長的秘豹。這些列的長度不必都相同,而且不必是20昌粤。
③裝載數(shù)據(jù)到數(shù)據(jù)庫表
如果想要一次增加一個新記錄既绕,可以使用INSERT語句啄刹。最簡單的形式是,提供每一列的值岸更,其順序與CREATE TABLE語句中列的順序相同鸵膏。假定Diane把一只新倉鼠命名為Puffball膊升,你可以使用下面的INSERT語句添加一條新記錄:
mysql> INSERT INTO pet
???? -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
注意怎炊,這里字符串和日期值均為引號擴起來的字符串。另外廓译,可以直接用INSERT語句插入NULL代表不存在的值评肆。
三.以各種方法從表中檢索數(shù)據(jù)
> mysql -h host -u user -p
Enter password: ********
mysql> show databases;
mysql> create database db01;
mysql> use db01;
database changed非区;
mysql> show tables;
Empty set (0.00 sec)
mysql> create table student (name varchar(20), math int,english int,chinese int);
mysql> insert into student?values(‘jack’,80,98,99);
mysql> insert into student?values(‘back’,81,98,91);
mysql> insert into student?values('cack',,82,98,92);
mysql> insert into student?values('dack',,80,93,92);
mysql> insert into student?values('fack',,80,94,93);
insert into student values('jack',80,90,98);
SELECT語句用來從數(shù)據(jù)表中檢索信息瓜挽。語句的一般格式是:
SELECT ? what_to_select
FROM which_table
WHERE conditions_to_satisfy;
what_to_select指出你想要看到的內(nèi)容,可以是列的一個表征绸,或*表示“所有的列”久橙。which_table指出你想要從其檢索數(shù)據(jù)的表。WHERE子句是可選項管怠,如果選擇該項淆衷,conditions_to_satisfy指定行必須滿足的檢索條件。
1.基本查詢(查詢字段)
查詢所有學生考試成績信息
select * from student;
查詢英語成績信息(不顯示重復的值)
select distinct english from exam;
查看學生姓名和學生的總成績
select name,english+chinese+math from exam;
2.條件查詢
使用where關(guān)鍵字表示條件查詢
Select*from student where english >90;
模糊查詢使用like關(guān)鍵字
Select*from student where name like ‘%ac%’;
使用in表示查詢范圍
Select*from student where math in(93,94,95);
利用and和or表示邏輯關(guān)系進行條件選擇
3.排序查詢(order by)
使用order by對數(shù)據(jù)按照需求進行排序(asc表示升序渤弛,desc表示降序)
Select*from student order by math asc;
4.聚合函數(shù)
sum(字段名); 查詢某一列數(shù)據(jù)總和
max(字段名)祝拯,計算最大值
min(字段名),計算最小值
count(字段名)她肯,統(tǒng)計記錄條數(shù)
avg(字段名)佳头,計算平均值
聚合函數(shù)都是對列進行操作的(因為表中只用列嚴格規(guī)定數(shù)據(jù)類型相同,所以對列進行操作可以避免很多問題晴氨,如數(shù)據(jù)為null的情況)
5.?分組查詢
Use db01;
CREATE TABLE goods(
brand VARCHAR(20),
product VARCHAR(20),
price DOUBLE
)
INSERT INTO goods VALUES('小米','手機',2999);
INSERT INTO goods VALUES('小米','手機',3999);
INSERT INTO goods VALUES('小米','手機',4999);
INSERT INTO goods VALUES('小米','電視',2999);
INSERT INTO goods VALUES('小米','電視',2999);
INSERT INTO goods VALUES('小米','電視',4999);
INSERT INTO goods VALUES('華為','手機',2999);
INSERT INTO goods VALUES('華為','手機',5999);
INSERT INTO goods VALUES('OPPO','手機',2999);
INSERT INTO goods VALUES('海爾','電視',2999);
按品牌分組排序康嘉,顯示每個品牌的產(chǎn)品數(shù)量
Select brand,count(brand) from goods group by brand;
按品牌分組,顯示每個品牌每個產(chǎn)品的數(shù)目
select brand,count(*) from goods group by brand,product;
四.外鍵
實際操作的過程中一個數(shù)據(jù)庫內(nèi)有許多表籽前,表與表之間存在一對多亭珍,多對多,一對一之間的關(guān)系聚假。
1块蚌、單表之間的約束是:用來規(guī)范數(shù)據(jù)的完整性的,有“主鍵約束(primary key)”膘格,“唯一約束(unique)”峭范,“非空約束(not null)”
2、多表之間的約束是:用來表示多表之間的關(guān)系瘪贱,保持數(shù)據(jù)的一致性和完整性纱控。外鍵:如果一個表中的某個字段與另一個表中的主鍵字段有關(guān)系辆毡,那么就需要給這個字段添加外鍵并指向有關(guān)系的主鍵。
例如一個表為班(班級名甜害,班人數(shù))舶掖,一個表為學生(班級名,成績尔店,姓名)眨攘。
在學生表里面建立一個外鍵: foreign key (班級名) reference 班(班級名);
1.一對多情況:
一個班有多個學生,一個學生只能有一個班嚣州,所以外鍵創(chuàng)建在學生表中
2.多對多情況:
一個學生可以選多門課鲫售,一門課也可以被多個學生選擇。所以需要創(chuàng)建一個中間表该肴,中間表記錄了每個學生選每門課的情況情竹。中間表的學生創(chuàng)建外鍵綁定學生表,中間表的課程創(chuàng)建外鍵綁定課程表匀哄。
五.多表查詢
有的時候我們在數(shù)據(jù)庫中查詢信息往往需要從多個表中一起查詢秦效,因此需要多表聯(lián)合查詢。多表查詢分為連接查詢(join)和子查詢涎嚼。
1.連接查詢
連接查詢分為交叉連接(cross join)阱州、內(nèi)連接(inner join)、外連接(outer join)铸抑。交叉查詢是把兩個表的所有表記錄進行拼接贡耽,內(nèi)連接是把兩個表中都包含的表記錄進行拼接,外連接是把兩個表中相同的表記錄進行拼接鹊汛,同時可以保留某些表特有的表記錄(left outer join 保留的是左表特有記錄)
a)交叉連接: 查詢到的是兩個表的笛卡爾積,使用cross join關(guān)鍵字蒲赂。
語法:
①select * from 表1 cross join 表2;
②select * from 表1,表2;
b)內(nèi)連接:使用inner join…on關(guān)鍵字(inner可以省略)
i.顯式內(nèi)連接:在sql中使用了inner join…on關(guān)鍵字
語法:select * from表1 inner join 表2 on 關(guān)聯(lián)條件;
ii.隱式內(nèi)連接:在sql中沒有使用了inner join關(guān)鍵字
語法:select * from表1,表2 where 關(guān)聯(lián)條件;
c)外連接:使用left/right outer join…on關(guān)鍵字(outer可以省略)
i.左外連接:使用left outer join…on關(guān)鍵字
語法:select * from表1 left outer join 表2 on 連接條件;
ii.右外連接:使用right outer join…on關(guān)鍵字
語法:select * from表1 right outer join 表2 on 連接條件;
2.子查詢
一個查詢語句的條件需要依賴另一個查詢語句的結(jié)果就叫子查詢,也就是說sql語句可以嵌套使用刁憋。
現(xiàn)在有三個表滥嘴,學生表student,學生成績表stu_cour至耻,課程表course若皱。
現(xiàn)在查詢參加考試學生的成績(內(nèi)聯(lián))
SELECT *FROM student s JOIN stu_cour sc ON s.sid = sc.sid JOIN course c ON sc.cid=c.cid ORDER BY s.sid;
現(xiàn)在查詢每個學生的成績情況(外聯(lián))
SELECT*FROM student s LEFT JOIN (stu_cour sc JOIN course c ON sc.cid= c.cid ) ON s.sid = sc.sid ORDER BY s.sid;
當需要對一個表本身聯(lián)合查詢的時候會用到自連接。
其實在這些查詢中疤苹,我們創(chuàng)建了很多中間表互广,對中間表進行了操作。表和表之間是按照指定的條件進行拼接的,所有的連接查詢都是在Cross連接的基礎(chǔ)上過濾了一些不滿足條件的表數(shù)據(jù)惫皱。多表查詢的內(nèi)在機制是按照條件將多個表合并成一個表像樊,在一個表里查詢需需要的表記錄。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
事務的四大特性:
A:原子性:組成事務的最小單元是不可分割的旅敷,要么同時成功要么同時失敗生棍。
C:一致性:執(zhí)行事務前后,數(shù)據(jù)的完整性是一致的媳谁;(也就是案例中總錢數(shù)是一樣的)
I:隔離性:在數(shù)據(jù)庫中涂滴,各個事務之間是獨立的,不受其他事務的影響韩脑。
D:持久性:事務一旦結(jié)束氢妈,數(shù)據(jù)就會持久保存到數(shù)據(jù)庫中。
事務的隔離級別:
臟讀:一個事務讀到了另一個事務未提交的數(shù)據(jù)段多。
不可重復讀:一個事務讀到了另一個事務已經(jīng)提交的update數(shù)據(jù)
虛讀/幻讀:一個事務讀到了另一個事務已經(jīng)提交的insert數(shù)據(jù)
事務的隔離級別:
read uncommitted(未提交讀):臟讀,不可重復讀壮吩,虛讀都有可能發(fā)生
read committed(已提交讀):避免臟讀进苍。但是不可重復讀和虛讀是有可能發(fā)生
repeatable-read(可重復讀):避免臟讀和不可重復讀,但是虛讀有可能發(fā)生鸭叙。(mysql默認隔離級別)
serializable(串行化):避免臟讀觉啊,不可重復讀,虛讀沈贝。
從上到下級別越來越高杠人,但是效率越來越低。
設置事務隔離級別:SET SESSION TRANSACTION ISOLATION LEVEL
這句話非常非常重要宋下,許多人在后面用hibernate或者mybatis時候嗡善,sessionFactory為什么存在,就是因為這里事務的基本單位都是session学歧。
事務的隔離級別都是以session罩引,懂了沒。