自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

零散的MySQL基礎(chǔ)總是記不???看這一篇如何拯救你

新聞
在日常開發(fā)中,一些不常用且又比較基礎(chǔ)的知識,過了一段時間之后,總是容易忘記或者變得有點模棱兩可。本篇主要記錄一些關(guān)于MySQL數(shù)據(jù)庫比較基礎(chǔ)的知識,以便日后快速查看。

 前言

在日常開發(fā)中,一些不常用且又比較基礎(chǔ)的知識,過了一段時間之后,總是容易忘記或者變得有點模棱兩可。本篇主要記錄一些關(guān)于MySQL數(shù)據(jù)庫比較基礎(chǔ)的知識,以便日后快速查看。

SQL命令

SQL命令分可以分為四組:DDL、DML、DCLTCL。四組中包含的命令分別如下

零散的MySQL基礎(chǔ)總是記不???看這一篇如何拯救你

DDL

DDL數(shù)據(jù)定義語言(Data Definition Language)的簡稱,它處理數(shù)據(jù)庫schemas描述數(shù)據(jù)應(yīng)如何駐留在數(shù)據(jù)庫中。

  • CREATE:創(chuàng)建數(shù)據(jù)庫及其對象(如表,索引,視圖,存儲過程,函數(shù)和觸發(fā)器)
  • ALTER:改變現(xiàn)有數(shù)據(jù)庫的結(jié)構(gòu)
  • DROP:從數(shù)據(jù)庫中刪除對象
  • TRUNCATE:從表中刪除所有記錄,包括為記錄分配的所有空間都將被刪除
  • COMMENT:添加注釋
  • RENAME:重命名對象

