MySQL(Mariadb)總結(jié)2 - SQL知識點(diǎn)匯總

  • 開發(fā)DBA:
    數(shù)據(jù)庫設(shè)計(jì)(E-R關(guān)系圖)、SQL開發(fā)、內(nèi)置函數(shù)、存儲例程(存儲過程和存儲函數(shù))、觸發(fā)器、事件調(diào)度器(event scheduler)
  • 管理DBA:
    安裝、升級,備份、恢復(fù),用戶管理、權(quán)限管理,監(jiān)控、分析、基準(zhǔn)測試,語句優(yōu)化(SQL語句),數(shù)據(jù)字典,按需要配置服務(wù)器(服務(wù)器變量:MyISAM, InnoDB, 緩存, 日志)

SQL語言組成部分

DDL:
DML:
完整性定義語言:DDL的一部分功能
主鍵、外鍵、惟一鍵、條件、非空、事務(wù)
視圖定義:虛表,存儲下來的SELECT語句
事務(wù)控制:
嵌入式SQL和動態(tài)SQL:
DCL:授權(quán)

數(shù)據(jù)類型的功能:

  1. 存儲的值類型
  2. 占住的存儲空間大小
  3. 定長和變長
  4. 如何被索引及排序
  5. 是否能夠被索引

數(shù)據(jù)字典:

系統(tǒng)編目(system catalog)
保存數(shù)據(jù)庫服務(wù)器上的元數(shù)據(jù)(表名,表的屬性等)

元數(shù)據(jù):

  • 關(guān)系的名字
  • 每個關(guān)系的各字段的名字
  • 各字段的數(shù)據(jù)類型和長度
  • 約束
  • 每個關(guān)系上的視圖的名字及視圖的定義
  • 授權(quán)用戶的名字
  • 用戶的授權(quán)和賬號信息
  • 統(tǒng)計(jì)類數(shù)據(jù)
    • 每個關(guān)系字段的個數(shù)
    • 每個關(guān)系中的行數(shù)
    • 每個關(guān)系的存儲方法

保存元數(shù)據(jù)的數(shù)據(jù)庫:

  • mysql
  • information_schema
  • performance_schema(虛庫)

Developing With MySQL

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

  • 字符型
    • char
    • varchar
    • binary
    • varbinary
    • text
    • blob
  • 數(shù)值型
    • 精確數(shù)值型
      • 整型
      • 十進(jìn)制數(shù)據(jù):decimal
    • 近似數(shù)據(jù)型
      • 單精度浮點(diǎn)型
      • 雙精度浮點(diǎn)型
  • 日期時(shí)間型
    • 日期型
    • 時(shí)間型
    • 日期時(shí)間型
    • 時(shí)間戳
  • 布爾型
  • 內(nèi)建類型
    • Enum
    • Set

數(shù)值類型

  • TINYINT

  • SMALLINT

  • MEDIUMINT

  • INT

  • BIGINT

  • DECIMAL

  • FLOAT

  • DOUBAL

  • BIT

字符型:

  • CHAR

  • VARCHAR

  • TINYTEXT

  • TEXT

  • MEDIUMTEXT

  • LONGTEXT

  • BINARY

  • VARBINARY

  • TINYBLOB

  • BLOB

  • MEDIUMBLOB

  • LONGBLOB

  • ENUM

  • SET

日期時(shí)間型:

  • DATE
  • TIME
  • DATETIME
  • TIMESTAMP
  • YEAR

字符型常用字段修飾符

NOT NUll
NULL
DEFAULT [string] 不適用于TEXT類型
CHARACTER SET [字符集]
- 查詢當(dāng)前使用的字符集 show VARIABLES LIKE '%char%'
- 查詢支持的字符集 shwo CHARACTER SET
COLLATION '規(guī)則' 排序規(guī)則
- 查看排序規(guī)則 show COLLATION

AUTO_INCREMENT 自動增長,非空,且唯一,支持索引,非負(fù)
UNSIGNED 無符號

SQL模式SQL_MODE

mysql模式有TRADITIONAL,STRICT_TRANS_TABLES,STRICT_ALL_TABLES

設(shè)定服務(wù)器變量值:(僅用于支持動態(tài)的變量)

支持修改的服務(wù)器變量:

  • 動態(tài)變量: 可以MySQL運(yùn)行時(shí)修改
  • 靜態(tài)變量: 于配置文件中修改其值,并重啟后方能生效

服務(wù)器變量從其作用范圍來講,有兩類:

  • 全局變量:服務(wù)器級別,修改之后僅對新建的會話生效
  • 會話級別: 會話級別, 僅對當(dāng)前會話有效

