MySQL基礎知識總結

MySQL和SQL

MySQL,一個關系型數(shù)據(jù)庫管理系統(tǒng),用來持久化保存數(shù)據(jù)。SQL,結構化查詢語言,通過SQL可以操作數(shù)據(jù)庫。
SQL語句分類:

  • DDL,數(shù)據(jù)定義語言(Data Definition Language),用來操作數(shù)據(jù)庫、操作表;
  • DML,數(shù)據(jù)操縱語言(Data Manipulation Language),用來操作表中的記錄——增、刪、改;
  • DQL,數(shù)據(jù)查詢語言(Data Query Language),用來操作表中的記錄——查;
  • DCL,數(shù)據(jù)控制語言(Data Control Language),用來對用戶權限進行設置。

SQL的數(shù)據(jù)類型

  1. 數(shù)值類型
分類 大小 范圍 格式 用途
TINYINT 1bytes (-128, 127) (0, 255) 小整數(shù)值
SMALLINT 2bytes (-32 768,32 767) (0,65 535) 大整數(shù)值
MEDIUMINT 3bytes (-8 388 608,8 388 607) (0,16 777 215) 大整數(shù)值
INT或INTEGER 4bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整數(shù)值
BIGINT 8bytes 極大整數(shù)值
FLOAT 4bytes 單精度浮點值
DOUBLE 8bytes 雙精度浮點值
DECIMAL 對DECIMAL(M,D), 若M>D,是M+2,否則為D+2 依賴于M和D的值 依賴于M和D的值 小整數(shù)值

注:
(1)float/double在db中存儲的是近似值,而decimal則是以字符串形式進行保存的;
(2)decimal(M,D)的規(guī)則和float/double相同,但float/double在不指定M、D時默認按照實際精度來處理而decimal在不指定M、D時默認為decimal(10, 0) ;
(3)BOOL或BOOLEAN類型使用0或1表示真假。

  1. 日期和時間類型
分類 大小 范圍 格式 用途
DATE 3bytes 1000-01-01/9999-12-31 YYYY-MM-DD 小整數(shù)值
TIME 3bytes '-838:59:59'/'838:59:59' HH:MM:SS 時間值或持續(xù)時間
YEAR 1bytes 1901/2155 YYYY 年份值
DATETIME 8bytes 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 4bytes 1970-01-01 00:00:00/2038。結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和時間值,時間戳
  1. 字符串類型(包含文件類型)
分類 大小 用途
CHAR 0~255bytes 定長字符串
VARVHAR 0~65535bytes 變長字符串
TINYBLOB 0~255bytes 不超過 255 個字符的二進制字符串
TINYTEXT 0~255bytes 短文本字符串
BLOB 0~255bytes 二進制形式的長文本數(shù)據(jù)
TEXT 0~65535bytes 長文本數(shù)據(jù)
MEDIUMBLOB 0~65535bytes 二進制形式的中等長度文本數(shù)據(jù)
MEDIUMTEXT 0~16777215bytes 中等長度文本數(shù)據(jù)
LONGBLOB 二進制形式的極大文本數(shù)據(jù)
LONGTEXT 極大文本數(shù)據(jù)

注:
(1)一般在數(shù)據(jù)庫里面很少存文件的內容, 一般存文件的路徑;
(2)一般不使用二進制存, 使用varchar(n)存文件的路徑

DDL——操作庫、操作表

一、用DDL操作庫

  1. 創(chuàng)建數(shù)據(jù)庫
create database 數(shù)據(jù)庫名 [character set 字符集][collate  校對規(guī)則]     
-- 注: []是可選的意思
  1. 查看所有數(shù)據(jù)庫
show databases; 
  1. 查看數(shù)據(jù)庫的定義結構
show create database 數(shù)據(jù)庫名;
  1. 刪除數(shù)據(jù)庫(危險操作)
drop database 數(shù)據(jù)庫名;
  1. 修改數(shù)據(jù)庫
alter database 數(shù)據(jù)庫名 character set 字符集;
-- 注:1.此語句修改字符集;2.是utf8,而不是utf-8
  1. 切換數(shù)據(jù)庫