常用命令如下:

  1. # 建表 
  2. CREATE TABLE sicimike  ( 
  3.   id int(4) primary key auto_increment COMMENT '主鍵ID'
  4.   name varchar(10) unique, 
  5.   age int(3default 0
  6.   identity_card varchar(18
  7.   # PRIMARY KEY (id) // 也可以通過這種方式設(shè)置主鍵 
  8.   # UNIQUE KEY (name) // 也可以通過這種方式設(shè)置唯一鍵 
  9.   # key/index (identity_card, col1...) // 也可以通過這種方式創(chuàng)建索引 
  10. ) ENGINE = InnoDB; 
  11.  
  12. # 設(shè)置主鍵 
  13. alter table sicimike add primary key(id); 
  14.  
  15. # 刪除主鍵 
  16. alter table sicimike drop primary key; 
  17.  
  18. # 設(shè)置唯一鍵 
  19. alter table sicimike add unique key(column_name); 
  20.  
  21. # 刪除唯一鍵 
  22. alter table sicimike drop index column_name; 
  23.  
  24. # 創(chuàng)建索引 
  25. alter table sicimike add [unique/fulltext/spatial] index/key index_name (identity_card[(len)] [asc/desc])[using btree/hash] 
  26. create [unique/fulltext/spatial] index index_name on sicimike(identity_card[(len)] [asc/desc])[using btree/hash] 
  27. example: alter table sicimike add index idx_na(name, age); 
  28.  
  29. # 刪除索引 
  30. alter table sicimike drop key/index identity_card; 
  31. drop index index_name on sicimike; 
  32.  
  33. # 查看索引 
  34. show index from sicimike; 
  35.  
  36. # 查看列 
  37. desc sicimike; 
  38.  
  39. # 新增列 
  40. alter table sicimike add column column_name varchar(30); 
  41.  
  42. # 刪除列 
  43. alter table sicimike drop column column_name; 
  44.  
  45. # 修改列名 
  46. alter table sicimike change column_name new_name varchar(30); 
  47.  
  48. # 修改列屬性 
  49. alter table sicimike modify column_name varchar(22); 
  50.  
  51. # 查看建表信息 
  52. show create table sicimike; 
  53.  
  54. # 添加表注釋 
  55. alter table sicimike comment '表注釋'
  56.  
  57. # 添加字段注釋 
  58. alter table sicimike modify column column_name varchar(10) comment '姓名'

DML

DML是數(shù)據(jù)操縱語言(Data Manipulation Language)的簡稱,包括最常見的SQL語句,例如SELECT,INSERT,UPDATE,DELETE等,它用于存儲,修改,檢索刪除數(shù)據(jù)庫中的數(shù)據(jù)。

  • 分頁
  1. -- 查詢從第11條數(shù)據(jù)開始的連續(xù)5條數(shù)據(jù) 
  2. select * from sicimike limit 105 
  • group by
    默認情況下,MySQL中的分組(group by)語句,不要求select返回的列,必須是分組的列或者是一個聚合函數(shù)。如果select查詢的列不是分組的列,也不是聚合函數(shù),則會返回該分組中第一條記錄的數(shù)據(jù)。對比下面兩條SQL語句,第二條SQL語句中,cname既不是分組的列,也不是以聚合函數(shù)的形式出現(xiàn)。所以在liming這個分組中,cname取的是第一條數(shù)據(jù)。
  1. mysql> select * from c; 
  2. +-----+-------+----------+ 
  3. | CNO | CNAME | CTEACHER | 
  4. +-----+-------+----------+ 
  5. |   1 | 數(shù)學(xué)  | liming   | 
  6. |   2 | 語文  | liming   | 
  7. |   3 | 歷史  | xueyou   | 
  8. |   4 | 物理  | guorong  | 
  9. |   5 | 化學(xué)  | liming   | 
  10. +-----+-------+----------+ 
  11. 5 rows in set (0.00 sec) 
  12.  
  13. mysql> select cteacher, count(cteacher), cname from c group by cteacher; 
  14. +----------+-----------------+-------+ 
  15. | cteacher | count(cteacher) | cname | 
  16. +----------+-----------------+-------+ 
  17. | guorong  |               1 | 物理  | 
  18. | liming   |               3 | 數(shù)學(xué)  | 
  19. | xueyou   |               1 | 歷史  | 
  20. +----------+-----------------+-------+ 
  21. 3 rows in set (0.00 sec) 
  • having
    having關(guān)鍵字用于對分組后的數(shù)據(jù)進行篩選,功能相當(dāng)于分組之前的where,不過要求更嚴格。過濾條件要么是一個聚合函數(shù)( ... having count(x) > 1),要么是出現(xiàn)在select后面的列(select col1, col2 ... group by x having col1 > 1)
  • 多表更新
  1. update tableA a inner join tableB b on a.xxx = b.xxx set a.col1 = xxx, b.col1 = xxx where ...多表刪除 
  • 多表刪除
  1. delete a, b from tableA a inner join tableB b on a.xxx = b.xxx where a.col1 = xxx and b.col1 = xxx 

DCL

DCL是數(shù)據(jù)控制語言(Data Control Language)的簡稱,它包含諸如GRANT之類的命令,并且主要涉及數(shù)據(jù)庫系統(tǒng)的權(quán)限,權(quán)限和其他控件。

  • GRANT :允許用戶訪問數(shù)據(jù)庫的權(quán)限
  • REVOKE:撤銷用戶使用GRANT命令賦予的訪問權(quán)限

TCL

TCL是事務(wù)控制語言(Transaction Control Language)的簡稱,用于處理數(shù)據(jù)庫中的事務(wù)

  • COMMIT:提交事務(wù)
  • ROLLBACK:在發(fā)生任何錯誤的情況下回滾事務(wù)

范式

數(shù)據(jù)庫規(guī)范化,又稱正規(guī)化、標(biāo)準(zhǔn)化,是數(shù)據(jù)庫設(shè)計的一系列原理和技術(shù),以減少數(shù)據(jù)庫中數(shù)據(jù)冗余,增進數(shù)據(jù)的一致性。關(guān)系模型的發(fā)明者埃德加·科德最早提出這一概念,并于1970年代初定義了第一范式、第二范式和第三范式的概念,還與Raymond F. Boyce于1974年共同定義了第三范式的改進范式——BC范式。除外還包括針對多值依賴的第四范式,連接依賴的第五范式、DK范式和第六范式。

現(xiàn)在數(shù)據(jù)庫設(shè)計最多滿足3NF,普遍認為范式過高,雖然具有對數(shù)據(jù)關(guān)系更好的約束性,但也導(dǎo)致數(shù)據(jù)關(guān)系表增加而令數(shù)據(jù)庫IO更易繁忙,原來交由數(shù)據(jù)庫處理的關(guān)系約束現(xiàn)更多在數(shù)據(jù)庫使用程序中完成。

第一范式

定義:數(shù)據(jù)庫中的所有字段(列)都是單一屬性,不可再分的。這個單一屬性由基本的數(shù)據(jù)類型所構(gòu)成,如整型、浮點型、字符串等。第一范式是為了保證列的原子性。

零散的MySQL基礎(chǔ)總是記不住?看這一篇如何拯救你

上表不滿足第一范式,其中的地址列是可以再拆分的,可以拆分成省、市、區(qū)等

零散的MySQL基礎(chǔ)總是記不???看這一篇如何拯救你

第二范式

定義:數(shù)據(jù)庫中的表不存在非關(guān)鍵字段對任一關(guān)鍵字字段的部分函數(shù)依賴部分函數(shù)依賴是指存在著組合關(guān)鍵字中的某一關(guān)鍵字決定非關(guān)鍵字的情況第二范式在滿足了第一范式的基礎(chǔ)上,消除非主鍵列對聯(lián)合主鍵的部分依賴

零散的MySQL基礎(chǔ)總是記不住?看這一篇如何拯救你

上面這張表中想要設(shè)置主鍵,只能是商品名稱供應(yīng)商名稱一起組成聯(lián)合主鍵。但是價格分類只依賴于商品名稱,供應(yīng)商電話只依賴于供應(yīng)商名稱,所以上面的表不滿足第二范式,可以改成如下形式:

商品信息表

零散的MySQL基礎(chǔ)總是記不???看這一篇如何拯救你

供應(yīng)商信息表

零散的MySQL基礎(chǔ)總是記不???看這一篇如何拯救你

商品-供應(yīng)商關(guān)聯(lián)表

零散的MySQL基礎(chǔ)總是記不???看這一篇如何拯救你

第三范式

定義:所有非主鍵屬性都只和候選鍵有相關(guān)性,也就是說非主鍵屬性之間應(yīng)該是獨立無關(guān)的。第三范式是在滿足了第二范式的基礎(chǔ)上,消除列與列之間的傳遞依賴

零散的MySQL基礎(chǔ)總是記不???看這一篇如何拯救你

在上面的表中,商品的分類描述依賴分類,而分類依賴商品名稱,而不是分類描述直接依賴商品名稱。這樣就形成了傳遞依賴,所以不符合第三范式??梢愿某扇缦滦问?/p>

商品表

零散的MySQL基礎(chǔ)總是記不住?看這一篇如何拯救你

商品分類表

零散的MySQL基礎(chǔ)總是記不???看這一篇如何拯救你

數(shù)據(jù)庫設(shè)計時,遵循范式反范式一直以來是一個頗受爭議的問題。遵循范式對數(shù)據(jù)關(guān)系更好的約束性,并且減少數(shù)據(jù)冗余,可以更好地保證數(shù)據(jù)一致性。而反范式則是為了獲得更好的性能。所以范式還是反范式并沒有明確的標(biāo)準(zhǔn),適合自己業(yè)務(wù)場景的才是最好的。

反范式設(shè)計時,需要考慮以下幾個問題,分別是插入異常、更新異常刪除異常

  • 插入異常:如果某個實體隨著另一個實體的存在而存在,即缺少某個實體是無法表示這個實體,那么這個表就存在插入異常。
  • 更新異常:如果更改表所對應(yīng)的某個實體實例的單獨屬性時,需要將多行更新,那么就說明這個表存在更新異常
  • 刪除異常:如果刪除表的某一行來表示某實體實例失效時,導(dǎo)致另一個不同實體實例信息丟失,那么這個表就存在刪除異常

以違反第二范式的表為例

零散的MySQL基礎(chǔ)總是記不?。靠催@一篇如何拯救你

如果可樂第二制造廠這個供應(yīng)商尚未開始供貨,表中就不存在第二條記錄,也就無法記錄供應(yīng)商的電話,這樣就存在插入異常;如果需要把可樂的價格提高,需要更新表中的多條記錄,這樣就存在更新異常;如果刪除可樂第二制造廠的供貨信息,那么該供應(yīng)商的電話也就丟失了,這樣就存在刪除異常。

一般存在插入異常的表,都會存在更新異常刪除異常。

橫表縱表

SQL腳本

  1. # 橫表 
  2. CREATE TABLE `table_h2z` ( 
  3. `name` varchar(32) DEFAULT NULL, 
  4. `chinese` int(11) DEFAULT NULL, 
  5. `math` int(11) DEFAULT NULL, 
  6. `english` int(11) DEFAULT NULL 
  7. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 
  8.  
  9. /*Data for the table `table_h2z` */ 
  10. insert  into `table_h2z`(`name`,`chinese`,`math`,`english`) values  
  11. ('mike',45,43,87), 
  12. ('lily',53,64,88), 
  13. ('lucy',57,75,75); 
  14.  
  15. # 縱表 
  16. CREATE TABLE `table_z2h` ( 
  17.   `name` varchar(32) DEFAULT NULL, 
  18.   `subject` varchar(8) NOT NULL DEFAULT ''
  19.   `score` int(11) DEFAULT NULL 
  20. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  21.  
  22. /*Data for the table `table_z2h` */ 
  23. insert  into `table_z2h`(`name`,`subject`,`score`) values  
  24. ('mike','chinese',45), 
  25. ('lily','chinese',53), 
  26. ('lucy','chinese',57), 
  27. ('mike','math',43), 
  28. ('lily','math',64), 
  29. ('lucy','math',75), 
  30. ('mike','english',87), 
  31. ('lily','english',88), 
  32. ('lucy','english',75); 

橫表轉(zhuǎn)縱表

  1. SELECT NAME, 'chinese' AS `subject`,  chinese AS `score` FROM table_h2z 
  2. UNION ALL 
  3. SELECT NAME, 'math' AS `subject`,  math AS `score` FROM table_h2z 
  4. UNION ALL 
  5. SELECT NAME, 'english' AS `subject`, english AS `score` FROM table_h2z 

執(zhí)行結(jié)果

  1. +------+---------+-------+ 
  2. | name | subject | score | 
  3. +------+---------+-------+ 
  4. | mike | chinese |    45 | 
  5. | lily | chinese |    53 | 
  6. | lucy | chinese |    57 | 
  7. | mike | math    |    43 | 
  8. | lily | math    |    64 | 
  9. | lucy | math    |    75 | 
  10. | mike | english |    87 | 
  11. | lily | english |    88 | 
  12. | lucy | english |    75 | 
  13. +------+---------+-------+ 
  14. 9 rows in set (0.00 sec) 

縱表轉(zhuǎn)橫表

  1. SELECT NAME, 
  2.     SUM(CASE `subject` WHEN 'chinese' THEN score ELSE 0 END) AS chinese, 
  3.     SUM(CASE `subject` WHEN 'math' THEN score ELSE 0 END) AS math, 
  4.     SUM(CASE `subject` WHEN 'english' THEN score ELSE 0 END) AS english 
  5. FROM table_z2h 
  6. GROUP BY NAME 

執(zhí)行結(jié)果

  1. +------+---------+------+---------+ 
  2. | name | chinese | math | english | 
  3. +------+---------+------+---------+ 
  4. | lily |      53 |   64 |      88 | 
  5. | lucy |      57 |   75 |      75 | 
  6. | mike |      45 |   43 |      87 | 
  7. +------+---------+------+---------+ 
  8. 3 rows in set (0.00 sec) 

 

責(zé)任編輯:張燕妮 來源: 今日頭條
相關(guān)推薦

2023-10-17 08:15:28

API前后端分離

2022-08-26 10:32:21

MongoDB數(shù)據(jù)庫

2024-11-04 08:54:30

2023-10-30 07:12:04

2023-02-10 09:04:27

2020-02-18 16:20:03

Redis ANSI C語言日志型

2022-06-20 09:01:23

Git插件項目

2022-08-01 11:33:09

用戶分析標(biāo)簽策略

2021-04-08 07:37:39

隊列數(shù)據(jù)結(jié)構(gòu)算法

2023-09-11 08:13:03

分布式跟蹤工具

2019-05-09 15:12:20

Linux 系統(tǒng) 數(shù)據(jù)

2018-05-22 08:24:50

PythonPyMongoMongoDB

2024-09-23 08:00:00

消息隊列MQ分布式系統(tǒng)

2020-07-03 08:21:57

Java集合框架

2019-05-14 09:31:16

架構(gòu)整潔軟件編程范式

2023-06-02 08:22:51

Netty網(wǎng)絡(luò)編程

2025-02-07 09:28:39

PGSQL命令PostgreSQL

2017-03-11 22:19:09

深度學(xué)習(xí)

2022-04-07 10:39:21

反射Java安全

2023-11-18 09:30:42

模型AI
點贊
收藏

51CTO技術(shù)棧公眾號