談談資料庫sql編寫

来源:https://www.cnblogs.com/lzfhope/archive/2019/12/24/12087846.html
-Advertisement-
Play Games

本文主要給初學者關於關係數庫的一個浮光掠影式的介紹,如果想深入理解,必須對於下文提到的每個內容單獨深入學習! 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語句,可能是學習不夠,也可能是資質問題!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一,從索引庫查找文件:locate 索引庫:操作系統會周期性的遍歷根文件系統,然後生成索引庫 手動更新索引庫: 語法: 只匹配basename: 統計出有多少個符合條件的文件: 使用基本正則表達式: 註意:構築索引,需要遍歷整個根文件系統,非常消耗資源。 二,直接從文件系統里查找:find 下麵寫道 ...
  • 在Linux系統中,如果一個進程以root許可權運行或者一個用戶以root用戶身份登錄,那麼它的許可權就不再有任何限制,因此如果一旦root許可權被黑客掌握,對於系統來說將會是一場災難,在這種情況下,文件系統保護將會成為系統的最後一道防線,合理的設置文件系統保護可以最大限度的降低攻擊對系統造成的破壞。 鎖 ...
  • 使用su進行用戶切換 管理員用戶切換至普通用戶: su [用戶名] 使用su命令從高級別用戶切換至低級別用戶無需輸入密碼 普通用戶切換至管理員用戶: 普通用戶切換至管理員用戶使用 su - 使用login進行用戶切換 使用login命令會退出當前用戶,重新進度登錄操作界面 ...
  • 查看80埠是否被占用,一般80埠多被apache服務占用。 netstat -anp|grep 80 2.修改apache服務的埠號 vim /etc/apache2/ports.conf 3.將埠號修改為8080 4.修改nginx服務配置 vim /etc/nginx/conf.d/ng ...
  • find /etc/ -name passwd ##查找/etc/下名稱中帶有passwd的文件 ...
  • linux是一個很能自動產生文件的系統,日誌、郵件、備份等。雖然現在硬碟廉價,我們可以有很多硬碟空間供這些文件浪費,讓系統定時清理一些不需要的文件很有一種爽快的事情。不用你去每天惦記著是否需要清理日誌,不用每天收到硬碟空間不足的報警簡訊,想好好休息的話,讓我們把這個事情交給機器定時去執行吧。 1.f ...
  • 配置httpd 預設虛擬主機 編輯hpptd的主配置文件 搜索httpd-vhost,把行首的#號刪除 保存主配置文件,然後編輯虛擬主機配置文件 重新編輯配置段(第一段為預設虛擬主機) ServerAdmin指定管理員郵箱 DocumentRoot為該虛擬主機站點的根目錄,網站的程式就在這個目錄下麵 ...
  • 恢復內容開始 創建資料庫 create database 資料庫名 切換資料庫 use 資料庫名 建表: create table 表名 ( 欄位名1,類型,約束 欄位名2,類型,約束 ... ) 約束: 1.主鍵約束 1)直接在建表時欄位類型後加 primary key 2)在表最後加 const ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...