use 數(shù)據(jù)庫名;   
-- 注: 在創(chuàng)建表之前一定要用此句指定數(shù)據(jù)庫

二、用DDL操作表

  1. 創(chuàng)建表
create table 表名(
    列名 類型[(寬度)] [約束] [約束條件] [comment '字段說明'],
    列名 類型[(寬度)] [約束] [comment '字段說明'],
    ...
    列名 類型[(寬度)] [約束] [comment '字段說明']
);
-- 注:列叫字段;行叫記錄

注:
約束,即規(guī)則、限制,作用是保證用戶插入的數(shù)據(jù)保存到數(shù)據(jù)庫中是復合規(guī)范的。主鍵約束關鍵字:primary key;唯一約束關鍵字:unique;非空約束關鍵字:not null
約束注意事項:

  • not null: 非空 ; eg: username varchar(40) not null username這個列不能有null值
  • unique:唯一約束, 后面的數(shù)據(jù)不能和前面重復; eg: cardNo char(18) unique; cardNo 列里面不可以有重復數(shù)據(jù)
  • primary key;主鍵約束(非空+唯一); 一般用在表的id列上面. 一張表基本上都有id列的, id列作為唯一標識的
  • id int primary key auto_increment; id不需要我們自己維護了, 插入數(shù)據(jù)的時候直接插入null, 自動的增長進行填充進去, 避免重復了. auto_increment: 自動增長,必須是設置了primary key之后,才可以使用auto_increment
  • 先設置了primary key 才能設置auto_increment
  • 只有當設置了auto_increment 才可以插入null 自己維護 否則插入null會報錯
  1. 查看表
show tables;--查看所有的表
desc 表名;--查看表的定義結構
  1. 修改表
-- 修改表
-- 語法: alter table 表名 add 列名 類型 [約束];    增加列
-- 需求:為學生表增加一個成績列
alter table student add score double;

-- 語法: alter table 表名 modify 列名 新類型 新約束;    修改列的類型約束
-- 需求: 修改name的類型和約束
alter table student modify name varchar(40) not null;

-- 語法: alter table 表名 change 舊列名 新列名 類型 約束; 修改列的名稱,類型,約束
-- 需求: 修改sex列名為gender
alter table student change sex gender  varchar(13) not null;

--  語法: alter table 表名 drop 列名;   刪除列
-- 需求: 刪除score
alter table student drop score; 

--  語法: rename table 舊表名 to 新表名; 修改表名
rename table student to stu;
  1. 刪除表
-- 刪除表
-- drop table 表名;
-- 需求: 刪除stu表
drop table stu;

DML——操作表記錄——增刪改

-- 創(chuàng)建一張商品表(商品id,商品名稱,商品價格,商品數(shù)量)
create table product(
    id int primary key auto_increment,
    pname varchar(100),
    price double,
    num int
)
  1. 插入指定列
insert into 表(列,列..) values(值,值..);
--eg:
insert into product(pname,price) values('Mac',18888);
  1. 插入所有列
insert into 表 values(值,值....);      
-- eg:
insert into product values(null,'蘋果電腦',18000.0,10);
insert into product values(null,'華為5G手機',30000,20);
insert into product values(null,'小米手機',1800,30);
insert into product values(null,'iPhonex',8000,10);
insert into product values(null,'蘋果電腦',8000,100);
insert into product values(null,'iPhone7',6000,200);
insert into product values(null,'iPhone6s',4000,1000);
insert into product values(null,'iPhone6',3500,100);
insert into product values(null,'iPhone5s',3000,100);

insert into product values(null,'方便面',4.5,1000);
insert into product values(null,'咖啡',11,200); 
insert into product values(null,'礦泉水',3,500);
  1. 更新記錄
update 表名 set 列 =值, 列 =值 [where 條件]
-- 更新記錄
-- 語法: update 表名 set 列 =值, 列 =值 [where 條件]
-- 需求:修改商品所有的價格為5000
update product set price = 5000;

-- 需求: 修改id為2的商品數(shù)量和價格
update product set price = 8000,num = 20 where id = 2;

