前段時間應聘一家公司面試時對方讓我寫一個聯表查詢的語句,我居然沒有寫出來然後就沒有然後了,後來反省了一段時間,本人是搞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 表名 change 舊字段名 新字段名 新數據類型
添加字段: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歲的結果集的並集。並不是說必須要同時滿足這倆個條件而是先執行第一個查詢 再執行第二個查詢最後將倆個查詢合併!
數據庫最基本的知識就是這些,如果說這裏的內容還缺少了什麼,那就是存儲過程和觸發器了,但本人覺得在普遍使用框架的今天觸發器和存儲過程用的也比較少,想了解這方面知識的朋友可以自己另去查資料。
很高興大家可以耐着性子看完這些知識點,但僅僅掌握這些最基本的知識是不夠的 想成爲一個合格的後臺開發人員就必須懂得數據庫的高級管理、優化等技術。所以下篇我會寫一篇關於數據庫管理及優化方面的博文供大家一起參考學習!