5.MySQL學習筆記

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ù)表中檢索信息瓜挽。語句的一般格式是:

圖1.全查詢語句和結(jié)果示意圖

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若皱。


圖2.學生表、課程表尘颓、成績表

現(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;


圖3.利用內(nèi)聯(lián)查詢參加考試學生成績的情況

現(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;

圖4.查詢每個學生的成績走触,包括無成績的學生情況

當需要對一個表本身聯(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罩引,懂了沒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枝笨,一起剝皮案震驚了整個濱河市袁铐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌横浑,老刑警劉巖剔桨,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異徙融,居然都是意外死亡洒缀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門张咳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帝洪,“玉大人似舵,你說我怎么就攤上這事〈邢浚” “怎么了砚哗?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砰奕。 經(jīng)常有香客問我蛛芥,道長,這世上最難降的妖魔是什么军援? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任仅淑,我火速辦了婚禮,結(jié)果婚禮上胸哥,老公的妹妹穿的比我還像新娘涯竟。我一直安慰自己汰聋,他們只是感情好丹弱,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著榄棵,像睡著了一般嘲更。 火紅的嫁衣襯著肌膚如雪筐钟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天赋朦,我揣著相機與錄音篓冲,去河邊找鬼。 笑死宠哄,一個胖子當著我的面吹牛壹将,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琳拨,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼瞭恰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狱庇?” 一聲冷哼從身側(cè)響起惊畏,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎密任,沒想到半個月后颜启,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡浪讳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年缰盏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡口猜,死狀恐怖负溪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情济炎,我是刑警寧澤川抡,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站须尚,受9級特大地震影響崖堤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耐床,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一密幔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撩轰,春花似錦胯甩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溉苛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弄诲,已是汗流浹背愚战。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留齐遵,地道東北人寂玲。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像梗摇,于是被迫代替她去往敵國和親拓哟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350