文章目錄
一、數據庫基礎概念
(一)字符集:
Mariadb默認安裝的字符集是latin1
big5 繁體漢字
gb2312 簡體中文
utf-8國際語言
(二)字符集/序:
每種字符集都有多種字符序:通常影響查詢時的大小寫情況;
1.字符序常見結尾如下:
_bin(表示用編碼值進行比較)
_ci(cs) 是否區分大小寫,ci不區分,cs區分
如下後綴參考自:https://zhidao.baidu.com/question/561235824256928284.html
_stroke 按筆劃排序
_ai(as) 是否區分重音,ai不區分,as區分
_ki(ks) 是否區分假名類型,ki不區分,ks區分
_wi(ws) 是否區分全半角,wi不區分,ws區分
示例:
例如 mysql 數據的字符序設置是 utf8_ci 這種 ,在執行查詢語句時 會自動過濾大小寫
select * from issue_messagewherecontent =‘Yes’
select * from issue_messagewherecontent =‘yes’
這2句SQL 語句的查詢結果 完全一樣
但是如果 字符序 改爲 utf8_cs, 同樣執行上述2句SQL 結果不一樣
2.查看數據庫支持的字符序:
#Defalt =yes 表示數據庫默認的字符序
MariaDB [(none)]> show collation;
指定數據庫創建使用的默認語言字符集:
MariaDB [(none)]> create database test3 character set utf8mb4;
MariaDB [(none)]> show create database test3;
3.庫字符集配置文件路徑:
每個庫會建立單獨的文件夾;
指定字符集創建的庫在mysql目錄中生成一個db.opt文件,該文件內容很簡單,是用來記錄該庫的默認字符集編碼和字符集排序規則用的。如果你創建數據庫指定默認字符集和排序規則,那麼後續創建的表如果沒有指定字符集和排序規則,那麼該新建的表將採用db.opt文件中指定的屬性。
注意: 修改字符集適合空庫,已有數據的庫變更字符集可能會出現亂碼問題
數據類型:
(三)mysql客戶端連接數據庫常用選項:
1.連接數據庫
[root@CentOS7 ~]#mysql -u root -h localhost -p
mysql客戶端可用選項:
-u, --user= 用戶名,默認爲root
-h, --host= 服務器主機,默認爲localhost
-p, --passowrd= 用戶密碼,建議使用-p,默認爲空密碼
-P, --port= 服務器端口
-S, --socket= 指定連接socket文件路徑
-D, --database= 指定默認數據庫
-e “SQL“ 執行SQL命令
--print-defaults 獲取程序默認使用的配置
數據庫服務器端服務監聽方式:
本地方式:unix sock: 監聽在sock文件上,僅支持本機連接通信(/var/lib/mysql/mysql.sock)
網絡方式:ip socket: 默認監聽在tcp的3306端口,支持遠程連接通信
2.mysqladmin工具
#查看幫助
[root@CentOS7 ~]#mysqladmin -help
#修改mysql數據庫賬戶密碼
[root@CentOS7 ~]#mysqladmin -uroot -p password
Enter password:
New password:
Confirm new password
#查看mysql服務是否正常
[root@CentOS7 ~]#mysqladmin -uroot -pmagedu ping
#創建數據庫
[root@CentOS7 ~]#mysqladmin -uroot -p create testdb
#刪除數據庫
[root@CentOS7 ~]#mysqladmin -uroot -p drop testdb
#關閉數據庫
[root@CentOS7 ~]#mysqladmin -uroot -p shutdown
3.mysql配置文件:
/etc/my.cnf #Global選項
/etc/mysql/my.cnf #Global選項
SYSCONFDIR/my.cnf #Global選項
$MYSQL_HOME/my.cnf #Server-specific 選項
--defaults-extra-file=path
~/.my.cnf #User-specific 選項
二、SQL語句
(一)規範:
1.在數據庫系統中,SQL語句不區分大小寫(建議用大寫)
2.SQL語句可單行或多行書寫,以“;”結尾
3.關鍵詞不能跨多行或簡寫
4.用空格和縮進來提高語句的可讀性
5.子句通常位於獨立行,便於編輯,提高可讀性
(二)分類:
- DDL:CREATE,DROP,ALTER
- DML:INSERT,DELETE,UPDATE
- DCL:GRANT,REVOKE,COMMIT,ROLLBACK
- DQL:SELECT
(三)數據庫的組件(對象):
- 庫
- 表
- 索引
- 視圖
- 存儲函數
- 存儲過程
- 觸發器
(四)關係運算
- 選擇:挑選行
- 投影:挑選列
- 連接:表連接,主鍵外鍵
(五)數據模型:
1.數據抽象:
- 物理層:數據存儲格式:RAID、邏輯卷、分區,運維關心的層;與存儲引擎相關
- 邏輯層:數據間的關係
- 視圖層:展現希望給用戶的數據
2.關係模型:
- 關係模型:
- 基於對象關係型:ORM,面向關係與面向對象關係:把面向關係的數據庫和麪向對象的語言結合,不用寫sql語句
- 半結構化關係模型:XML、json
三、庫
1.創建庫:
MariaDB [(none)]> create database if not exists test2;
2.修改庫:
(1).修改庫的字符集(注:空庫)
MariaDB [(none)]> alter database db_test3 character set utf8mb4;
3.刪除庫:
MariaDB [(none)]> drop database if exists db_test3;
4.查看庫:
#查看庫列表
MariaDB [(none)]> show databases;
#查看支持字符集
MariaDB [(none)]> show character set;
#查看排序規則
MariaDB [(none)]> show collation;
5.使用庫:
MariaDB [(none)]> use test3
四、 表
1.語法:
1.創建表:
方式一:直接創建新表
CREATE TABLE [IF NOT EXISTS] ‘tbl_name’ (字段信息1,字段信息2, ... 表選項...)
字段信息
•col1 type1
•PRIMARY KEY(col1,...)
•INDEX(col1, ...)
•UNIQUE KEY(col1, ...)
表選項:
•ENGINE [=] engine_name
SHOW ENGINES;查看支持的engine類型
•ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
方式二:查詢現存表創建;新表會被直接插入查詢而來的數據
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options]
[partition_options] select_statement
方式三:複製現存的表的表結構創建,但不復制數據
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }
MariaDB [test3]> help create table
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
Or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
[partition_options]
select_statement
Or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
create_definition:
col_name column_definition
#設置主鍵
| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
[index_option] ...
#設置索引
| {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
[index_option] ...
#設置唯一鍵(索引)表示唯一的,不允許重複的索引,該字段信息保證不會重複
| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (index_col_name,...)
[index_option] ...
#FULLTEX:全文索引:檢索數據量較大時,先將數據放入一個沒有全局索引的表中,然後在用Create Index創建的Full Text索引,比先爲一張表建立FullText然後在寫入數據要快
#SPATIAL:空間索引:是對空間數據類型的字段建立的索引,MYSQL中的空間數據類型有4種,分別是GEOMETRY、POINT、LINESTRING、POLYGON。
#MYSQL使用SPATIAL關鍵字進行擴展,使得能夠用於創建正規索引類型的語法創建空間索引。創建空間索引的列,必須將其聲明爲NOT NULL,空間索引只能在MYISAM存儲引擎的表中創建
#引用自:https://blog.csdn.net/guo_qiangqiang/article/details/88794971
| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
[index_option] ...
#設置外鍵
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name,...) reference_definition
#CHECK 約束用於限制列中的值的範圍。
#如果對單個列定義 CHECK 約束,那麼該列只允許特定的值。
#如果對一個表定義 CHECK 約束,那麼此約束會在特定的列中對值進行限制
| CHECK (expr)
column_definition: #列定義
#數據類型 是否允許爲空 默認值
data_type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT] 列值自增 [UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT 'string'] #表的註釋,最大長度爲60 個字符
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
[STORAGE {DISK|MEMORY|DEFAULT}]
[reference_definition]
data_type: #數據類型
BIT[(length)]
| TINYINT[(length)] [UNSIGNED] [ZEROFILL]
| SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
| MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
| INT[(length)] [UNSIGNED] [ZEROFILL]
| INTEGER[(length)] [UNSIGNED] [ZEROFILL]
| BIGINT[(length)] [UNSIGNED] [ZEROFILL]
| REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
| DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
| FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
| DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
| NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]
| DATE
| TIME
| TIMESTAMP
| DATETIME
| YEAR
| CHAR[(length)]
[CHARACTER SET charset_name] [COLLATE collation_name]
| VARCHAR(length)
[CHARACTER SET charset_name] [COLLATE collation_name]
| BINARY[(length)]
| VARBINARY(length)
| TINYBLOB
| BLOB
| MEDIUMBLOB
| LONGBLOB
| TINYTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| TEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| MEDIUMTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| LONGTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| ENUM(value1,value2,value3,...)
[CHARACTER SET charset_name] [COLLATE collation_name]
| SET(value1,value2,value3,...)
[CHARACTER SET charset_name] [COLLATE collation_name]
| spatial_type
index_col_name:
col_name [(length)] [ASC | DESC]
index_type: #索引類型
USING {BTREE | HASH} #btree、hash類型
index_option: #索引選項
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
#REFERENCES:對象權限
#ON UPDATE CASCADE 表示當父表更新時,子表也級聯更新。
#ON DELETE CASCADE 表示當父表刪除時,子表也級聯刪除
reference_definition: #引用定義
REFERENCES tbl_name (index_col_name,...)
[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
[ON DELETE reference_option]
[ON UPDATE reference_option]
#在定義外鍵關係時,父表的更新(或者刪除)動作,可級聯子表操作有如下四種定義方式:
#RESTRICT,表示父表列值被保護(限制更改,不能有任何動作,效果和NO ACTION一致,其實就是NO #ACTION的別名)。也是外鍵級聯操作的默認行爲。
#CASCADE,表示子表列值隨父表一起變化(更新也一起更新,刪除也一起刪除)。注意,子表上級聯更改的列,不會激活觸發器。
#SET NULL,表示父表列值被更改時,關聯的子表列值置空(前提是子表該列屬性可爲NULL)。
#NO ACTION,表示父表列值被保護(阻止更改,不能有任何動作)。
#對於非innodb表,還有一個方式是:SET DEFAULT,但是innodb表,該定義不合法。
#引用自:https://blog.csdn.net/q3dxdx/article/details/51005098
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION
table_options: #表選項
table_option [[,] table_option] ...
table_option: #表選項
ENGINE [=] engine_name
| AUTO_INCREMENT [=] value
| AVG_ROW_LENGTH [=] value
| [DEFAULT] CHARACTER SET [=] charset_name
| CHECKSUM [=] {0 | 1}
| [DEFAULT] COLLATE [=] collation_name
| COMMENT [=] 'string'
| CONNECTION [=] 'connect_string'
| DATA DIRECTORY [=] 'absolute path to directory'
| DELAY_KEY_WRITE [=] {0 | 1}
| INDEX DIRECTORY [=] 'absolute path to directory'
| INSERT_METHOD [=] { NO | FIRST | LAST }
| KEY_BLOCK_SIZE [=] value
| MAX_ROWS [=] value
| MIN_ROWS [=] value
| PACK_KEYS [=] {0 | 1 | DEFAULT}
| PASSWORD [=] 'string'
| ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
| TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]
| UNION [=] (tbl_name[,tbl_name]...)
partition_options: #分區選項
PARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY(column_list)
| RANGE{(expr) | COLUMNS(column_list)}
| LIST{(expr) | COLUMNS(column_list)} }
[PARTITIONS num]
[SUBPARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY(column_list) }
[SUBPARTITIONS num]
]
[(partition_definition [, partition_definition] ...)]
partition_definition: #分區定義
PARTITION partition_name
[VALUES
{LESS THAN {(expr | value_list) | MAXVALUE}
|
IN (value_list)}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'comment_text' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
[NODEGROUP [=] node_group_id]
[(subpartition_definition [, subpartition_definition] ...)] #子分區
subpartition_definition: #子分區定義
SUBPARTITION logical_name
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'comment_text' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
[NODEGROUP [=] node_group_id]
select_statement: #可選項
[IGNORE | REPLACE] [AS] SELECT ... (Some valid select statement)
2.刪除表
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT | CASCADE]
3.修改表
MariaDB [test3]> help alter table
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
alter_specification:
table_options
| ADD [COLUMN] col_name column_definition #添加列字段
[FIRST | AFTER col_name ] #first表示添加到第一列;
| ADD [COLUMN] (col_name column_definition,...) #添加多列
| ADD {INDEX|KEY} [index_name] #添加索引
[index_type] (index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] PRIMARY KEY #添加主鍵
[index_type] (index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] #添加唯一鍵
UNIQUE [INDEX|KEY] [index_name]
[index_type] (index_col_name,...) [index_option] ...
| ADD FULLTEXT [INDEX|KEY] [index_name] #添加全文索引
(index_col_name,...) [index_option] ...
| ADD SPATIAL [INDEX|KEY] [index_name] #添加空間索引
(index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] #添加外鍵
FOREIGN KEY [index_name] (index_col_name,...)
reference_definition
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} #修改默認值
| CHANGE [COLUMN] old_col_name new_col_name column_definition
[FIRST|AFTER col_name] #修改字段名
| MODIFY [COLUMN] col_name column_definition #修改字段屬性
[FIRST | AFTER col_name]
| DROP [COLUMN] col_name #刪除列
| DROP PRIMARY KEY #刪除主鍵
| DROP {INDEX|KEY} index_name #刪除索引
| DROP FOREIGN KEY fk_symbol #刪除外鍵
| MAX_ROWS = rows #最大行
| DISABLE KEYS #禁用鍵
| ENABLE KEYS #啓用鍵
| RENAME [TO|AS] new_tbl_name #重命名錶名
| ORDER BY col_name [, col_name] ... #分組
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
| DISCARD TABLESPACE #放棄表空間
| IMPORT TABLESPACE #導入表空間
| FORCE #強制
| ADD PARTITION (partition_definition) #添加分區
| DROP PARTITION partition_names #刪除分區
| TRUNCATE PARTITION {partition_names | ALL} #截斷分區
| COALESCE PARTITION number #合併分區
| REORGANIZE PARTITION [partition_names INTO (partition_definitions)] #重組分區
| ANALYZE PARTITION {partition_names | ALL} #分析分區
| CHECK PARTITION {partition_names | ALL} #檢測分區
| OPTIMIZE PARTITION {partition_names | ALL} #優化分區
| REBUILD PARTITION {partition_names | ALL} #重建分區
| REPAIR PARTITION {partition_names | ALL} #修復分區
| PARTITION BY partitioning_expression #分區
| REMOVE PARTITIONING #移除分區
index_col_name:
col_name [(length)] [ASC | DESC]
index_type: #修改索引類型
USING {BTREE | HASH}
index_option: #索引選項
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
table_options:
table_option [[,] table_option] ... (see CREATE TABLE options)
partition_options:
(see CREATE TABLE options)
2.創建表:
#方式一創建表
MariaDB [test3]> create table if not exists tb_student (id char(13) primary key,name varchar(20),sex enum('F','M'));
#方式二創建表
MariaDB [test3]> create table if not exists tb_teacher select * from hellodb.classes;
#方式按創建表
MariaDB [test3]> create table if not exists tb_teachers like hellodb.teachers;
3.查看錶:
#查看錶列表
MariaDB [test3]> show tables;
#查看錶創建
MariaDB [test3]> show create table tb_student;
#查看所有引擎
MariaDB [test3]> show engines;
#查看錶結構
MariaDB [test3]> desc tb_teachers;
MariaDB [test3]> show columns from tb_teachers;
#查看庫中表狀態
MariaDB [test3]> show table status from hellodb;
方式二創建表:
方式三創建表:
4.刪除表
MariaDB [test3]> drop table if exists tb_teachers;
五、數據類型:
(一)數值型
1.整型
- tinyint(m) 1個字節 範圍(-128~127)
- smallint(m) 2個字節 範圍(-32768~32767)
- mediumint(m) 3個字節 範圍(-8388608~8388607)
- int(m) 4個字節 範圍(-2147483648~2147483647)
- bigint(m) 8個字節 範圍(±9.22*10的18次方)
加了unsigned,則最大值翻倍,如:tinyint unsigned的取值範圍爲(0~255)
2.浮點型(float和double),近似值
- float(m,d) 單精度浮點型 8位精度(4字節) m總個數,d小數位
- double(m,d) 雙精度浮點型16位精度(8字節) m總個數,d小數位
3.定點數
- decimal(m,d) 參數m<65 是總個數,d<30且 d<m 是小數位
- 在數據庫中存放的是精確值,存爲十進制
- MySQL5.0和更高版本將數字打包保存到一個二進制字符串中(每4個字節存9個數字)。例如,decimal(18,9)小數點兩邊將各存儲9個數字,一共使用9個字節:小數點前的數字用4個字節,小數點後的數字用4個字節,小數點本身佔1個字節
- 浮點類型在存儲同樣範圍的值時,通常比decimal使用更少的空間。float使用4個字節存儲。double佔用8個字節
- 因爲需要額外的空間和計算開銷,所以應該儘量只在對小數進行精確計算時才使用decimal——例如存儲財務數據。但在數據量比較大的時候,可以考慮使用bigint代替decimal
(二)字符串(char,varchar,_text)
1.定長字符串
- char(n) 固定長度,最多255個字符
2.變長字符串
- varchar(n) 可變長度,最多65535個字符
3.text
- tinytext 可變長度,最多255個字符
- text 可變長度,最多65535個字符
- mediumtext 可變長度,最多2的24次方-1個字符
- longtext 可變長度,最多2的32次方-1個字符
- BINARY(M) 固定長度,可存二進制或字符,長度爲0-M字節
- VARBINARY(M) 可變長度,可存二進制或字符,允許長度爲0-M字節
- 內建類型:ENUM枚舉, SET集合
二進制數據:BLOB
- BLOB和text存儲方式不同,TEXT以文本方式存儲,英文存儲區分大小寫,而Blob是以二進制方式存儲,不分大小寫
- BLOB存儲的數據只能整體讀出
- TEXT可以指定字符集,BLOB不用指定字符集
(三) 日期時間類型
- date 日期 ‘2008-12-2’
- time 時間 ‘12:25:36’
- datetime 日期時間 ‘2008-12-2 22:06:44’
- timestamp 自動存儲記錄修改時間
- YEAR(2), YEAR(4):年份