1. 程式人生 > 其它 >MYSQL 基礎(一)

MYSQL 基礎(一)

MYSQL介紹

MySQL 是一種關係型資料庫,主要用於持久化儲存我們的系統中的一些資料比如使用者資訊。

由於 MySQL 是開源免費並且比較成熟的資料庫,因此,MySQL 被大量使用在各種系統中。任何人都可以在 GPL(General Public License) 的許可下下載並根據個性化的需要對其進行修改。MySQL 的預設埠號是3306。

概述

  • MySQL是一個開放原始碼的關係型資料庫管理系統,由瑞典MySQL AB(創始人Michael Widenius)公司1995年開發,迅速成為開源資料庫的 No.1。

  • 2008被Sun收購(10億美金),2009年Sun被Oracle收購。MariaDB

    應運而生。(MySQL 的創造者擔心 MySQL 有閉源的風險,因此建立了 MySQL 的分支專案 MariaDB)

  • MySQL6.x 版本之後分為社群版商業版

  • MySQL是一種關聯資料庫管理系統,將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

  • MySQL是開源的,所以你不需要支付額外的費用。

  • MySQL是可以定製的,採用了GPL(GNU General Public License)協議,你可以修改原始碼來開發自己的MySQL系統。

  • MySQL支援大型的資料庫。可以處理擁有上千萬條記錄的大型資料庫。

  • MySQL支援大型資料庫,支援5000萬條記錄的資料倉庫,32位系統表文件最大可支援4GB

    ,64位系統支援最大的表文件為8TB

  • MySQL使用標準的SQL資料語言形式。

  • MySQL可以允許運行於多個系統上,並且支援多種語言。這些程式語言包括C、C++、Python、Java、Perl、PHP和Ruby等。

RDBMS 與 非RDBMS

關係型資料庫(RDBMS)

實質

  • 這種型別的資料庫是最古老的資料庫型別,關係型資料庫模型是把複雜的資料結構歸結為簡單的二元關係(即二維表格形式)。

  • 關係型資料庫以行(row)列(column)的形式儲存資料,以便於使用者理解。這一系列的行和列被稱為表(table),一組表組成了一個庫(database)。

  • 表與表之間的資料記錄有關係(relationship)。現實世界中的各種實體以及實體之間的各種聯絡均用關係模型

    來表示。關係型資料庫,就是建立在關係模型基礎上的資料庫。

  • SQL 就是關係型資料庫的查詢語言。

優勢

  • 複雜查詢 可以用SQL語句方便的在一個表以及多個表之間做非常複雜的資料查詢。

  • 事務支援 使得對於安全效能很高的資料訪問要求得以實現。

非關係型資料庫(非RDBMS)

介紹

非關係型資料庫,可看成傳統關係型資料庫的功能閹割版本,基於鍵值對儲存資料,不需要經過SQL層的解析,效能非常高。同時,通過減少不常用的功能,進一步提高效能。

目前基本上大部分主流的非關係型資料庫都是免費的。

4.2.2 有哪些非關係型資料庫

相比於 SQL,NoSQL 泛指非關係型資料庫,包括了榜單上的鍵值型資料庫、文件型資料庫、搜尋引擎和列儲存等,除此以外還包括圖形資料庫。也只有用 NoSQL 一詞才能將這些技術囊括進來。

鍵值型資料庫

鍵值型資料庫通過 Key-Value 鍵值的方式來儲存資料,其中 Key 和 Value 可以是簡單的物件,也可以是複雜的物件。Key 作為唯一的識別符號,優點是查詢速度快,在這方面明顯優於關係型資料庫,缺點是無法像關係型資料庫一樣使用條件過濾(比如 WHERE),如果你不知道去哪裡找資料,就要遍歷所有的鍵,這就會消耗大量的計算。

鍵值型資料庫典型的使用場景是作為記憶體快取Redis是最流行的鍵值型資料庫。

文件型資料庫

此類資料庫可存放並獲取文件,可以是XML、JSON等格式。在資料庫中文件作為處理資訊的基本單位,一個文件就相當於一條記錄。文件資料庫所存放的文件,就相當於鍵值資料庫所存放的“值”。MongoDB 是最流行的文件型資料庫。此外,還有CouchDB等。

搜尋引擎資料庫

雖然關係型資料庫採用了索引提升檢索效率,但是針對全文索引效率卻較低。搜尋引擎資料庫是應用在搜尋引擎領域的資料儲存形式,由於搜尋引擎會爬取大量的資料,並以特定的格式進行儲存,這樣在檢索的時候才能保證效能最優。核心原理是“倒排索引”。

典型產品:Solr、Elasticsearch、Splunk 等。

列式資料庫

