數據庫 之 基礎內容詳解

一、數據庫基礎概念

(一)字符集:

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):年份
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章