-- 將商品名是Mac的價格修改為18000元
update product set price = 18000 where pname = 'Mac'

-- 將商品名是Mac的價格修改為17000,數(shù)量修改為5
update product set price = 17000,num = 5 where pname = 'Mac'

-- 將商品名是方便面的商品的價格在原有基礎上增加2元
update product set price = price + 2 where pname = '方便面'
  1. 刪除記錄

方式一:delete

delete from 表 [where 條件] 

方式二:truncate

truncate table 表;
--eg:
-- 刪除記錄
-- 語法一: delete from 表名 [where 條件]  
-- 刪除表中名稱為’Mac’的記錄
delete from product where pname = 'Mac'

-- 刪除價格小于5001的商品記錄
delete from product where price < 5001

-- 刪除表中的所有記錄
delete from product

-- 語法二: truncate table 表名;
truncate table product

delete 和truncate區(qū)別

  • DELETE 刪除表中的數(shù)據(jù),表結構還在; 刪除后的數(shù)據(jù)可以找回,一條一條的刪除。
  • TRUNCATE 刪除是把表直接DROP掉,然后再創(chuàng)建一個同樣的新表。刪除的數(shù)據(jù)不能找回。執(zhí)行速度比DELETE快。

物理刪除與邏輯刪除

  • 物理刪除: 真正的刪除了, 數(shù)據(jù)不在, 使用delete就屬于物理刪除
  • 邏輯刪除: 沒有真正的刪除, 數(shù)據(jù)還在. 搞一個標記, 其實邏輯刪除是更新 eg: state 1 啟用 0禁用

DQL——操作表記錄——查詢

  1. 簡單查詢
select  [*] [列名 ,列名] [列名 as 別名 ...] [distinct 字段] from 表名 [where 條件] 
--eg:
-- 基本查詢語法:      select [*][列名,列名][distinct 列名] from 表名 [where 條件]
-- 查詢所有的列語法 : select * from 表名 
-- 需求: 查詢product表中的所有數(shù)據(jù)
select * from product;

-- 查詢某張表特定列 : select 列名,類名,... from 表名 
-- 需求: 查詢product表中的pname,price字段的值
select pname,price from product

-- 去重查詢 : select distinct 列名 from 表名
-- 需求: 查詢price字段,去重   單個字段去重
select distinct price from product
-- 需求: 查詢pname,price字段,同時去重   多個字段去重
select distinct pname,price from product
-- 注意: distinct前面不能有字段名
select id,distinct price from product -- 報錯

-- 別名查詢
-- 對字段取別名:  select 字段 as 別名,字段 as 別名,... from 表名    
-- 注意: as可以省略  一般都會省略
select pname as 商品名稱,num as 商品數(shù)量 from product
select pname  商品名稱,num  商品數(shù)量 from product

-- 對表取別名:select 表1別名.字段名,... from 表1 as 表1別名
-- 注意: as可以省略  一般都會省略
select p.pname,p.num from product as p;
select p.pname,p.num from product  p;

-- 運算查詢(+,-,*,/等)   null和其他數(shù)據(jù)進行運算得到是null
-- 需求: 計算每個商品的總價(單價*數(shù)量)
select price ,num from product
select price * num from product
select price * num 總價 from product
select price * ifnull(num,0) 總價 from product
  1. 條件查詢
select ... from 表 where 條件 
--取出表中的每條數(shù)據(jù),滿足條件的記錄就返回,不滿足條件的記錄不返回

(1)between...and... 區(qū)間查詢

eg: where price between  1000 and 3000  相當于 1000<=price<=3000 

(2)in(值,值..)

-- 查詢id為1,3,5,7的
select * from t_product where id = 1
select * from t_product where id = 3
select * from t_product where id = 5
select * from t_product where id = 7

select * from t_product where id in(1,3,5,7)

(3)like 模糊查詢 一般和_或者%一起使用

  • _ 占一位
  • % 占0或者n位
name like '張%'  --查詢姓張的用戶, 名字的字數(shù)沒有限制
name like '張_'  --查詢姓張的用戶 并且名字是兩個字的

(4)and 多條件同時滿足