列式資料庫是相對於行式儲存的資料庫,Oracle、MySQL、SQL Server 等資料庫都是採用的行式儲存(Row-based),而列式資料庫是將資料按照列儲存到資料庫中,這樣做的好處是可以大量降低系統的 I/O,適合於分散式檔案系統,不足在於功能相對有限。典型產品:HBase等。

圖形資料庫

圖形資料庫,利用了圖這種資料結構儲存了實體(物件)之間的關係。圖形資料庫最典型的例子就是社交網路中人與人的關係,資料模型主要是以節點和邊(關係)來實現,特點在於能高效地解決複雜的關係問題。

圖形資料庫顧名思義,就是一種儲存圖形關係的資料庫。它利用了圖這種資料結構儲存了實體(物件)之間的關係。關係型資料用於儲存明確關係的資料,但對於複雜關係的資料儲存卻有些力不從心。如社交網路中人物之間的關係,如果用關係型資料庫則非常複雜,用圖形資料庫將非常簡單。典型產品:Neo4J、InfoGrid等。

NoSQL的演變

由於 SQL 一直稱霸 DBMS,因此許多人在思考是否有一種資料庫技術能遠離 SQL,於是 NoSQL 誕生了,但是隨著發展卻發現越來越離不開 SQL。到目前為止 NoSQL 陣營中的 DBMS 都會有實現類似 SQL 的功能。下面是“NoSQL”這個名詞在不同時期的詮釋,從這些釋義的變化中可以看出 NoSQL 功能的演變

1970:NoSQL = We have no SQL

1980:NoSQL = Know SQL

2000:NoSQL = No SQL!

2005:NoSQL = Not only SQL

2013:NoSQL = No, SQL!

NoSQL 對 SQL 做出了很好的補充,比如實際開發中,有很多業務需求,其實並不需要完整的關係型資料庫功能,非關係型資料庫的功能就足夠使用了。這種情況下,使用效能更高成本更低的非關係型資料庫當然是更明智的選擇。比如:日誌收集、排行榜、定時器等。

關係型資料庫設計規則

  • 關係型資料庫的典型資料結構就是資料表,這些資料表的組成都是結構化的(Structured)。

  • 將資料放到表中,表再放到庫中。

  • 一個數據庫中可以有多個表,每個表都有一個名字,用來標識自己。表名具有唯一性。

  • 表具有一些特性,這些特性定義了資料在表中如何儲存,類似Java和Python中 “類”的設計。

表、記錄、欄位

  • E-R(entity-relationship,實體-聯絡)模型中有三個主要概念是:實體集屬性聯絡集

  • 一個實體集(class)對應於資料庫中的一個表(table),一個實體(instance)則對應於資料庫表中的一行(row),也稱為一條記錄(record)。一個屬性(attribute)對應於資料庫表中的一列(column),也稱為一個欄位(field)。

ORM思想 (Object Relational Mapping)體現:
資料庫中的一個表 <---> Java或Python中的一個類
表中的一條資料 <---> 類中的一個物件(或實體)
表中的一個列 <----> 類中的一個欄位、屬性(field)

表的關聯關係

  • 表與表之間的資料記錄有關係(relationship)。現實世界中的各種實體以及實體之間的各種聯絡均用關係模型來表示。

  • 四種:一對一關聯、一對多關聯、多對多關聯、自我引用

一對一關聯(one-to-one)

  • 在實際的開發中應用不多,因為一對一可以建立成一張表。

  • 舉例:設計學生表:學號、姓名、手機號碼、班級、系別、身份證號碼、家庭住址、籍貫、緊急聯絡人、...

    • 拆為兩個表:兩個表的記錄是一一對應關係。

    • 基礎資訊表(常用資訊):學號、姓名、手機號碼、班級、系別

    • 檔案資訊表(不常用資訊):學號、身份證號碼、家庭住址、籍貫、緊急聯絡人、...

  • 兩種建表原則:

    • 外來鍵唯一:主表的主鍵和從表的外來鍵(唯一),形成主外來鍵關係,外來鍵唯一。

    • 外來鍵是主鍵:主表的主鍵和從表的主鍵,形成主外來鍵關係。

一對多關係(one-to-many)

  • 常見例項場景:客戶表和訂單表分類表和商品表部門表和員工表

  • 舉例:

    • 員工表:編號、姓名、...、所屬部門

    • 部門表:編號、名稱、簡介

  • 一對多建表原則:在從表(多方)建立一個欄位,欄位作為外來鍵指向主表(一方)的主鍵

多對多(many-to-many)

