MySQL基礎

MySQL

[TOC]


注釋

  • 單行注釋: --
  • 多行注釋 :/* */

SQL分類

  • DDL :Data Definition Language 數據定義語言:create拌滋、drop虱咧、alert等
  • DML:Data Manipulation language 數據操作語言: insert拭抬、update苍狰、delete等
  • DQL:Data Query Language 數據查詢語言:select叽粹、where等
  • DCL:Data Control Language 數據控制語言(定義數據庫訪問權限和安全級別以及創(chuàng)建用戶):GRANT蛆楞、REVOKE等

操作數據:CRUD

  1. C(Create):創(chuàng)建

  2. R(Retrieve):查詢

  3. U(Update):修改

  4. D(Delete):刪除

    /*-----------------------數據庫操作----------------------*/
    /*創(chuàng)建數據庫*/
    create database 數據庫名稱;
    /*創(chuàng)建數據庫也物,如果不存在的話*/
    create database if is not exists 數據庫名稱;
    /*創(chuàng)建數據庫 并設置字符集*/
    create database 數據庫名稱 character set GBK;
    
    /*查詢所有數據庫的名稱*/
    show databases;
    /*查詢創(chuàng)建數據庫的語法*/
    show create database mysql;
    /*查詢某個數據庫的字符集*/
    show create database 數據庫名稱;
    
    /*修改數據庫的字符集*/
    alter database 數據庫名稱 character set 字符集;
    
    /*刪除數據庫*/
    drop database 數據庫名稱;
    drop database 數據庫名稱 if exists;
    
    /*查詢當前正在使用的數據庫*/
    seletct database();
    /*使用數據庫*/
    use 數據庫名稱
    
    /*-----------------------表操作----------------------*/
    /*創(chuàng)建表*/
    create table 表名(列名1 數據類型,列名2 數據類型... );
    /*查詢數據庫中所有表的名稱*/
    show tables;
    /*查詢表結構*/
    desc 表名;
    /*復制表*/
    create table 表名 like 被復制的表;
    
    /*修改表名*/
    alter table 表名 rename to 新的表名;
    /*修改表的字符集*/
    alter table 表名 character set 字符集;
    /*添加一列*/
    alter table 表名 add 列名 數據類型;
    /*修改列名稱 類型*/
    alter table 表名 change  列名 新列名;
    alter table 表名 modify  列名 新數據類型;
    alter table 表名 change  列名 新列名 新數據類型;
    /*刪除列*/
    alter table 表名 drop 列名;
    
    /*刪除表*/
    drop table 表名 if exists;
    
    
    

MySql支持的數據類型

基本增刪改查


/*-----------------------表中數據操作----------------------*/
/*添加 如不定義列名,則默認給所有列添加值*/
insert into 表名 (列名1,列名2....) values (值1,值2,...)

/*刪除 如無條件叛赚,則刪除全部*/
delete from 表名 where [where條件]
/*刪除表澡绩,再創(chuàng)建一個一樣的新表 */
truncate table 表名

/*修改數據*/
update 表名 set 列名1=值1,列名2=值2.... [where條件]

/*查詢排序 升序(默認):asc  降序 desc*/
select * from 表名 order by 列名 排序方式