where 條件1 and 條件2 and 條件3

(5)or 任意條件滿足

where 條件1 or 條件2 or 條件3
  1. 排序查詢
order by 列 asc/desc, 列 asc/desc;
asc: 升序【默認值】   order by 列;
desc: 降序

(1)單列排序

SELECT 字段名 FROM 表名 
[WHERE 條件] 
ORDER BY 字段名 [ASC|DESC];  --ASC: 升序,默認值; DESC: 降序
--eg:練習: 以分數(shù)降序查詢所有的學生
select * from student order by score desc;

(2)組合排序

SELECT 字段名 FROM 表名 
WHERE 字段=值 
ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
--eg:以分數(shù)降序查詢所有的學生, 如果分數(shù)一致,再以age降序
select * from student order by score desc ,age desc;
  1. 分組查詢
    分組的目的就是為了統(tǒng)計,一般分組會跟聚合函數(shù)一起使用。單獨分組,沒有意義, 返回每一組的第一條記錄.
where 條件 group by 列 [having 條件]

(1)只分組

SELECT 字段1,字段2... FROM 表名  [where 條件] GROUP BY 列 [HAVING 條件];
--eg 根據(jù)性別分組, 統(tǒng)計每一組學生的總人數(shù)
SELECT sex, count(*) FROM student GROUP BY sex

(2)分組后篩選——having

--eg:練習根據(jù)性別分組, 統(tǒng)計每一組學生的總人數(shù)> 5的(分組后篩選)
SELECT sex, count(*) FROM student GROUP BY sex HAVING count(*) > 5
-- 練習復雜: 統(tǒng)計sid為8之前的的, 根據(jù)性別分組, 每一組學生的總人數(shù) > 2的(分組后篩選)
select sex,count(*) from student where sid < 8 group by sex having count(*) > 2

where和having的區(qū)別
where 子句1) 對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數(shù)據(jù),即先過濾再分組。2) where后面不可以使用聚合函數(shù)
having字句1) having 子句的作用是篩選滿足條件的組,即在分組之后過濾數(shù)據(jù),即先分組再過濾。2) having后面可以使用聚合函數(shù)

  1. 分頁查詢
    LIMIT a,b;
    a:起始行數(shù),從0開始計數(shù),如果省略,默認就是0; a=(當前頁碼-1)*b;
    b: 返回的行數(shù)
select ... from .... limit a ,b.
-- eg: 分頁查詢學生, 每一頁查詢4條  b=4;   a=(當前頁碼-1)*b;
-- 需求: 分頁查詢學生, 每一頁查詢4條  
select * from student limit 0,4;  -- 第1頁
select * from student limit 4,4;  -- 第2頁
select * from student limit 8,4;  -- 第3頁
-- 【a=(當前頁碼-1)*b,b】
  1. 查詢語法總結
select...from...
select...from...where...
select...from...where...order by...
select...from...where...group by...
select...from...where...limit a,b

select...from...where...group by...having....order by...limit
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容

  • 一、事務 四大特性(ACID) 原子性根據(jù)定義,原子性是指一個事務是一個不可分割的工作單位,其中的操作要么都做,要...
    魔仙堡的安公子閱讀 233評論 0 0
  • 一.linux基本環(huán)境設置 1.ifconfig 系統(tǒng)管理型命令,查看系統(tǒng)的網(wǎng)絡基本信息 2、虛擬機的網(wǎng)絡連接方式...
    蝸牛325閱讀 654評論 0 1
  • 昨晚小組討論學習get到兩個新知識,一個是靜姐提出的“正交測試法”,一個是月萍提到的視圖,因為對這兩個概念不太熟...
    洞簫茗悅閱讀 437評論 2 5
  • MySQL 數(shù)據(jù)庫 什么是數(shù)據(jù)庫?英文名:DataBase (DB)用于存儲和管理數(shù)據(jù)的倉庫。 數(shù)據(jù)庫的特點持久...
    北洋同學閱讀 375評論 0 1
  • 表情是什么,我認為表情就是表現(xiàn)出來的情緒。表情可以傳達很多信息。高興了當然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,631評論 2 7