查看服務(wù)器變量:

show [{GLOBAL|SESSION}] VARIABLES [LIKE ''];
select @@{GLOBAL|SESSION}.VARIABLE_NAME;
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='SOME_VARIABLE_NAME';
SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='SOME_VARIABLE_NAME';

修改服務(wù)器變量

前提:僅管理員有權(quán)限修改全局變量
SET {GLOBAL|SESSION} VARIABLE_NAME=VALUE;

注意:無論是全局還是會話級別的動態(tài)變量修改,在從其mysqld后都會失效;想永久生效,只能在配置文件[mysqld]中定義。

Mysql中的大小寫區(qū)分

  1. SQL關(guān)鍵字及函數(shù)名不區(qū)分大小寫
  2. 數(shù)據(jù)庫、表及數(shù)據(jù)名稱的大小寫區(qū)分與否取決于底層的OS及FS
  3. 存儲過程、存儲函數(shù)及事件調(diào)度器的名字不區(qū)分大小寫,但是觸發(fā)器區(qū)分
  4. 表別名區(qū)分大小寫
  5. 對字段中的數(shù)據(jù),如果字段數(shù)據(jù)類型為Binary類型,則區(qū)分大小寫,非Binary不區(qū)分大小寫

DDL語句

數(shù)據(jù)庫操作(mysql里database和schema沒有區(qū)別)

CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] [CHARACTER SET=''] [DEFAULT] [COLLATE='']
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
ALTER {DATABASE|SCHEMA} db_name [DEFAULT] [CHARACTER SET=''] [DEFAULT] [COLLATE='']

表操作

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]

(create_definition,...):
    字段的定義:字段名、類型和類型修飾符
    鍵、約束或索引:
    PRIMARY KEY, UNIQUE KEY, FOREIGN KEY, CHECK
    {INDEX|KEY}
    
[table_options]
    ENGINE [=] engine_name
        mysql> SHOW ENGINES;
    AUTO_INCREMENT [=] value
    [DEFAULT] CHARACTER SET [=] charset_name
    [DEFAULT] COLLATE [=] collation_name
    COMMENT [=] 'string'
    DELAY_KEY_WRITE [=] {0 | 1}
    ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
    TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]
    
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name # 復(fù)制表數(shù)據(jù),這種方式的表的屬性將會丟失
    [(create_definition,...)]
    [table_options]
    select_statement
    
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name # 復(fù)制表結(jié)構(gòu)
    { LIKE old_tbl_name | (LIKE old_tbl_name) }
    
DROP [TEMPORARY] TABLE [IF EXISTS]
    tbl_name [, tbl_name] ...
    [RESTRICT | CASCADE]
   
ALTER TABLE tbl_name
     [alter_specification [, alter_specification] ...]
     
RENAME [TO|AS] new_tbl_name #改表名

CONVERT TO CHARACTER SET charset_name [COLLATE collation_name] #修改字符集或者排序

MyISAM表,每表有三個文件,都位于數(shù)據(jù)庫目錄中:

  • tb_name.frm: 表結(jié)構(gòu)定義
  • tb_name.MYD: 數(shù)據(jù)文件
  • tb_name.MYI: 索引文件

InnoDB表,有兩種存儲方式

  1. 默認(rèn):每表有一個獨(dú)立文件和一個多表共享的文件
  • tb_name.frm: 表結(jié)構(gòu)的定義,位于數(shù)據(jù)庫目錄中;
  • ibdata#: 共享的表空間文件,默認(rèn)位于數(shù)據(jù)目錄(datadir指向的目錄)中;
  1. 獨(dú)立的表空間:
  • tb_name.frm: 每表有一個表結(jié)構(gòu)文件
  • tb_name.ibd: 一個獨(dú)有的表空間文件
練習(xí)題:

新建如下表(包括結(jié)構(gòu)和內(nèi)容):

ID    Name          Age     Gender     Course
1     Ling Huchong   24      Male       Hamogong
2     Huang Rong    19      Female     Chilian Shenzhang
3     Lu Wushaung   18      Female     Jiuyang Shenggong
4     Zhu Ziliu     52      Male       Pixie Jianfa
5     Chen Jialuo   22      Male       Xianglong Shiba Zhang
6     Ou Yangfeng   70      Male       Shenxiang Bannuo Gong

1、新增字段:
    Class 字段定義自行選擇;放置于Name字段后;

2、將ID字段名稱修改為TID;

3、將Age字段放置最后;

DML語句

SELECT語句的執(zhí)行流程:

FROM clause --> WHERE clause --> GROUP BY --> HAVING clause --> ORDER BY ... --> SELECT --> LIMIT

SELECT語句:
DISTINCT:指定的結(jié)果相同的只顯示一次;
SQL_CACHE:緩存于查詢緩存中;
SQL_NO_CACHE:不緩存查詢結(jié)果;

MySQL的查詢操作:

  • 單表查詢:簡單查詢
  • 多表查詢: 連續(xù)查詢
  • 聯(lián)合查詢:

選擇和投影:

  • 投影: 挑選要顯示的字段
    • select 字段1,字段2,... FROM tb_name;
  • 選擇:挑選符合條件的行
    • SELECT 字段1,... FROM tb_name WHERE 子句;

布爾條件表達(dá)式操作符:

=
<=>
<>
<
<=
>
>=

IS NULL
IS NOT NULL

LIKE: 支持的通配符: %(任意長度的任意字符), _(任意單個字符)

RLIKE, REGEXP: 支持使用正則表達(dá)式

IN: 判斷指定字段的值是否在給定在列表中;

BETWEEN ... AND ...: 位于指定的范圍之間

組合條件測試:

NOT, !
AND, &&
OR, ||

聚合函數(shù):

SUM(), AVG(), MAX(), MIN(), COUNT()

練習(xí):導(dǎo)入hellodb.sql,以下操作在students表上執(zhí)行
1、以ClassID分組,顯示每班的同學(xué)的人數(shù);
2、以Gender分組,顯示其年齡之和;
3、以ClassID分組,顯示其平均年齡大于25的班級;
4、以Gender分組,顯示各組中年齡大于25的學(xué)員的年齡之和;

多表查詢及子句查詢

聯(lián)接查詢:事先將兩張或多張表join,根據(jù)join的結(jié)果進(jìn)行查詢;

cross join: 交叉聯(lián)結(jié)
(a+b)(c+d+e)=

自然聯(lián)結(jié):
等值聯(lián)結(jié)
條件比較

外聯(lián)結(jié):
左外聯(lián)結(jié):只保留出現(xiàn)在左外連接運(yùn)算之前(左邊)的關(guān)系中的元組;
left_tb LEFT JOIN right_tb ON 連接條件
右外聯(lián)結(jié):只保留出現(xiàn)在右外連接運(yùn)算之后(右邊)的關(guān)系中的元組;
left_tb RIGHT JOIN right_tb ON 連接條件
全外聯(lián)結(jié)

自聯(lián)結(jié):

別名:
表別名
字段別名

練習(xí):導(dǎo)入hellodb.sql,完成以下題目:
1、顯示前5位同學(xué)的姓名、課程及成績;
2、顯示其成績高于80的同學(xué)的名稱及課程;
3、求前8位同學(xué)每位同學(xué)自己兩門課的平均成績,并按降序排列;
4、顯示每門課程課程名稱及學(xué)習(xí)了這門課的同學(xué)的個數(shù);

思考:
1、如何顯示其年齡大于平均年齡的同學(xué)的名字?
2、如何顯示其學(xué)習(xí)的課程為第1、2,4或第7門課的同學(xué)的名字?
3、如何顯示其成員數(shù)最少為3個的班級的同學(xué)中年齡大于同班同學(xué)平均年齡的同學(xué)?
4、統(tǒng)計(jì)各班級中年齡大于全校同學(xué)平均年齡的同學(xué)。

子查詢

在查詢中嵌套的查詢
用于WHERE中的子查詢
1、用于比較表達(dá)式中的子查詢
子查詢的返回值只能有一個;
2、用于EXISTS中的子查詢
判斷存在與否
3、用于IN中的子查詢;
判斷存在于指定列表中
用于FROM中子查詢:
SELECT alias.col,... FROM (SELECT clause) AS alias WHERE condition

MySQL不擅長于子查詢:應(yīng)該避免使用子查詢;

總結(jié):MySQL的聯(lián)結(jié)查詢及子查詢
聯(lián)結(jié):
交叉聯(lián)結(jié)
內(nèi)聯(lián)結(jié)
外聯(lián)結(jié)
左外
右外
自聯(lián)結(jié)
子查詢:
用于WHERE中的子查詢
用于條件比較:子查詢只能一個值
用于IN:子查詢可以返回多個值
EXISTS:子查詢可以返回多個值
用于FROM子句的子查詢

MYSQL視圖(虛表)

存儲下來的select語句
創(chuàng)建:
create view 視圖名 as select語句
刪除:
drop view 視圖名

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容