查詢:

  1. 排序

    • 升序(默認):asc

    • 降序:desc

      select * from 表名 order by 列名1 排序方式1,列名2 排序方式2 ... [where條件]
      
  2. 聚合函數

    • count :個數

    • max:最大值

    • min:最小值

    • sum:和

    • avg:平均值

      select count(*) from 表名 --查詢條數,只要有一個值不為空就算一跳記錄
      select count(列名) from 表名  --會排除null值
      select count(列名 ifnull(列名,默認值)) from 表名 --不排除null值俺附,設置null時的默認值
      
  3. 分組 group by

    group by 分組字段

    having 分組后的限定條件

    select * from 表名 [where 條件] group by 分組條件 having [having 限定條件]; 
    

    where 和 having 的區(qū)別 :

    1. [where 條件] 分組前限定肥卡,并不可用聚合函數判斷

    2. [having 限定條件] 分組后限定,可與聚合函數一起判斷

      例: 查詢學生表中事镣,男女生數學成績的平局值步鉴,要求:參與分組分數不得小于70人,且人數不少于2人

      select sex,avg(math),count(id)  from student where math>70 group by sex having count(id)>2;
      
  4. 分頁 limit

    limit 開始的索引蛮浑,每頁的條數

    // 每頁3條數據唠叛,查詢第一頁的數據
    select * from student limit 0,3
    
  5. 去重distinct

    //id去重
    select distinct id from student 
    //多個字段去重,只有多個字段完全一樣才會被去重
    
  6. 模糊查詢

    select * from student where name like "a%";
    //第二個字是a的
    select * from student where name like "_a%";
    //名字是三個字的
    select * from student where name like "___";
    //名字包含a的
    select * from student where name like "%a%";
    
  7. 其他基礎

    >沮稚、<艺沼、>=、<=蕴掏、=

    between..and

    in 集合

    like

    is null

    and 或者 &&

    or 或者 ||

    not 或者 !

約束

例子:

CREATE TABLE stu(
    id INT PRIMARY KEY AUTO_INCREMENT,   --主鍵
    name VARCHAR(20) NOT NULL,   --非空
    phone VARCHAR(20) UNIQUE --唯一
    );
  1. 主鍵:primary key (非空且唯一苍姜,一張表只能有一個字段為主鍵)

    -- 添加主鍵
    ALTER TABLE stu MODIFY id INT PRIMARY KEY;
    -- 主鍵 無法用一下語句刪除
    ALTER TABLE stu MODIFY id INT;
    -- 主鍵刪除
    ALTER TABLE stu DROP PRIMARY KEY;
    -- 刪除主鍵自增長
    ALTER TABLE stu MODIFY id INT;
    
  1. 非空約束:not null (字段不能為空)

    -- 添加非空約束
    ALTER TABLE stu MODIFY name VARCHAR(20) NOT NULL; 
    -- 刪除非空約束
    ALTER TABLE stu MODIFY name VARCHAR(20) ;
    
  1. 唯一約束:unique (字段值唯一,注意MySQL中 null可有多個)

    ALTER TABLE stu MODIFY phone VARCHAR(20) UNIQUE;
    -- 唯一約束 無法用一下語句刪除
    ALTER TABLE stu MODIFY phone VARCHAR(20) ;
    -- 唯一約束正確的刪除方式:
    ALTER TABLE stu DROP INDEX phone;
    
  2. 外鍵約束:foreign key

    語法: CONSTRAINT [外鍵名稱] FOREIGN KEY ([本表的字段]) REFERENCES 外鍵鏈接的表名([鏈接表名中的字段])

    
    CREATE TABLE A(
     id INT PRIMARY KEY AUTO_INCREMENT
    );
    
    CREATE TABLE B(
     id INT PRIMARY KEY AUTO_INCREMENT,
     id_A INT,
     CONSTRAINT a_b_id FOREIGN KEY (id_A) REFERENCES A(id)  -- 創(chuàng)建表時添加外鍵
    );
    
    
    -- 添加外鍵
    ALTER TABLE B ADD CONSTRAINT a_b_id FOREIGN KEY (id_A) REFERENCES A(id)
    -- 刪除外鍵
    ALTER TABLE B DROP FOREIGN KEY a_b_id;
    
    -- 級聯操作 
    -- 1.級聯更新  ON UPDATE CASCADE 
    -- 2.級聯刪除  ON DELETE CASCADE 
    ALTER TABLE B ADD CONSTRAINT a_b_id FOREIGN KEY (id_A) REFERENCES A(id) ON UPDATE CASCADE ON DELETE CASCADE;
    
    

數據庫設計的三大范式

第一范式(1NF):數據庫表的每一列都是不可分割的原子數據項