要表示多對多關係,必須建立第三個表,該表通常稱為聯接表,它將多對多關係劃分為兩個一對多關係。將這兩個表的主鍵都插入到第三個表中。

  • 舉例1:學生-課程

    • 學生資訊表:一行代表一個學生的資訊(學號、姓名、手機號碼、班級、系別...)

    • 課程資訊表:一行代表一個課程的資訊(課程編號、授課老師、簡介...)

    • 選課資訊表:一個學生可以選多門課,一門課可以被多個學生選擇

      學號   課程編號 
      1 1001
      2 1001
      1 1002
  • 舉例2:產品-訂單

    “訂單”表和“產品”表有一種多對多的關係,這種關係是通過與“訂單明細”表建立兩個一對多關係來定義的。一個訂單可以有多個產品,每個產品可以出現在多個訂單中。

    • 產品表:“產品”表中的每條記錄表示一個產品。

    • 訂單表:“訂單”表中的每條記錄表示一個訂單。

    • 訂單明細表:每個產品可以與“訂單”表中的多條記錄對應,即出現在多個訂單中。一個訂單可以與“產品”表中的多條記錄對應,即包含多個產品。

SQL 分類

SQL語言在功能上主要分為如下3大類:

  • DDL(Data Definition Languages、資料定義語言),這些語句定義了不同的資料庫、表、檢視、索引等資料庫物件,還可以用來建立、刪除、修改資料庫和資料表的結構。

    • 主要的語句關鍵字包括CREATEDROPALTER等。

  • DML(Data Manipulation Language、資料操作語言),用於新增、刪除、更新和查詢資料庫記錄,並檢查資料完整性。

    • 主要的語句關鍵字包括INSERTDELETEUPDATESELECT等。

    • SELECT是SQL語言的基礎,最為重要。

  • DCL(Data Control Language、資料控制語言),用於定義資料庫、表、欄位、使用者的訪問許可權和安全級別。

    • 主要的語句關鍵字包括GRANTREVOKECOMMITROLLBACKSAVEPOINT等。

  因為查詢語句使用的非常的頻繁,所以很多人把查詢語句單拎出來一類:DQL(資料查詢語言)。

  還有單獨將COMMITROLLBACK 取出來稱為TCL (Transaction Control Language,事務控制語言)。

SQL語言的規則與規範

基本規則

  • SQL 可以寫在一行或者多行。為了提高可讀性,各子句分行寫,必要時使用縮排

  • 每條命令以 ; 或 \g 或 \G 結束

  • 關鍵字不能被縮寫也不能分行

  • 關於標點符號

    • 必須保證所有的()、單引號、雙引號是成對結束的

    • 必須使用英文狀態下的半形輸入方式

    • 字串型和日期時間型別的資料可以使用單引號(' ')表示

    • 列的別名,儘量使用雙引號(" "),而且不建議省略as

SQL大小寫規範 (建議遵守)

  • MySQL 在 Windows 環境下是大小寫不敏感的

  • MySQL 在 Linux 環境下是大小寫敏感的

    • 資料庫名、表名、表的別名、變數名是嚴格區分大小寫的

    • 關鍵字、函式名、列名(或欄位名)、列的別名(欄位的別名) 是忽略大小寫的。

  • 推薦採用統一的書寫規範:

    • 資料庫名、表名、表別名、欄位名、欄位別名等都小寫

    • SQL 關鍵字、函式名、繫結變數等都大寫

基本的SELECT語句

3.0 SELECT...

SELECT 1; #沒有任何子句
SELECT 9/2; #沒有任何子句

SELECT ... FROM

  • 語法:

SELECT  標識選擇哪些列
FROM 標識從哪個表中選擇
  • 選擇全部列:

SELECT *
FROM departments;

一般情況下,除非需要使用表中所有的欄位資料,最好不要使用萬用字元‘*’。使用萬用字元雖然可以節省輸入查詢語句的時間,但是獲取不需要的列資料通常會降低查詢和所使用的應用程式的效率。萬用字元的優勢是,當不知道所需要的列的名稱時,可以通過它獲取它們。

在生產環境下,不推薦你直接使用SELECT *進行查詢。

  • 選擇特定的列:

SELECT department_id, location_id
FROM departments;

在SELECT語句中使用關鍵字DISTINCT去除重複行

SELECT DISTINCT department_id
FROM employees;

顯示錶結構

使用DESCRIBE 或 DESC 命令,表示表結構。

DESCRIBE employees;

DESC employees;

過濾資料

  • 背景:

  • 語法:

    SELECT 欄位1,欄位2
    FROM 表名
    WHERE 過濾條件
    • 使用WHERE 子句,將不滿足條件的行過濾掉

    • WHERE子句緊隨 FROM子句


課後練習:

# 1.查詢員工12個月的工資總和,並起別名為ANNUAL SALARY

# 2.查詢employees表中去除重複的job_id以後的資料

# 3.查詢工資大於8000的員工姓名和工資

# 4.查詢員工號為106的員工的姓名和部門號

# 5.顯示錶 depart 的結構,並查詢其中的全部資料

本文來自部落格園,作者:宗神一,轉載請註明原文連結:https://www.cnblogs.com/zhangmuchen/p/15775591.html