- 開發(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ù)類型的功能:
- 存儲的值類型
- 占住的存儲空間大小
- 定長和變長
- 如何被索引及排序
- 是否能夠被索引
數(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í)間型
- 時(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ū)分
- SQL關(guān)鍵字及函數(shù)名不區(qū)分大小寫
- 數(shù)據(jù)庫、表及數(shù)據(jù)名稱的大小寫區(qū)分與否取決于底層的OS及FS
- 存儲過程、存儲函數(shù)及事件調(diào)度器的名字不區(qū)分大小寫,但是觸發(fā)器區(qū)分
- 表別名區(qū)分大小寫
- 對字段中的數(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表,有兩種存儲方式
- 默認(rèn):每表有一個獨(dú)立文件和一個多表共享的文件
- tb_name.frm: 表結(jié)構(gòu)的定義,位于數(shù)據(jù)庫目錄中;
- ibdata#: 共享的表空間文件,默認(rèn)位于數(shù)據(jù)目錄(datadir指向的目錄)中;
- 獨(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 視圖名