本文主要給初學者關於關係數庫的一個浮光掠影式的介紹,如果想深入理解,必須對於下文提到的每個內容單獨深入學習! it-information technology的簡稱,中文是信息機技術,信息其實就是數據。 要處理數據,則至少涉及到幾個方面: 1)表達 2)存取 3)計算 4)安全 當然還是其它方面! ...
本文主要給初學者關於關係數庫的一個浮光掠影式的介紹,如果想深入理解,必須對於下文提到的每個內容單獨深入學習!
it-information technology的簡稱,中文是信息機技術,信息其實就是數據。
要處理數據,則至少涉及到幾個方面:
1)表達
2)存取
3)計算
4)安全
當然還是其它方面!
其中第二點就是資料庫的核心任務。
一個工業級的產品遠遠不是這個,還有:
1)網路
2)併發
3)性能
4) 編程
5)安全(包括數據加密+和存取許可權等)
6)備份/恢復
7)高可靠
8)相容
等等,每一個都是可以深入研究的!
隨著資料庫的發展,資料庫越來越自治(優化、高可靠等等),對於普通的dba而言,比以前輕鬆了不少。
對於大部分的程式員來說,必須和資料庫做交互,無論是後端還是前端
本文闡述的是傳統關係資料庫,重點闡述幾點:
1)安裝
2)備份恢復
3)編程(sql)
這些都是非常基礎的,屬於程式員必須掌握的基本技能!
一、安裝
程式員的最基本要求,不會裝那麼就沒有什麼可說!具體略,要強調的是,應該要回安裝各個操作系統,此外會安裝集群版本!
安裝的基本步驟:
1.確認功能範圍
2.確認是免費還是付費
3.下載安裝包
4.安裝
5配置
6.創建有關管理員賬號
7.配置網路和安全
二、備份恢復
冷備份可不要求,專業不備份也不要求,但至少要求會邏輯備份和恢復!
oracle,要懂得expdp/impdp,mysql要懂得mysqldump,sqlserver要懂得bcp等。
三、編程
要熟悉sql語句,則必須瞭解幾個基本的內容:
1.關係資料庫概念
2.數據存儲原理,不同rdbms的存儲方式不一樣,所以學新的一種,就必須瞭解特定一種的存儲方式
3.sql語言
4.sql-iso標準和不同廠家的實現
1,2,3是必須掌握的,缺少一個,都難於編寫合格的sql語句!
此外,許多概念也需要掌握:範式、索引、分區、視圖、元數據、鎖、緩存、基本的演算法(FIFO,LRU等等)、分散式資料庫等等。
本文就Mysql8.x和oracle 12c的進行舉例!
3.1 關係資料庫概念
重點是“關係”,或者可以理解為表格,可以有多個列和行。
不同於kv模式資料庫,也不同於基於hdfs的大數據,更不同於現在所謂的區塊鏈資料庫!
關係資料庫關鍵要滿足acid:
a:原子性,事務要麼完成,要麼不完成
c:一致性,關聯數據應該符合商業邏輯,事務前後必須保持數據的完整性。理解上可以參考能量守恆定律,個人財務收支!
i:隔離性,一個事務不影響另外一個事務,可以簡單理解事務互不影響
d:持久性,就是數據據要落地,並存儲在特定介質上,不能總是帶電狀態下才有!
ad容易理解,但ic不那麼容易,需要閱讀較多文檔才能深刻體會!
註意:關係資料庫都遵循acid,但不同產品的實現方式可以不一,表現上也有差異!
3.2數據存儲
數據怎麼存,是相當複雜的事情,因為這影響了許多方面:
1.性能
2.安全和備份
3.數據表現
例如:oracle12c
mysql-innodb
其實存儲和性能的關係,可以聯想圖書館找書,城市規劃等場景,這就是我們常說的“大道相通",或者是理論來自於實踐!
書本怎麼放才能更快找到,更節省空間,更加安全等等?
城市交通應該怎麼規劃,才能達到最大的容量,同時又能夠有益於大部分人?
資料庫物理和邏輯存儲的設計對於提高系統性能是相當之關鍵,是相對比較複雜的。
看看mysql和oracle的create table語句,就可以i體會到存儲是重要的,需要學習的內容是很多的。
oracle:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/CREATE-TABLE.html#GUID-F9CE0CC3-13AE-4744-A43C-EAC7A71AAAB6
mysql: https://dev.mysql.com/doc/refman/8.0/en/create-table.html
把這個命令貼一些出來,估計看了頭皮一緊:
mysql:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options] [partition_options] CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [partition_options] [IGNORE | REPLACE] [AS] query_expression CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) } create_definition: col_name column_definition | {INDEX|KEY} [index_name] [index_type] (key_part,...) [index_option] ... | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (key_part,...) [index_option] ... | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (key_part,...) [index_option] ... | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (key_part,...) [index_option] ... | [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (col_name,...) reference_definition | check_constraint_definition column_definition: data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)} ] [AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY] [COMMENT 'string'] [COLLATE collation_name] [COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}] [STORAGE {DISK|MEMORY}] [reference_definition] [check_constraint_definition] | data_type [COLLATE collation_name] [GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED] [NOT NULL | NULL] [UNIQUE [KEY]] [[PRIMARY] KEY] [COMMENT 'string'] [reference_definition] [check_constraint_definition] data_type: (see Chapter 11, Data Types) key_part: {col_name [(length)] | (expr)} [ASC | DESC] index_type: USING {BTREE | HASH} index_option: KEY_BLOCK_SIZE [=] value | index_type | WITH PARSER parser_name | COMMENT 'string' | {VISIBLE | INVISIBLE} check_constraint_definition: [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED] reference_definition: REFERENCES tbl_name (key_part,...) [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT table_options: table_option [[,] table_option] ... table_option: AUTO_INCREMENT [=] value | AVG_ROW_LENGTH [=] value | [DEFAULT] CHARACTER SET [=] charset_name | CHECKSUM [=] {0 | 1} | [DEFAULT] COLLATE [=] collation_name | COMMENT [=] 'string' | COMPRESSION [=] {'ZLIB'|'LZ4'|'NONE'} | CONNECTION [=] 'connect_string' | {DATA|INDEX} DIRECTORY [=] 'absolute path to directory' | DELAY_KEY_WRITE [=] {0 | 1} | ENCRYPTION [=] {'Y' | 'N'} | ENGINE [=] engine_name | 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} | STATS_AUTO_RECALC [=] {DEFAULT|0|1} | STATS_PERSISTENT [=] {DEFAULT|0|1} | STATS_SAMPLE_PAGES [=] value | TABLESPACE tablespace_name [STORAGE {DISK|MEMORY}] | UNION [=] (tbl_name[,tbl_name]...) partition_options: PARTITION BY { [LINEAR] HASH(expr) | [LINEAR] KEY [ALGORITHM={1|2}] (column_list) | RANGE{(expr) | COLUMNS(column_list)} | LIST{(expr) | COLUMNS(column_list)} } [PARTITIONS num] [SUBPARTITION BY { [LINEAR] HASH(expr) | [LINEAR] KEY [ALGORITHM={1|2}] (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 [=] 'string' ] [DATA DIRECTORY [=] 'data_dir'] [INDEX DIRECTORY [=] 'index_dir'] [MAX_ROWS [=] max_number_of_rows] [MIN_ROWS [=] min_number_of_rows] [TABLESPACE [=] tablespace_name] [(subpartition_definition [, subpartition_definition] ...)] subpartition_definition: SUBPARTITION logical_name [[STORAGE] ENGINE [=] engine_name] [COMMENT [=] 'string' ] [DATA DIRECTORY [=] 'data_dir'] [INDEX DIRECTORY [=] 'index_dir'] [MAX_ROWS [=] max_number_of_rows] [MIN_ROWS [=] min_number_of_rows] [TABLESPACE [=] tablespace_name] query_expression: SELECT ... (Some valid select or union statement)
順便說下:如果英文不過關,那麼學好電腦還是有一定難度的!畢竟許多資料是英文的!
3.3 sql語句
標準sql語句,尤其是ddl,dml語句談不上複雜,準確說,應該是相對很簡單的。
如果有什麼稍微難一些的就是 集合運算,譬如 inner join ,left join,full join,但也很容易理解!
總結
要寫好sql語句,需要長時間訓練,從資料庫基礎開始,到熟練寫出每個sql語句!
學習之後,寫不出每個sql語句,屬於資質問題;寫不出好的sql語句,可能是學習不夠,也可能是資質問題!