SQL 基礎知識掃盲

資料庫工作筆記發表於2023-03-16


作者 | 文正耕耘(ID:dywangk


此篇總結是對之前發出的 SQL是什麼 進行補充。
進入正題之前,我想聊聊其它的知識點,一點點思考。
學習某個技能點或者是新知識點時,可以嘗試建立一項知識梳理體系,如下:

  1. 輸入:可以照葫蘆畫瓢,親自動手實踐。
  2. 分析:有自己獨立的分析和思考。
  3. 輸出:產出的內容與預期進行對比。
  4. 札記:記錄收穫過程(手寫或者以電子文件形式記錄)。

這張流程圖製作比較粗糙,權當梳理基本知識參考。
上面也談到了,學習新知識點。善於總結,可以使用流程圖或者思維導圖構建知識體系。
         
SQL 基礎知識掃盲
         
         
01
SQL & 資料庫
基礎知識掃盲
           
一般而言,在日常工作交流中,大家所描述的SQL是標準SQL(Standardized SQL),非特指某一資料庫廠商(DBMS)專有語言。
           
02
    SQL是什麼?

SQL必知必會這樣描述到:
SQL(發音為字母S-Q-L或sequel)是Structure Query Language(結構化查詢語言)的縮寫。SQL是一種專業用於與資料庫溝通互動的語言。
與其他語言(比如英語或者Java、C、PHP這類程式語言)不一樣,SQL中只有很少的詞,這是有意而為。設計SQL的目的是便於完成一項任務,提供一種從資料庫中讀寫資料的簡單有效方法
用一句話總結:SQL是Structure Query Language(結構化查詢語言)。
             
維基百科這樣描述到:


全稱是Structure Query Language(結構化查詢語言)是一種特定目的程式語言,一般簡稱為SQL。



用於管理關聯式資料庫管理系統(RDBMS)。它是使用關係模型的資料庫應用語言,由IBM在20世紀70年代開發出來,作為IBM資料庫System R的原型關係語言,實現資料庫中資訊檢索。




20世紀80年代初,美國國家標準學會(ANSI)開始著手定製SQL標準。最早的ANSI始於1986年,被稱為SQL-86,在1987年成為國際標準化組織(ISO)標準。儘管SQL並非完全按照科德的關係模型設計,但其依然成為最為廣泛運用的資料庫語言。此後,這一標準經過了一系列的增訂,加入了大量新特性。雖然有這一標準的存在,但大部分的SQL程式碼在不同的資料庫系統中並不具有完全的跨平臺性。


               
用我自己的經驗總結概括:其實是將資料有規律地存放在特定容器中的一種結構化查詢語言。
             
SQL有哪些優點呢

  1. SQL不是某一特定資料庫廠商專有語言。絕大多數流行的DBMS支援SQL,所以學習標準SQL可以讓你和大多數資料庫打交道。
  2. SQL簡單易學。它的語句是有很強描述性的英語單片語成,而這些單詞數目不多。
  3. SQL看上去(入門)很簡單,實際上是一種強有力的語言,靈活使用其語言元素,可以進行非常複雜和高階的資料庫操作。

             
SQL擴充套件說明:許多DBMS廠商透過增加語句或指令,對SQL進行擴充套件,目的是提供執行特定操作的額外功能或簡化方法。雖然這種擴充套件使用很便捷,但一般情況是針對個別DBMS,很少有兩個廠商同時支援這種擴充套件。列舉兩個例子,比如Oracle分頁可以使用rownum實現,而MySQL分頁使用limit關鍵字。
             

03

   資料庫是什麼?


資料庫
資料庫(database):儲存有組織資料的容器,通常是一個檔案或一組檔案。
tips:通常說資料庫指關係型資料庫(RDBMS)。
注意混淆平時工作交流,大家通常用資料庫這個術語來代表使用的資料軟體,這種表述不完全正確,因此產生了許多混淆。確切地說,資料庫軟體指資料庫管理系統(DBMS) 。資料庫是透過DBMS建立和操作的容器,它具體是什麼,形式如何,各種資料庫有所差異。這種差異表現在:各大資料庫廠商基於標準SQL進行各自的擴充套件。
簡易說明              
在MySQL中建立資料庫語法:
create database db_name。而在Oracle資料庫中建立資料庫語法create user db_name,你沒看錯,Oracle中基於使用者進行描述與管理。如果你在Oracle中使用create database db_name,會提示資料庫已裝載。
             
表(table):某種特定型別資料庫結構化清單。
             
表名
表名(table name):表名是唯一的(不可重複),實際上是資料庫名和表名等的組合,資料庫名理解為使用者會容易接受一點。有的資料庫使用資料庫擁有者的名字作為唯一名的一部分,例如Oracle、達夢資料庫。在同一個資料中不能使用相同的表名,但在不同的資料庫中可以使用相同的表名。
             
模式
模式:關於資料庫和表的佈局及特性的資訊。
             
列(column):表中的一個欄位。所有表由一個列或多列組成。
資料分解:合理將資料分解為多個列尤為重要。例如:城市、州、郵政編碼總是彼此獨立的列。透過分解這些資料,才有可能利用特定的列對資料進行分類和過濾(比如找出特定州或城市的所有顧客)。如果城市和州組合到一個列中,則按州分類或過濾會很困難。
當然,你可以根據自己的需求將資料分解到何種程度。例如,一般可以將街道名和門牌號一起儲存到地址裡,沒有特殊需求是可以這樣處理。如果那一天,需求發生變化,根據門牌號進行排序或過濾,最好將門牌號和街道名分開。
             
資料型別
資料型別:允許哪一種資料型別。每一張表中列具有相應資料型別,限制(或允許)該列中儲存哪一種型別的資料。
             
行(row):表中列一條或多條記錄。
             
主鍵
主鍵(primary key):一列(或幾列),其值可以唯一標識表中每一行。
定義主鍵:或許並不總是需要主鍵,達到便於管理目的,大多數資料設計者會保證他們建立的每張表具有一個主鍵。
             
外來鍵
外來鍵(foreign key):用來保證參照完整性,通常在兩張或多張表中存在。如果有兩張表:主表(parent table)和子表(child table),在子表中擁有主表外來鍵約束;你想同時刪除兩張表;MySQL提示需要先刪除約束,才能徹底刪除。也有例外,比如設定了級聯(cascade)。
             
理論知識看得再多,不如親自實踐一遍,效果來得更快
             

04
挺身入局,實踐出真知

選擇
1.選擇:選擇一種流行社群活躍DBMS廠商發行版資料庫軟體進行入門。
2.安裝:雲伺服器或者本機亦或是虛擬機器模擬環境
3.初學:建議使用各大廠商自帶GUI字元命令介面進行互動。
推薦
個人推薦學習MySQL(MariaDB),逐步學習,深入淺出。為什麼推薦入門首選學習MySQL,上面提到了流行社群活躍,換句話說,MySQL資源豐富,官方文件全面,更新頻繁。
             
關於CRUD:增刪查改
一般而言,CRUD是指對資料庫錶行記錄進行新增(insert)、刪除(delete)、查詢(select)以及修改(update)操作。
             
各大DBMS廠商資料庫官方文件地址整合
https://blog.cnwangk.top/2022/03/17/MySQL等主流資料庫廠商(DBMS)-官方文件地址
             
             
05
DBMS初體驗

MySQL:初體驗
1.部署MySQL;
2.檢驗(啟動與關閉服務);
3.修改密碼與許可權(為第5步做準備);
4.字元命令介面進行互動;
5.工具:MySQL workbench、DBeaver(通用資料庫管理器)或者SQLyog;
6.基本操作(CRUD:insert、delete、update、select);
7.參考官方文件 & 官方完整Demo示例。
             
部署MySQL8.0.x
Windows install MySQL8.0.x (Archive zip) 簡易安裝教程
1.解壓免安裝版MySQL:unzip mysql-8.0.x-winx64.zip
2.切換到MySQL解壓目錄:cd mysql-8.0.x-winx64
3.新增MySQL配置檔案:my.ini
4.初始化MySQL:bin\mysqld --initialize-insecure 或者 bin\mysqld --initialize-insecure --console
5.註冊MySQL服務:bin\mysqld --install MySQL80(將MySQL服務註冊到service,可以使用net命令進行管理)
6.啟動MySQL服務:net start MySQL80 或者 sc start MySQL80
7.登入MySQL字元管理介面:mysql -uroot -p
             
注意:版本選擇:帶有GA(General Availability)標識為穩定版,目前最新穩定是MySQL 8.0.32 釋出於2023-01-17。x代表使用MySQL8.0具體版本。開啟CMD或者Powershell時以管理員身份執行,如果沒有,安裝服務時則會提示許可權拒絕,如下所示。
D:\mysql-8.0.32-winx64\bin>mysqld --install MySQL80              
Install/Remove of the Service Denied!
             
Windows環境新建my.ini做如下設定,指定基本安裝目錄與資料存放目錄:



 [mysqld]               basedir=D:\\mysql-8.0.32-winx64               datadir=D:\\mysql-8.0.32-winx64\\data

             
登入到命令列字元介面
Windows 平臺開啟CMD、Powershell或者Windows terminal(win + x 開啟Windows終端(管理員))
引數作用
•-u:指定使用者為root。
•-p :回車後輸入密碼,如果直接輸入密碼回車即可登入。
•-P :指定埠號(port),預設為3306。
Windows平臺修改my.ini指定MySQL server埠,Linux平臺修改my.cnf指定埠。

mysql -uroot -p -P 3306
Linux發行版開啟終端(terminal)

mysql -uroot -p -P 3306
輸入

 mysql>select 1\G
分析
登入到MySQL字元操作介面,輸入select 1\G、select 1;或者select 1\g,會得到輸出內容:1。這種情況MySQL不用訪問表或索引,直接得到結果,透過explain使用執行計劃(後續可以瞭解)可以看出type=NULL,此時效率最高。
輸出



***************************1.row***************************              1: 1              1 row inset (0.00 sec)

提示:同樣在postgreSQL中也是支援select 1;或者select 1\g,輸出結果:1。
             
做筆記:SQL CRUD
在建立資料庫(使用者)、表,最好統一大小寫、駝峰命名、下劃線,不要混搭使用。個人給出的建議是:要麼純大寫,要麼純小寫,要麼使用下劃線進行分割。使用拼音命名庫名、表名、欄位名的時候(最好不要簡寫),如果簡寫,也請寫好註釋。比如地標性的命名北京(beijing)、上海(shanghai)、廣州(guangzhou)、深圳(shenzhen),使用全拼音這是可以的,即便查詢字典大概也是這樣命名的,最好與你的合作團隊達成統一意見。
當然,你看到我所演示SQL語句,關鍵字部分統一使用大寫,庫名、表名、欄位名使用小寫。
註釋使用


 /** MySQL基礎知識掃盲 **/               -- MySQL基礎知識掃盲

             
建立資料庫
建立管理使用者study(習慣叫資料庫),注意: 執行更新操作時,時刻牢記資料無價,指定條件。最大程度避免給自己帶來不必要的工作麻煩。

CREATE DATABASE study;
切換使用者

 USE study;
建表語句
建立表,在study使用者下分別建立表:girl、books。














CREATE TABLE study.girl(    id INT  PRIMARY KEY,    girl_name VARCHAR(64),    girl_age VARCHAR(64),    cup_size VARCHAR(64),    stu_num VARCHAR(64) )
CREATE TABLE study.books(    id VARCHAR(32) NOT NULL PRIMARY KEY,    book_names VARCHAR(64) NOT NULL,    isbn VARCHAR(64) NOT NULL,    author VARCHAR(16) NOT NULL);

             
第一張表girl:使用CRUD語句 & 開啟顯式開啟事務(MySQL & MariaDB預設開啟自動autocommit提交)。
顯式開啟事務

 BEGIN;               -- start transaction;
查詢:標準寫法,指定欄位名

 SELECT sg.id,sg.girl_name,sg.girl_age,sg.cup_size,sg.stu_num FROM study.girl sg;
查詢:偷懶寫法

 SELECT * FROM study.girl sg;
插入一條資料:標準寫法,指定欄位名

 INSERT INTO study.girl(id,girl_name,girl_age,cup_size,stu_num) VALUES(1001,'夢夢','16','B','tolovemm16');
插入一條資料:偷懶寫法

INSERT INTO study.girl VALUES(1001,'夢夢','16','B','tolovemm16');
刪除資料:指定條件

DELETE FROM study.girl sg WHERE sg.id=1001;
修改資料:指定條件

 UPDATE study.girl(id,girl_name,girl_age,cup_size,stu_num) sg SET sg.stu_num='toloveC16'  WHERE sg.id=1001;               UPDATE study.girl sg SET sg.cup_size='C'  WHERE sg.id=1001;
回滾操作

 ROLLBACK;
提交事務

 COMMIT;

             
第二張表books














 -- 插入               INSERT INTO study.books VALUES('1001','books','2023-3-15-miji','張三');                   -- 修改               UPDATE study.books b  SET b.book_names='絕世武功秘籍'WHERE b.id='1001';    -- 查詢               SELECT * FROM study.books;               -- 不用帶上使用者名稱也能查詢,切換使用者操作:use study               SELECT * FROM books;                        -- 刪除全表資料內容               DELETE FROM study.books;                          -- 刪除全表資料內容:TRUNCATE [TABLE] tbl_name               TRUNCATE TABLE study.books;                             -- 刪除表結構與內容,注意:無法回滾               DROP TABLE study.books;

MySQL官方完整Demo示例
最後附上官方示例資料庫,sakila-db資料庫一個非常完整的示例。包含:檢視、函式、觸發器以及儲存過程,當然也存在使用外來鍵。
sakila-db資料庫包含三個檔案,便於大家獲取與使用:
1.sakila-schema.sql:資料庫表結構;
2.sakila-data.sql:資料庫示例模擬資料;
3.sakila.mwb:資料庫物理模型,在MySQL workbench中可以開啟檢視。
             
用於用於簡單測試學習,可以使用world-db
world-db資料庫,包含三張表:city、country、countrylanguage。
             
MySQL官方文件(5.6、5.7、8.0)整合
連結:
提取碼: bx44
             
             
Oracle:初體驗
初步使用,建議掌握Oracle自帶的字元命令操作工具 SQL plus。
其次掌握第三方管理工具 PLSQL developer,管理Oracle很好用,免費30天試用,付費軟體。
個人認為,有必要了解Oracle自帶SQL客戶端管理工具SQL developer,免費使用。
1.SQL plus
2.PLSQL developer
3.SQL developer
             
以下將演示在Oracle資料庫中如何構建使用者、表、對資料查詢、新增、修改、刪除操作。
1、建立使用者
建立資料庫test,在Oracle中指建立使用者用於管理
常規(Oracle12c是一個拐點,有CDB和PDB之分)建表用法:

create user test identified by 123456;

新版Oracle19c(帶c,預設為CDB模式),新建使用者

create user c##test identified by 123456;
     
2、授權
授予使用者test許可權resourceconnect

grant resource,connect to test;

3、建表
建立表girl,指定了使用者為test





 create table test.girl(     ID VARCHAR2(32) not null,     GIRL_NAME VARCHAR2(64),     GIRL_SEX VARCHAR2(2) )

4、索引
新增主鍵索引

  alter table test.girl add primary key(ID);

5、查詢、新增、修改、刪除
查詢表girl

 select * from test.girl;

新增資料

 insert into test.girl values('1001','夢夢','女');

修改資料

 update test.girl t set t.ID='1002';

刪除資料
刪除表中全部資料,但不刪除表結構。使用drop則刪除表結構以及資料。

delete from test.girl;

PostgreSQL:初體驗
主要熟悉PostgreSQL自帶的SQL shell字元命令工具和pgAdmin客戶端管理工具的使用。
1.SQL shell
2.pgAdmin
可以在我個人公眾號歷史文章中找到關於PostgreSQL入門教程。
             
Demo示例
SQL必知必會demo示例
官網地址:
涵蓋DBMS示例:DB2、SQLserver、MySQL、Oracle、PostgreSQL、SQLite

SQL表結構示例下載
個人整理一些資料進行整合打包。
連結: 提取碼: cx3p
             
             
參考資料
1.SQL必知必會第5版。
   

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2940029/,如需轉載,請註明出處,否則將追究法律責任。