MySQL語法及基礎知識大全
前段時間應聘一家公司面試時對方讓我寫一個聯表查詢的語句,我居然沒有寫出來然後就沒有然後了,後來反省了一段時間,本人是搞Java後臺開發的如果資料庫的基本語法都不熟練的話那基本GG,所以之後花了一週時間梳理了一下MySQL的基本知識記錄下來與大家一同分享。
使用CMD操作資料庫的流程如下:
登入MySQL:進入CMD之後,輸入mysql -u root -p 之後按提示輸入密碼
show databases; 顯示所有的資料庫
use databasename; 選擇使用哪個資料庫
show talbes; 檢視該資料庫中有哪幾張表
一、資料庫操作
檢視當前資料庫:show databases;
建立資料庫:create database database_name;
檢視建立好的資料庫的定義:show create database database_name;
刪除資料庫:drop database database_name;
檢視所支援的儲存引擎:show engines
檢視事務:select @@tx_isolation;
修改當前事務:set tx_isolation='repeatable-read';
set session transaction isolation level repeatable read;
二、建立表
主鍵約束:primary key。主鍵可分為單主鍵和多欄位聯合主鍵
外來鍵約束:foreign key
Constraint 外來鍵名稱 foreign key(表中外來鍵名) references關聯表名(關聯屬性);
非空約束:not null
唯一性約束:unique
預設約束:default (所預設的值)
屬性值自動新增:auto-increment
查看錶的結構:describe 表名 或 desc 表名
查看錶的詳細結構:show create table 表名
三、修改表
修改表名:alter table 舊錶名 rename 新表名
修改欄位的資料型別:alter table 表名 modify 欄位名 新型別
修改欄位名:alter table 表名
新增欄位:alter table 表名 add 新欄位 資料型別(first)|(after已存在的欄位名)最後倆個屬性可以調整新插入的欄位的位置 first表示將此欄位插入到表頭,after表示將此欄位插入到某行之後。
刪除欄位:alter table 表名 drop 欄位名
修改欄位的排列位置:alter table 表名 modify 欄位 資料型別first|after欄位2
修改表的儲存引擎:alter table 表名 engine=myisam(MySQL支援的資料庫引擎有:myisam、InnoDB、memory、archive、BDB等)
修改表的編碼方式:alter table 表名 default character set utf8;(該命令將表的預設編碼方式改為utf8)
修改欄位的編碼方式:alter table 表名 change 欄位名 欄位名 資料型別character set utf8 ;(該語法類似於修改欄位名的語法,只是在後面新增character set!所以也可以用於修改欄位名)
加主鍵約束:alter table tablename add constraint 主鍵名 primary key(id)
加外來鍵約束:alter talbe tablename add constraint 外來鍵名 foreign key(本表中要關聯的列) references 外來鍵表名(外來鍵列);
刪除表的外來鍵約束:alter table 表名 drop foreign key 外來鍵約束名
刪除未被關聯的表:drop table if exists 表名;
要刪除被外來鍵關聯的主表先刪除關聯外來鍵再刪除主表即可!
四、MySQL資料型別
MySQL支援多種資料型別,主要有數值型別、日期/時間型別和字串型別。
數值型別包括:整數型別tinyint、smallint、mediumint、int、bigint、浮點小數資料型別float、double、定點小數型別decimal。
日期/時間型別:包括year、time、date、datetime和timestamp。
字串型別:包括char、varchar、binary、varbinay、blob、text、enum和set等。
整數型別:
型別名稱 |
說明 |
儲存需求 |
tinyint |
很小的整數 |
1個位元組 |
smallint |
小的整數 |
2個位元組 |
mediumint |
中等大小的整數 |
3個位元組 |
Int(INTEGER) |
普通大小的整數 |
4個位元組 |
bigint |
大整數 |
8個位元組 |
浮點及定點數型別
型別名稱 |
說明 |
儲存需求 |
float |
單精度浮點數 |
4個位元組 |
double |
雙精度浮點數 |
8個位元組 |
Decimal(M,D) , dec |
壓縮的“嚴格”定點數 |
M+2個位元組 |
日期與時間型別
型別名稱 |
日期格式 |
日期範圍 |
儲存需求 |
year |
YYYY |
1901-2155 |
1個位元組 |
time |
HH:MM:SS |
-838:59:59~838:59:59 |
3個位元組 |
date |
YYYY-MM-DD |
1000-01-01~9999-12-3 |
3個位元組 |
datetime |
YYYY-MM-DD HH:MM:SS |
1000-01-01 00:00:00 ~9999-12-31 23:59:59 |
8個位元組 |
timestamp |
YYYY-MM-DD HH:MM:SS |
1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 utc |
4個位元組 |
字串型別
型別 |
說明 |
儲存要求 |
Char(m) |
固定長度非二進位制字串 |
M位元組 1<=m<=255 |
Varchar(m) |
變長非二進位制字串 |
L+1位元組 在此L<=M和1<=M<=255 |
tinytext |
非常小的非二進位制字串 |
L+1位元組 在此L<2^8 |
text |
小的非二進位制字串 |
L+2位元組 在此L<2^16 |
mediumtext |
中等大小的非二進位制字串 |
L+3位元組 在此L<2^24 |
longtext |
大的非二進位制字串 |
L+4位元組 在此L<2^32 |
enum |
列舉型別 只能有一個列舉字串值 |
1或2個位元組,取決於列舉值得數目(最大值65535) |
set |
字串物件 可以有零個或多個set成員 |
1、2、3、4或8個位元組,取決於集合成員的數目(最多64個成員) |
二進位制型別
二進位制型別可以用來存放圖片、音訊資訊等
型別 |
說明 |
儲存要求 |
Bit(m) |
位欄位型別 |
大約(M+7)/8個位元組 |
Binary(m) |
固定長度二進位制字串 |
M個位元組 |
Varbinary(m) |
可變長度二進位制 |
M+1個位元組 |
Tinyblob(m) |
非常小的blob |
L+1位元組 在此L<2^8 |
Blob(m) |
小blob |
L+2位元組 在此L<2^16 |
Mediumblob(m) |
中等大小的blob |
L+3位元組 在此L<2^24 |
Longblob(m) |
非常大的blob |
L+4位元組 在此L<2^32 |
五、索引
含義及特點
索引是一個單獨的、儲存在磁碟上的資料庫結構,包含對資料表裡所有記錄的引用指標。使用索引可以快速找出在某個或多個列中有一特定值的行(索引可對某行進行排序),MYSQL所有的列型別都可以被索引,對相關列使用索引是提高查詢操作速度的最佳途徑。
索引的優點:
1、通過建立唯一索引,可以保證資料庫表中每一行資料的唯一性
2、可以大大加快資料的查詢速度,這也是建立索引最主要的原因
3、在實現資料的參照完整性方面,可以加速表和表之間的連線。
4、在使用分組和排序子句進行資料查詢時,也可以顯著減少查詢中分組和排序的時間。
不利的方面:
1、建立和維護索引要耗費時間,並且隨著資料量的增加所耗費的時間也會增加
2、除了資料表要佔資料空間之外,每一個索引還要佔用一定的物理空間,增加了物理開銷
3、當對錶中資料進行增,刪,改時,索引也要動態地維護,這樣就降低了資料的維護速度。
索引的分類:普通索引(允許重複值和空值)、唯一索引(索引值唯一)、單列索引(索引中只包含一列)、組合索引(多個欄位組合而成)、全文索引(支援值的全文查詢)、空間索引(對空間資料型別的欄位建立的索引)。
索引的設計原則:
1、索引並非越多越好
2、避免對經常更新的表進行過多的索引,並且索引的列應儘可能的少
3、資料量小最好不要使用索引
4、在條件表示式中經常會用到的不同值較多的列上建立索引。
5、當唯一性是某個資料本身的特徵時,指定唯一索引。
6、在頻繁進行排序或分組的列上建立索引。
建立索引
1、在建表時建立索引
(1)建立普通索引:最基本的索引型別,沒有唯一性之類的限制,其作用只是加快對資料的訪問速度
Create table book
(
bookid int not null,
bookname char(50) not null,
year_publication year not null,
Index(year_publication)
); 使用show index from book \g 可以檢視該表的所有索引
使用 show create table book \g; 也可以檢視索引
使用explain select * from book where year_publication=1990 \g檢視是否使用索引
(2)建立唯一索引:唯一索引與前面普通索引類似但唯一索引值必須唯一,可以有空值。
使用unique關鍵字來建立唯一索引
Create table t1
(
id int not null,
Name char(20) not null,
Unique Index indexname(id)
); 同樣可以使用上述倆個語句來測試該索引
(3)建立單列索引:在資料庫表中的一個欄位建立的索引
Create table t2
(
id int not null,
name char(50) not null,
Index indexname(name(20))
建立了一個長度為20的索引
);
(4)建立組合索引:在多個欄位上建立索引
Create table t3
(
id int not null,
name char(20) not null,
Age int not null,
Index indexname(id,name,age(100))
);
(5)建立全文索引:fulltext全文索引可用於全文搜尋,但只有MYISAM儲存引擎支援fulltext索引,並且只能在資料型別為:char、varchar、text的列上建立全文索引。
Create table t4
(
Id int not null,
name char(30) not null,
age int not null,
Info varchar(255),
Fulltext index indexname(info)
) engine=muisam;
(6)建立空間索引:該索引必須在MYISAM型別的表中建立 應建立在空間型別上(geometry,point,linestring,polygon),且空間型別的欄位不能為空
Create table t5
(
g geometry not null,
Spatial index indexname(g)
)engine=MYISAM;
2、在已有的表中建立索引
在已有的表中建立索引,可以使用alter table或者create index語句
已第一次建立的book表為例:
Alter table book add index indexname(bookname(30));
Create index indexname on book(bookname);
這裡已建立普通索引為例,建立其他型別的索引及檢視索引資訊語句已在上面講的很清楚了就不在贅述。
3、刪除索引
在MySQL中刪除索引有倆種方式:alter table或者drop index語句。
(1)、alter table tablename drop index indexname;
(2)、drop index indexname on tablename;
六、檢視
定義:檢視是一張虛擬的表,是從資料庫中的一張或多張表中匯出來。它可以實現當你只需要某幾張表中的幾個屬性資訊時,便可以使用檢視對該幾列的資訊進行提取。其中的資料與資料表中的資料一一對應,對通過檢視看到的資料進行修改時,相應的基本表的資料也要發生改變,同時,若基本表資料發生改變則這種變化可以自動反應到檢視中。
建立倆張表為例:
create table student
(
id int(8) not null primary key,
name char(10) not null,
gender char(1),
age int(3)
);
create table score
(
id int(8) not null primary key,
subjectid int(3) not null,
studentid int(8) not null,
score int(3) not null,
constraint fk_id foreign key(studentid) references student(id)
);
建立檢視(建立一個學生成績對應科目的檢視)
create view stu_glass (subjectid,studentid,score) as select score.subjectid,student.id,score.score from score,student where score.studentid=student.id;
修改檢視
alter view stu_glass as select studentid,score from score;
更新檢視
update stu_glass set score = 100;
刪除檢視
drop view if exists stu_glass;
七、基本的增刪改查
以學生成績表為例插入資料
指定插入值:insert into student (id,name,gender,age) value (1,”jack”,”B”,23),(2,”rose”,”g”,20);
不指定插入值,則插入值應與建表時的屬性順序相同:
insert into student value (3,”tom”,”G”,19);
更新資料:update student set aeg=15,name=”wq” where id=1;
刪除資料:delete from student where id=2;
八、MySQL函式
Mysql提供了豐富的函式,在進行資料庫管理以及資料的查詢和操作時將會經常用到這些函式。MySQL中的函式從功能方面主要分為數學函式、字串函式、日期和時間函式、條件判斷函式、系統資訊函式和加密函式。若是對這方面有興趣的可以自己去查閱相關資料這裡就不再贅述。
九、查詢語句(重點)
select語句的基本格式如下:
select
* 或 <欄位列表>
from 表
where 表示式
group by(分組,按照指定的欄位分組)
Having()
order by(排序,asc升序、desc降序)
limit (分組查詢)
還是以學生、成績表為例。資料自己插入
create table student
(
id int(8) not null primary key,
name char(10) not null,
gender char(1),
age int(3)
);
create table score
(
id int(8) not null primary key,
subjectid int(3) not null,
studentid int(8) not null,
score int(3) not null,
constraint fk_id foreign key(studentid) references student(id)
);
簡單的不多說,直接上乾貨!
(1)帶in關鍵字的查詢:
In操作符用來查詢滿足指定範圍的記錄,使用in操作符時,將所有檢索條件用括號括起來,檢索條件之間用逗號分隔,只要滿足條件範圍內的一個值即為匹配值。
Select * from score where score in (85,95) ;
查詢成績為85和95的記錄
Select * from score where score not in (85,95) ;
查詢成績不為85和95的記錄
(2)帶between and的範圍查詢
Between and 用來查詢某個範圍內的值,該操作符需要倆個引數,即範圍開始值和結束值。如果欄位值滿足指定的範圍查詢條件,則這些記錄被返回。
Select * from score where score between 80 and 95;
查詢成績在80和95之間的記錄
(3)帶like的字元匹配查詢
字元匹配查詢like一般與“%”、“_”一起使用,代表該字元中存在某個字元。
百分號萬用字元:百分號萬用字元可以匹配任意長度的字元,甚至包括空字元
查詢以j開頭的學生的記錄:
Select * from student where name like ‘j%’;
查詢名字中帶b字母的學生記錄:
Select * from student where name like ‘%b%’;
下劃線萬用字元_
下劃線萬用字元_一次只能匹配任意一個字元。
查詢以r開頭並且後面只有三個字元的名字的學生資訊
Select * from student where name like ‘r___’;
(4)查詢結果不重複(distinct)
Select distinct 欄位名 from表名
(5)對查詢結果排序(order by)
預設的或ASC為升序排列,desc為降序排列
Select * from score order by studentid desc ,score ;
即先按學生ID降序排列,若學生ID中有相同的值按升序排序。
(6)使用limit限制查詢結果的數量
語法為:
Limit [位置偏移量,]行數
位置偏移量表示從第一行開始顯示,是一個可選引數,若沒有則表示從第一行(0)開始,行數表示要顯示幾行。
如:select * from student limit 4,3;
表示返回從第五條記錄開始以後的3條記錄。
(7)分組查詢group by
分組查詢是對資料按照某個或多個欄位進行分組
語法為:[group by 欄位] [having <條件表示式> ]
“欄位”為進行分組時所依據的列名稱; having<條件表示式>指定滿足表示式限定條件的結果將被顯示。分組查詢一般與集合函式、having一起使用。
集合函式:
Count() 返回某列的行數
Sum() 返回某列值的和
Avg() 返回某列的平均值
Max() 返回某列的最大值
Min() 返回某列的最小值
Count()函式
Count(*)計算表中總的行數,不管某列有數值或者為空值。
Count(欄位名)計算指定列下總的行數,計算時將忽略空值的行。
如:select subjectid , count(*) as total from score where score>60 and studentid in (select id from student where age>18 and gender=’B’) group by subjectid having count(*) > 10;
查詢所有科目中年齡大於18歲且數量多於10的及格男生人數。
Sum()函式
Sum()是一個求和函式,返回指定列值的總和
Select subjectid , sum(score) as sum from score group by subjectid;
查詢每門科目的成績之和
Avg()函式
Avg()函式通過計算返回的行數和每一行資料的和,求得指定列資料的平均值。
Select subjectid ,avg(score) as avg from score group by subjectid;
查詢每門科目的平均值
Max()函式
Max()返回指定列的最大值
Select subjectid , max(score) as maxscore from score group by subjectid;
查詢每門科目的最高成績
Min()函式
Min()返回指定列的最小值
Select subjectid , min(score) as minscore from score group by subjectid;
(8)連線查詢
內連線查詢(inner join)是使用比較運算子進行表間某些列資料的比較操作,並列出這些表中與連線條件相匹配的資料行,組合成新的記錄。
Select student.id, subjectid ,name ,score from score inner join student on student.id=score.studentid;
外連線查詢(分為左連線和右連線):查詢在倆張表中都存在的資料使用內連線查詢,當資料在一張表中存在另一張表中不存在時就得使用外連線查詢。
如: select score.name,score.subjectid,score.score from student left outer join score where student.id = score.studentid;
此為查詢所有學生的各科目的成績,有些學生的某門科目的成績可能為null,因為其未參加考試。
(9)子查詢
子查詢是指一個查詢語句巢狀在另一個查詢語句內部的查詢,子查詢中常用的操作符有any(some)、all、in、exists.
帶any some關鍵字的子查詢:
關鍵字any和some是同義詞,只要滿足其中任一條件就可以返回查詢結果。
Select studentid ,score from score where subjectid=1 and score > any (select score from score where subjectid=2);
查詢科目一中成績大於科目二中任一成績的學生ID,及成績。
帶all關鍵字的子查詢:
Select studentid ,score from score where subjectid=1 and score > all (select score from score where subjectid=2);
查詢科目一中成績大於所有科目二中學生成績的資訊。
帶exists關鍵字的子查詢:
Exists關鍵字後面的引數是一個任意的子查詢,系統對子查詢進行運算以判斷它是否返回行,如果至少返回一行,那麼exists的結果為TRUE,此時外層將進行查詢;如果子查詢沒有返回任何一行,那麼exists返回的結果是FALSE,此時外層語句將不再進行查詢。注意內層和外層語句沒有直接關係,只是內層如果返回了TRUE外層就執行,否則不執行。
如:select * from score where exists ( select name from student where age>20);
如果有學生年齡大於20就查詢成績表中所有的資訊。
帶in關鍵字的子查詢:
用in關鍵字進行子查詢時,內層查詢語句只返回一個數據列,這個資料列裡的值將提供給外層查詢語句進行比較操作。
如:select * from student where id in (select studentid from score where subjectid=1 and score>90);
查詢在科目一中考試成績在90分以上的學生資訊。
帶比較運算子的子查詢與in關鍵字的類似即把in換為”<” , “<=” , “=” , “>=” , “!=”等以實現不同的功能。
合併查詢結果:
利用union關鍵字可以給出多條select語句,並將它們的結果組合成一個結果集。合併時倆個表對應的列數和資料型別必須相同。只使用union執行時會刪除重複的記錄,使用關鍵字all之後不刪除重複行也不對結果進行自動排序
基本語法為:
Select column , ... From table1
Union [all]
Select column,...from table2
如:select * from student where gender=”B”
Union all
Select * from student where age>19;
查詢性別為男 和 年齡大於19歲的結果集的並集。並不是說必須要同時滿足這倆個條件而是先執行第一個查詢 再執行第二個查詢最後將倆個查詢合併!
資料庫最基本的知識就是這些,如果說這裡的內容還缺少了什麼,那就是儲存過程和觸發器了,但本人覺得在普遍使用框架的今天觸發器和儲存過程用的也比較少,想了解這方面知識的朋友可以自己另去查資料。
很高興大家可以耐著性子看完這些知識點,但僅僅掌握這些最基本的知識是不夠的 想成為一個合格的後臺開發人員就必須懂得資料庫的高階管理、優化等技術。所以下篇我會寫一篇關於資料庫管理及優化方面的博文供大家一起參考學習!