- 開發DBA:
數據庫設計(E-R關系圖)、SQL開發、內置函數、存儲例程(存儲過程和存儲函數)、觸發器、事件調度器(event scheduler) - 管理DBA:
安裝、升級,備份、恢復,用戶管理、權限管理,監控、分析、基準測試,語句優化(SQL語句),數據字典,按需要配置服務器(服務器變量:MyISAM, InnoDB, 緩存, 日志)
SQL語言組成部分
DDL:
DML:
完整性定義語言:DDL的一部分功能
主鍵、外鍵、惟一鍵、條件、非空、事務
視圖定義:虛表,存儲下來的SELECT語句
事務控制:
嵌入式SQL和動態SQL:
DCL:授權
數據類型的功能:
- 存儲的值類型
- 占住的存儲空間大小
- 定長和變長
- 如何被索引及排序
- 是否能夠被索引
數據字典:
系統編目(system catalog)
保存數據庫服務器上的元數據(表名,表的屬性等)
元數據:
- 關系的名字
- 每個關系的各字段的名字
- 各字段的數據類型和長度
- 約束
- 每個關系上的視圖的名字及視圖的定義
- 授權用戶的名字
- 用戶的授權和賬號信息
- 統計類數據
- 每個關系字段的個數
- 每個關系中的行數
- 每個關系的存儲方法
保存元數據的數據庫:
- mysql
- information_schema
- performance_schema(虛庫)
Developing With MySQL
數據類型
- 字符型
- char
- varchar
- binary
- varbinary
- text
- blob
- 數值型
- 精確數值型
- 整型
- 十進制數據:decimal
- 近似數據型
- 單精度浮點型
- 雙精度浮點型
- 精確數值型
- 日期時間型
- 日期型
- 時間型
- 日期時間型
- 時間戳
- 布爾型
- 內建類型
- Enum
- Set
數值類型
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
DECIMAL
FLOAT
DOUBAL
BIT
字符型:
CHAR
VARCHAR
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
BINARY
VARBINARY
TINYBLOB
BLOB
MEDIUMBLOB
LONGBLOB
ENUM
SET
日期時間型:
- DATE
- TIME
- DATETIME
- TIMESTAMP
- YEAR
字符型常用字段修飾符
NOT NUll
NULL
DEFAULT [string]
不適用于TEXT類型
CHARACTER SET [字符集]
- 查詢當前使用的字符集 show VARIABLES LIKE '%char%'
- 查詢支持的字符集 shwo CHARACTER SET
COLLATION '規則'
排序規則
- 查看排序規則 show COLLATION
AUTO_INCREMENT
自動增長,非空,且唯一,支持索引,非負
UNSIGNED
無符號
SQL模式SQL_MODE
mysql模式有TRADITIONAL,STRICT_TRANS_TABLES,STRICT_ALL_TABLES
設定服務器變量值:(僅用于支持動態的變量)
支持修改的服務器變量:
- 動態變量: 可以MySQL運行時修改
- 靜態變量: 于配置文件中修改其值,并重啟后方能生效
服務器變量從其作用范圍來講,有兩類:
- 全局變量:服務器級別,修改之后僅對新建的會話生效
- 會話級別: 會話級別, 僅對當前會話有效
查看服務器變量:
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';
修改服務器變量
前提:僅管理員有權限修改全局變量
SET {GLOBAL|SESSION} VARIABLE_NAME=VALUE;
注意:無論是全局還是會話級別的動態變量修改,在從其mysqld后都會失效;想永久生效,只能在配置文件[mysqld]中定義。
Mysql中的大小寫區分
- SQL關鍵字及函數名不區分大小寫
- 數據庫、表及數據名稱的大小寫區分與否取決于底層的OS及FS
- 存儲過程、存儲函數及事件調度器的名字不區分大小寫,但是觸發器區分
- 表別名區分大小寫
- 對字段中的數據,如果字段數據類型為Binary類型,則區分大小寫,非Binary不區分大小寫
DDL語句
數據庫操作(mysql里database和schema沒有區別)
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 # 復制表數據,這種方式的表的屬性將會丟失
[(create_definition,...)]
[table_options]
select_statement
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name # 復制表結構
{ 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表,每表有三個文件,都位于數據庫目錄中:
- tb_name.frm: 表結構定義
- tb_name.MYD: 數據文件
- tb_name.MYI: 索引文件
InnoDB表,有兩種存儲方式
- 默認:每表有一個獨立文件和一個多表共享的文件
- tb_name.frm: 表結構的定義,位于數據庫目錄中;
- ibdata#: 共享的表空間文件,默認位于數據目錄(datadir指向的目錄)中;
- 獨立的表空間:
- tb_name.frm: 每表有一個表結構文件
- tb_name.ibd: 一個獨有的表空間文件
練習題:
新建如下表(包括結構和內容):
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語句的執行流程:
FROM clause --> WHERE clause --> GROUP BY --> HAVING clause --> ORDER BY ... --> SELECT --> LIMIT
SELECT語句:
DISTINCT:指定的結果相同的只顯示一次;
SQL_CACHE:緩存于查詢緩存中;
SQL_NO_CACHE:不緩存查詢結果;
MySQL的查詢操作:
- 單表查詢:簡單查詢
- 多表查詢: 連續查詢
- 聯合查詢:
選擇和投影:
- 投影: 挑選要顯示的字段
select 字段1,字段2,... FROM tb_name;
- 選擇:挑選符合條件的行
SELECT 字段1,... FROM tb_name WHERE 子句;
布爾條件表達式操作符:
=
<=>
<>
<
<=
>
>=
IS NULL
IS NOT NULL
LIKE: 支持的通配符: %(任意長度的任意字符), _(任意單個字符)
RLIKE, REGEXP: 支持使用正則表達式
IN: 判斷指定字段的值是否在給定在列表中;
BETWEEN ... AND ...: 位于指定的范圍之間
組合條件測試:
NOT, !
AND, &&
OR, ||
聚合函數:
SUM(), AVG(), MAX(), MIN(), COUNT()
練習:導入hellodb.sql,以下操作在students表上執行
1、以ClassID分組,顯示每班的同學的人數;
2、以Gender分組,顯示其年齡之和;
3、以ClassID分組,顯示其平均年齡大于25的班級;
4、以Gender分組,顯示各組中年齡大于25的學員的年齡之和;
多表查詢及子句查詢
聯接查詢:事先將兩張或多張表join,根據join的結果進行查詢;
cross join: 交叉聯結
(a+b)(c+d+e)=
自然聯結:
等值聯結
條件比較
外聯結:
左外聯結:只保留出現在左外連接運算之前(左邊)的關系中的元組;
left_tb LEFT JOIN right_tb ON 連接條件
右外聯結:只保留出現在右外連接運算之后(右邊)的關系中的元組;
left_tb RIGHT JOIN right_tb ON 連接條件
全外聯結
自聯結:
別名:
表別名
字段別名
練習:導入hellodb.sql,完成以下題目:
1、顯示前5位同學的姓名、課程及成績;
2、顯示其成績高于80的同學的名稱及課程;
3、求前8位同學每位同學自己兩門課的平均成績,并按降序排列;
4、顯示每門課程課程名稱及學習了這門課的同學的個數;
思考:
1、如何顯示其年齡大于平均年齡的同學的名字?
2、如何顯示其學習的課程為第1、2,4或第7門課的同學的名字?
3、如何顯示其成員數最少為3個的班級的同學中年齡大于同班同學平均年齡的同學?
4、統計各班級中年齡大于全校同學平均年齡的同學。
子查詢
在查詢中嵌套的查詢
用于WHERE中的子查詢
1、用于比較表達式中的子查詢
子查詢的返回值只能有一個;
2、用于EXISTS中的子查詢
判斷存在與否
3、用于IN中的子查詢;
判斷存在于指定列表中
用于FROM中子查詢:
SELECT alias.col,... FROM (SELECT clause) AS alias WHERE condition
MySQL不擅長于子查詢:應該避免使用子查詢;
總結:MySQL的聯結查詢及子查詢
聯結:
交叉聯結
內聯結
外聯結
左外
右外
自聯結
子查詢:
用于WHERE中的子查詢
用于條件比較:子查詢只能一個值
用于IN:子查詢可以返回多個值
EXISTS:子查詢可以返回多個值
用于FROM子句的子查詢
MYSQL視圖(虛表)
存儲下來的select語句
創建:
create view 視圖名 as select語句
刪除:
drop view 視圖名