第二范式(2NF):在第一范式的基礎上撒强,實體的屬性完全依賴于主關鍵字倦零。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性

第三范式(3NF):在2NF基礎上,任何非主屬性不依賴于其它非主屬性(在2NF基礎上消除傳遞依賴)

數據庫備份與還原

  1. 備份: mysqldump -u用戶名 -p密碼 > 保存路徑

    備份指定數據庫: mysqldump -u用戶名 -p密碼 數據庫名稱 > 保存路徑

  2. 還原:

    1. 登陸數據庫
    2. 創(chuàng)建數據庫
    3. 使用數據庫
    4. 執(zhí)行備份文件即供,source 文件路徑

多表查詢

笛卡爾積:多表查詢定拟,清除無用數據

select * from table_a,table_b [where 條件]

-- 為表取別名
select * from table_a a,table_b b [where 條件]
  1. 內連接:查詢多表交集部分

    • 隱式內連接:使用where 條件消除無用數據

      語法: select 字段列表 from table1,table2 where table1.id = table2.id

    • 顯示內連接

      語法: select 字段列表 from table1 [inner] join table2 ON [條件] (inner 可省略)

  2. 外鏈接

    • 左外連接:查詢的是左表的全部信息,以及與右表其交集部分

      語法:select 字段列表 from table1 left [outer] join table2 on [條件]

    • 右外連接:查詢的是右表的全部信息逗嫡,以及與左表其交集部分

      語法:select 字段列表 from table1 right [outer] join table2 on [條件]

  3. 子查詢

    • 單行多列:作為條件使用運算符 >青自、<株依、=、>=延窜、<=

    • 多行單列:作為條件運算符 IN

    • 多行多列:作為虛擬表進行多表聯查

      select * from table1 t1,(select * from table2 [where]) t2 where table1.id = table2.id
      

事務

  1. 事務概念:如果一個包含多個步驟的業(yè)務操作恋腕,被事務管理,要么同時成功逆瑞,要么同事失敗荠藤。

  2. 事務操作方式

    1. 開啟事務:start transaction;
    2. 回滾:rollback;
    3. 提交:commit;
    -- 開啟事務
    start transaction;
    -- 被事務管理的sql語句
    ...
    -- 執(zhí)行通過
    commit;
    -- 出現問題,回滾事務  刪除臨時數據获高,回滾數據到開啟事務之前
    rollback;
    
    

關于數據提交需要注意的地方

MySQL 中事務默認自動提交哈肖,Oracle 默認手動提交

自動提交:增刪改語句會默認自動提交,使數據持久化

手動提交:開啟事務的情況下谋减,必須commit 手動提交牡彻,才能讓數據持久化

修改事務的默認提交方式:

? 查詢默認提交方式:select @@autocommit; -- 1 自動提交 2 手動提交

? 修改默認提交方式:set @@autocommit=0;

? 修改完成后每一條sql都需要手動更新

  1. 事務的四大特征

    1. 原子性:不可分割的最小操作單位
    2. 持久性:事務一旦提交或者回滾,會持久化保存數據
    3. 隔離性:多個事務之間相互獨立
    4. 一致性:事務操作前后數據總量不變
  2. 事務的隔離級別

    用來處理多個事務處理同一批數據引發(fā)的一些問題

    存在問題:

    1. 臟讀:一個事務讀到另一個事務中沒有提交的數據
    2. 不可重復讀(虛度):同一個事務中出爹,兩次獨到的數據不一樣
    3. 幻讀:一個事務操作(DML)數據表中所有的記錄庄吼,另一個事務添加了一條數據,則第一個事務無法查詢到自己的修改

    隔離級別:

    1. read uncommitted :讀未提交

      問題:臟讀严就、不可重復讀总寻、幻讀

    2. read committed :讀已提交(Oracle 默認) (只有提交了數據另一個事務才能讀到)

      問題 : 不可重復讀、幻讀

    3. repeatable read : 可重復讀(MySQL 默認)

      問題 : 幻讀

    4. serializable:串行化 (鎖表)

      解決所有存在的問題

    注意:隔離級別 安全性越來越高梢为,效率越來越低

關于數據庫隔離級別設置:

-- 查詢事務的隔離級別
select @@tx_isolation;
-- 設置隔離級別
set global transaction isolation level 級別字符串;

數據庫管理員

  1. 管理用戶

    1. 添加用戶

      語法:create user '用戶名'@'主機名' identified by '密碼';

    2. 刪除用戶

      語法:drop user '用戶名'@'主機名';

    3. 修改用戶密碼

      語法:update user set password = password('新密碼') where user ='用戶名'

      或者:set password for '用戶名'@'主機名' = password('新密碼');

    4. 查詢用戶

      1. 切換到mysql數據庫

        use mysql;

      2. 查詢user 表

        select * from user;

  1. 管理權限

    1. 查詢權限:show grants for '用戶名'@'主機名';

    2. 授予權限:grant 權限列表 on 數據庫.表名 to '用戶名'@'主機名';

      授予所有權限:grant ALL on *.* to '用戶名'@'主機名';

    3. 撤銷權限: revoke 權限列表 on 數據庫.表名 from '用戶名'@'主機名';

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末渐行,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子铸董,更是在濱河造成了極大的恐慌祟印,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粟害,死亡現場離奇詭異蕴忆,居然都是意外死亡,警方通過查閱死者的電腦和手機悲幅,發(fā)現死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門套鹅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汰具,你說我怎么就攤上這事卓鹿。” “怎么了留荔?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵吟孙,是天一觀的道長。 經常有香客問我,道長杰妓,這世上最難降的妖魔是什么肥隆? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮稚失,結果婚禮上,老公的妹妹穿的比我還像新娘恰聘。我一直安慰自己句各,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布晴叨。 她就那樣靜靜地躺著凿宾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兼蕊。 梳的紋絲不亂的頭發(fā)上初厚,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音孙技,去河邊找鬼产禾。 笑死,一個胖子當著我的面吹牛牵啦,可吹牛的內容都是我干的亚情。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼哈雏,長吁一口氣:“原來是場噩夢啊……” “哼楞件!你這毒婦竟也來了?” 一聲冷哼從身側響起裳瘪,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤土浸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后彭羹,有當地人在樹林里發(fā)現了一具尸體黄伊,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年皆怕,在試婚紗的時候發(fā)現自己被綠了毅舆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡愈腾,死狀恐怖憋活,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情虱黄,我是刑警寧澤悦即,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響辜梳,放射性物質發(fā)生泄漏粱甫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一作瞄、第九天 我趴在偏房一處隱蔽的房頂上張望茶宵。 院中可真熱鬧,春花似錦宗挥、人聲如沸乌庶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞒大。三九已至,卻和暖如春搪桂,著一層夾襖步出監(jiān)牢的瞬間透敌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工踢械, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酗电,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓裸燎,卻偏偏與公主長得像顾瞻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子德绿,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時荷荤,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,338評論 0 9
  • 數據庫基礎知識 數據庫客戶端MySQL作為數據庫服務器來運行移稳,任何滿足mysql通信規(guī)范的軟件都可以作為客戶端來連...
    littlexjing閱讀 909評論 0 2
  • 啟動 mysql$ mysql -uroot -p -P3306 -h127.0.0.1-u ,--user=na...
    假裝正在輸入閱讀 716評論 0 6
  • 一蕴纳、MySQL優(yōu)化 MySQL優(yōu)化從哪些方面入手: (1)存儲層(數據) 構建良好的數據結構「隽唬可以大大的提升我們S...
    寵辱不驚丶歲月靜好閱讀 2,440評論 1 8
  • 我看到了溜冰的人 有一個姐姐古毛,四個哥哥 他們很快,像跑步一樣 他們擺了一個造型都许,很炫酷 我們一邊吃著桔子一邊看他們...
    夢想家佳閱讀 186評論 0 0