天天看點

為什麼要學SQL,入門選擇哪款關系型資料庫最合适?

MySQL資料庫、Oracle資料庫、達夢資料庫?還是SQLserver資料庫?為什麼要學SQL,入門選擇哪款關系型資料庫最合适?

前言

我:小川,聽說你對Linux指令、Java以及資料庫SQL方面的知識比較熟悉,公司業務主要也是基于Java開發的web項目。

小川:是的,以前學過一點Java方面的知識,用過一段時間的Linux指令,會一點資料庫操作。

構思緣起

這篇文章的構思來源:前段時間公司新招了一名駐場運維人員,基礎有點薄弱,SQL方面的知識需要輔導。在我的上一篇文章《初學者如何入門linux,原來linux還可以這樣學》其實也是基于這種想法編寫的。我尋思着,如何快速帶他先入個門,至少得教會工作中最常用的(select、insert、update、delete)增删改查。我就在思考着,是不是要出一篇文章好好地輔導一下。當然寫的很基礎,基于給想入門SQL語言的初學者一點小小的建議。

雖然小川基礎知識不是很牢靠,但是好學,這點值得肯定。我也經常對他說,多用你的小本本做記錄,久而久之你就會積累很多知識。當然,這也是在實際工作中才發現的。起初,通過交談認為他至少會一點基礎,這也是後話了。

如果他有幸看到這篇文章,可能會後悔,當初怎麼沒早點看到這篇文章問世。

SQL的簡介,SQL是什麼?

參考文獻:維基百科

全稱是Structure Query Language(結構化查詢語言)是一種特定目的程式設計語言,一般簡稱為SQL。用于管理關系資料庫管理系統(RDBMS)。它是使用關系模型的資料庫應用語言,由IBM在20世紀70年代開發出來,作為IBM資料庫System R的原型關系語言,實作資料庫中資訊檢索。20世紀80年代初,美國國家标準學會(ANSI)開始着手定制SQL标準。最早的ANSI始于1986年,被稱為SQL-86,在1987年成為國際标準化組織(ISO)标準。盡管SQL并非完全按照科德的關系模型設計,但其依然成為最為廣泛運用的資料庫語言。此後,這一标準經過了一系列的增訂,加入了大量新特性。雖然有這一标準的存在,但大部分的SQL代碼在不同的資料庫系統中并不具有完全的跨平台性。SQL标準幾經修改,更趨近于完善。

為什麼要學SQL,入門選擇哪款關系型資料庫最合适?

要問學什麼程式設計語言成效最顯著,毫無疑問是SQL語言。當我們接觸一個陌生的資料庫時,通常需要一種方式與之進行互動,進而完成使用者的工作。此時,就需要SQL語言了。

正文

推薦入門首選的關系型資料庫MySQL,開源免費、社群活躍、教程資源豐富,個人也會着重對MySQL的一些知識進行講解。篇幅受限,一篇文章也不會做到面面俱到,總會有所遺漏,但側重點依舊是入門指導。由于是對想入門的同學一些建議,不會過于深入,隻會講一些淺一點的知識。至于核心知識:存儲過程、觸發器、函數以及遊标之類的進階知識,可以參考我在文中推薦的書籍。慢慢累積知識,你的知識寶庫自然豐富。

當你看到本文的時候,觀衆與本文的約定:

  • MySQL中以sakila資料庫作為示例進行講解;
  • Oracle中以scott使用者中的emp(員工表)和dept(部門表)作為示例進行講解。
  • Oracle11g安裝自帶scott使用者,Oracle19c預設(CDB模式,新增使用者要加c##)沒有scott使用者,需要手動導入。
  • MySQL官方提供的示例資料庫sakila以及world,類似于Oracle的scott使用者。
  • 達夢資料庫安裝的時候可以選擇添加示例使用者:PERSON、PRODUCTION、PURCHASING、RESOURCES、SALES。
  • 關鍵字大小并不影響你查詢使用,在示範的時候可能會出現有的大寫有小寫。

01 第一夜

小川走進了我的書房(語音會議),開始了求學之路。我對好學之人,一向也是願意傳授多年的九陽神功和玉女心經的。

嚯,有點意思哈!玉女心經?

為什麼要學SQL,入門選擇哪款關系型資料庫最合适?

我:小川啊,我這邊項目線上測試已經接近尾聲了。到時候需要你過來完成交接,之前聽說你會資料庫的基本操作。

小川:啊,支支吾吾的回答道:我隻會一點點SQL的操作。

我:那,你都會些啥呢?

小川:實話實說吧,我基本快忘完了。

我:好吧。。。沒事,還好發現的早,今晚就給你輔導一下。基本的操作是需要掌握的,否則會拖延工作進度。

小川:好的。于是拿出了小本本開始記錄...

我:咱理論知識得到位,分享一下SQL語句的分類。

DDL(Data Definition Language)語句,資料定義語句。主要用于對索引、資料表結構、字段等進行建立、删除以及修改。比如我們常用的關鍵字主要有:CREATE、DROP、ALTER等等。一般是DBA管理者使用的比較頻繁。

DML(Data Manipulation Language)語句,資料操縱語句。主要用于對資料庫表中記錄進行增删改查。比如我們常用的關鍵字主要有:INSERT、DELTE、UPDATE以及SELECT等。一般是開發人員使用的比較頻繁。

DCL(Data Control Language)語句,資料控制語句。主要用于對使用者、表、字段的通路權限進行控制授權。比如我們常用的關鍵字有:grant(授權)、revoke(撤回授權)等。

一、SQL

在梳理SQL方面的知識,我可能會穿插的帶入一些MySQL或者Oracle中的使用經驗,便于大家更有代入感。這裡說的建立資料庫,隻是大家叫習慣了,更确切的應該是叫使用者。

1、建立與切換資料庫

MySQL中建立資料庫與删除資料庫

-- 建立資料庫av(習慣叫資料庫)
CREATE DATABASE av;
-- 切換到av資料庫,在MySQL或者MariaDB可以這樣使用
USE av;
-- 删除av資料庫
DROP DATABASE av;
           

Oracle中建立資料庫與删除資料庫,如果在Oracle中使用

create database

關鍵字建立,會提示資料庫已裝載。

-- Oracle中建立使用者
CREATE user av IDENTIFIED BY 你的密碼;
-- 在sqlplus中登入使用者
conn av/123456 as sysdba; 
-- 删除使用者
drop user av;
           

修改(alter)使用者密碼,需要管理者權限才能執行:

#MySQL中修改root使用者的密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
#Oracle中修改scott使用者密碼
ALTER USER scott IDENTIFIED BY 新密碼;
           

在MySQL中修改root使用者的密碼,Oracle中修改scott使用者密碼。

2、建立與删除表

建立一張表bols,資料庫、表名和字段要麼統一大寫要麼統一小寫,有的資料庫對大小寫很敏感。

create table bols(
	id varchar(32) not null primary key,
    names varchar(64) not null,
    sex varchar(2) not null,
    cup_size varchar(8) not null
);
           

删除表bols

DROP table bols;
           

我:上面列舉了一些資料庫的基本操作,記住了多少。

小川:建立(create user/database)使用者/資料庫av,建立(create table)表bols。一臉疑問,bols是啥呀!

為什麼要學SQL,入門選擇哪款關系型資料庫最合适?

我:波老師啊,很出名的一位老師,很大、很白。

想啥呢?回到正題,抓緊搞定基本的操作。

小川:嗯嗯,我也對bols很感興趣。便拿出了小本本開始書寫着。

下面就開始以bols為例子,對小川進行講解了資料庫最基本的增删改查操作。

3、增删改查(CURD)

查詢(select)表名(table_name)為bols的全部資料

-- 查詢全部内容,不帶條件
select * from bols;
           

模糊查詢like,使用到關鍵字:where(條件)、and(并且)、like(模糊查詢)

-- 模糊查詢,帶條件
select t.* from scott.emp t where t.deptno > 20 and t.ename like '%S%';
           

插入(insert)一條資料

insert into bols values('1001','bols','女','D');
           

修改(update)id為1001的這條資料,将cup_size修改為D38。D38是個啥概念,咱也沒體驗過,就舉個例子呗。

update bols b set b.cup_size='D38' where b.id='1001'; 
           

删除(delete)表中的全部資料

delete from bols;
           

删除(delete)表中單條資料,帶條件删除,一般根據主鍵唯一辨別去搜尋删除。

delete from bols b where b.id='1001';
           

在SQL中是支援取别名的,友善我們在查詢表的時候提高效率,咱上面給bols取個别名叫b。在你不确定删除的資料是否真的要删掉的時候,最好使用查詢(select)查出來分析一下結果,再做删除。删除資料之前,也應該事先做好資料備份,謹慎一點總歸沒錯的。

我:基礎知識現在想必有所了解了,聚合函數對你今後的工作有大大大的幫助。

小川:好耶,我也很感興趣。

認真的聆聽着,然後踏踏實實的進行了實際操作...

4、聚合函數(Aggregate)

介紹幾個常用的函數。同時使用多個函數,查詢Oracle資料庫scott使用者的emp表:

-- count(統計條目數),sum(求和),substr(截取),avg(取平均值)函數的使用
select count(*), sum(t.sal), substr(avg(t.sal), 0, 7) from scott.emp t;
           

傳回平均值avg,一般配合substr關鍵字去截取,通過計算保留小數點後兩位。

-- avg(取平均值)函數的使用
select avg(t.sal) from scott.emp t;
select substr(avg(t.sal), 0, 7) from scott.emp t;
           

傳回統計行數count

-- 統計函數count,統計emp表條目數量:14
select count(*) from scott.emp;
           

傳回總數(求和)sum,sum函數一般會配合decode函數使用

-- 求和函數sum的使用
select sum(t.sal) from scott.emp t;
-- 配合decode函數使用
select sum(decode(ename, 'SMITH', sal, 0)) SMITH,sum(decode(ename, 'ALLEN', sal, 0)) ALLEN,
	   sum(decode(ename, 'WARD', sal, 0)) WARD,sum(decode(ename, 'JONES', sal, 0)) JONES,
	   sum(decode(ename, 'MARTIN', sal, 0)) MARTIN,sum(decode(ename, 'BLAKE', sal, 0)) BLAKE,
	   sum(decode(ename, 'CLARK', sal, 0)) CLARK,sum(decode(ename, 'SCOTT', sal, 0)) SCOTT,
	   sum(decode(ename, 'KING', sal, 0)) KING,sum(decode(ename, 'TURNER', sal, 0)) TURNER
from scott.emp;
           

tips:count函數在工作中使用的很頻繁,你不清楚某張表中有多少條記錄,需要統計一下再處理。

傳回最大值max,檢視員工中薪水最高的那一位。

-- max函數的使用
select max(t.sal) from scott.emp t;
           

傳回最小值min,檢視員工中薪水最底的那一位。

-- min函數的使用
select min(t.sal) from scott.emp t;
           

Oracle中rownum。傳回emp員工表中的最後一條記錄,通過

rownum

實作:

select t.sal from scott.emp t where rownum <=1;
select t.sal from scott.emp t where rownum <=1 order by t.sal desc;
           

MySQL中的limit。通過

limit

關鍵字實作,根據sakila中的actor為例子傳回最後一條記錄,使用actor_id進行排序。

注意:limit屬于MySQL擴充SQL92後的文法,在其它資料庫中不能通用。

SELECT t.`first_name` FROM sakila.`actor` t ORDER BY t.`actor_id` DESC LIMIT 1;
           

group by函數配合聚合函數sum應用,查詢Oracle中scott使用者下的emp表:

SELECT t.deptno, SUM(t.sal) AS sals FROM scott.emp t GROUP BY t.deptno;
           

having函數配合聚合函數使用,Oracle中的scott使用者下emp與dept表。如下給出簡單示例:

差別:having和where的差別在于,having是對聚合後的結果進行條件的過濾,而where是在聚合前就對記錄進行過濾。如果邏輯允許,應盡可能用where先過濾記錄,由于結果集的減小,對聚合的效率明顯提升。最後再依據邏輯判斷是否用having再次過濾。

SELECT d.dname, SUM(e.sal) AS sals FROM scott.emp e
INNER JOIN scott.dept d ON e.deptno=d.deptno
WHERE e.deptno < 30 GROUP BY d.dname  HAVING SUM(e.sal) > 10000;
           

exists運算符,傳回結果true與false。可以配合not使用,示例如下:

-- exists
select t.deptno,t.sal from scott.emp t where 
exists(select t.deptno from scott.dept d where d.deptno=t.deptno and t.sal > 1500);
-- not exists
select t.deptno,t.sal from scott.emp t where 
not exists(select t.deptno from scott.dept d where d.deptno=t.deptno and t.sal > 1500);
           

in操作符,依舊以Oracle中的scott使用者示例:

-- 查詢部門編号為10,20的員工薪水
select t.deptno,t.sal from scott.emp t where t.deptno in(10,20);
-- 查詢不包含部門編号為10,20的員工薪水
select t.deptno,t.sal from scott.emp t where t.deptno not in(10,20);
           

關于函數和操作符就講這麼多,一般而言工作中足夠用了。更多的應用可以參考官方文檔或者《菜鳥教程》以及權威的實體書籍。

02 第二夜

第一夜的知識點還是比較多的,需要下去踏踏實實的實際操作,多多練習并加以了解。

我:小川啊,通過昨晚的探讨,SQL的一些知識應該掌握不少了吧。

小川:是的,掌握一些,還有一部分需要多練習才行。

我:接下來就開始給你講講MySQL方面的一些注意事項。

小川:嗯嗯,并點了點頭。拿出了小本本開始記錄...

二、MySQL

1、版本

MySQL有兩種版本

  • 其中一種是企業版,提供了更加豐富的特性與完善的售後技術支援。
  • 另一種是社群版,免費提供給普通使用者使用。但MySQL被Oracle收購後,存在閉源的風險。MySQL的創始人開始着手MariaDB,也是基于原版版的MySQL打造的,完全相容MySQL,擁抱開源。

關于社群版和企業版的最大差別,我個人還是深有體會的。之前有幸接觸過政企項目,使用付費版的國産資料庫DM8。出了問題,直接電話聯系供應商,找來了達夢資料庫的技術支援人員上門排查解決問題。劃重點,上門服務。有商業支援确實是好事,但更應該擁抱開源。

2、入門

2.1、下載下傳與安裝

MySQL官網下載下傳位址:https://dev.mysql.com/downloads/,下載下傳社群版,社群版是免費提供下載下傳的。

在linux下安裝二進制包,建議事先這樣處理:

#添加mysql組
$ groupadd mysql
#新增mysql使用者到mysql組中
$ useradd -g mysql mysql
           

切換到我們的home目錄下進行解壓安裝:

$ cd /home/mysql
#解壓tar包
$ tar -zxvf /home/mysql/mysql-version-os.tar.gz
#做軟連結
$ ln -s mysql-version-os mysql
#安裝
$ scripts/mysql_install_db --user=mysql
           

設定目錄權限,啟動mysql:

$ chown -R root:mysql
$ chown -R mysql:mysql data
$ /usr/bin/mysqld_safe --user=mysql &
           

源碼包安裝就不做詳細講解,這裡對源碼包安裝提示三點:

  • 編譯源碼并指定安裝路徑:./configure --prefix=/usr/local/mysql
  • 編譯:make
  • 安裝:make install

在所有的關系型資料庫中,我提醒你要注意的一點是,都有個很重要的過程就是資料庫的執行個體化,沒有執行個體化是無法啟動資料庫服務的。更多安裝方式可以參考菜鳥教程進行安裝:https://www.runoob.com/mysql/mysql-install.html

MySQL資料庫的安裝配置與Oracle資料庫相比要簡單的多。下載下傳完後并完成安裝,MySQL的官網也提供了示例資料庫和Oracle提供的scott使用者下的emp和dept類似。你可以到官網擷取MySQL提供的資料庫示例sakila和world,然後進行導入到資料庫中。

也給出MariaDB的下載下傳位址:https://mariadb.org/download/

修改密碼,預設安裝設定密碼大機率為空,手動去指定密碼。

set password for root@localhost=password('123456');
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
           

建立使用者授權,初學者如果想使用工具遠端連接配接自己的MySQL(MariaDB)資料庫,需要對使用者授權。

GRANT ALL PRIVILEGES ON *.* TO '你的使用者名'@'你的IP位址' IDENTIFIED BY '123456' WITH GRANT OPTION;
           

示例:表示授權root戶,所有IP都可連接配接。

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
           

重新整理權限

flush privileges;
           
2.2、MySQL的使用

簡潔的描述下MariaDB:基于MySQL關系資料庫的複刻,由社群開發、有商業支援,目前由MySQL的創始人在維護。

區分平台一般為Windows和Linux伺服器。在Windows平台,一般在安裝的MySQL的bin目錄下,使用CMD指令視窗以管理者身份運作進行登入,并進行互動操作。在登入的時候事先可以在-p參數後輸入密碼也可以不輸入,系統會提示你輸入登入密碼的。有兩種方式登入:

mysql -uroot -p #指定使用者,但不指定密碼
mysql -uroot -p123456 #指定使用者并且在-p參數後面接上密碼
           

下面示範在cmd指令視窗下登入MySQL的情形:

mysql -uroot -p
d:\work\MariaDB>mysql -uroot -p
Enter password: *******
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 19
Server version: 10.5.6-MariaDB mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
           

登入到MySQL(MariaDB)資料庫後,可以進行一些常用的互動,比如我們展示存在哪些資料庫。當你要顯示表的時候,這時需要使用

use av

切換到av使用者,然後使用

show tables;

即可顯示目前資料庫中的所有表。上面介紹SQL的時候也有提到切換資料庫。

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| av                 |
| sakila             |
| world              |
| test               |
+--------------------+
9 rows in set (0.001 sec)
           

好家夥這個av是啥意思?一顆悶騷(愛學習)掩飾不了我那正直的内心。不就是多了一點什麼cnagls、bols、jizels以及longls之類的比喻嗎,還順帶研究了她們的cup_size而已,僅此而已。

回到正題,可以看到預設安裝就存在的有

  • information_schema、mysql、performance_schema這三個資料庫;
  • 其它的比如av、sakila 、world、test是後來自己搭建測試使用的。

提供的sakila資料庫示例,包含内容很詳細,也涵蓋了SQL中的一些核心知識:

  • 最基本的表與表結構
  • 視圖(view),例如:actor_info
  • 存儲過程(PROCEDURE),例如:film_in_stock
  • 函數(FUNCTION),例如:get_customer_balance
  • 觸發器(TRIGGER),例如:customer_create_date

在我們的linux伺服器下,配置好了環境變量,在任意目錄下同樣使用如下指令進行登入,并操作互動。

$ mysql -uroot -p
           

在linux下安裝的資料庫内容我就不展示了,之前搭建MySQL主從複制以及監控系統zabbix弄得比較混亂。

2.3、MySQL幫助指令

注意了,幫助指令是在MySQL自帶的工具登入中使用的。需要先登入到MySQL指令模式:

-- 登入到mysql
mysql -uroot -p
           

列舉幾個示例:

  • ? contents:包含了所支援的幫助文檔。
  • ? data types:查詢資料類型的幫助文檔
  • ? show:比如快速查閱show指令的使用,如果不支援會提示Nothing found。
? contents
MariaDB [(none)]> ? contents;
You asked for help about help category: "Contents"
For more information, type 'help <item>', where <item> is one of the following
categories:
   Account Management  Administration  Compound Statements
   Data Definition  Data Manipulation Data Types
   Functions  Functions and Modifiers for Use with GROUP BY
   Geographic Features Help Metadata Language Structure
   Plugins Procedures Sequences Table Maintenance Transactions
   User-Defined  Functions Utility
           

列舉出MySQL目前版本支援的資料類型:

MariaDB [(none)]> ? data types;
You asked for help about help category: "Data Types"
For more information, type 'help <item>', where <item> is one of the following
topics:
   AUTO_INCREMENT  BIGINT  BINARY  BIT  BLOB  BLOB and TEXT Data Types
   BOOLEAN  CHAR  CHAR  BYTE  DATE  DATETIME  DECIMAL DOUBLE  ENUM  FLOAT
   Geometry Types JSON Data Type LONGBLOB  LONGTEXT  MEDIUMBLOB
   MEDIUMINT MEDIUMTEXT Numeric Data Type Overview ROW SET Data Type
   SMALLINT String Literals TEXT  TIME  TIMESTAMP  TINYBLOB  TINYINT  TINYTEXT
   VARBINARY VARCHAR YEAR Data Type
           

2.4、MySQL中支援的類型(介紹部分)

學以緻用。需要連貫學習,使用上面介紹到幫助指令進行檢視一些字元串類型的作用。比如我不清楚CHAR類型的使用,可以執行幫助手冊進行查詢使用方法:

? CHAR;
           
  • 數值類型
  • 日期時間類型
  • 字元串類型

下面值列舉字元串類型,介進行紹:

作用
CHAR(M) M的長度為:0~255之間的整數。聲明固定長度。
VACHAR(M) M的長度為:0~65535之間的整數,值的長度+1個子節。可自動調節。
TINYBLOB 允許長度0~255位元組,值的長度+1個位元組。
BLOB 允許長度0~65535位元組,值的長度+2個位元組。
MEDIUMBLOB 允許長度0~16,777,215位元組,值的長度+3個位元組。
LONGBLOB 允許長度0~65535位元組,值的長度+4個位元組。
TINYTEXT 允許長度0~255位元組,值的長度+2個位元組。
TEXT
MEDIUMTEXT
LONGTEXT 允許長度4,294,967,295位元組,值的長度+4個位元組。
VARBINARY(M) 允許0~M個位元組的變長位元組字元串,值的長度為+1個位元組。
BINARY(M) 允許0~M個位元組的定長位元組字元串

2.5、MySQL中其它常用的函數

列舉了部分函數做成表格以供參考,具體的使用就不一一列舉了,可以自行測試驗證。對部分進行了加粗顯示。

同樣函數的使用,一樣可以使用幫助文檔進行檢視:

MariaDB [sakila]> ? abs;
Name: 'ABS'
Description:
Syntax
------
ABS(X)
Description
           
函數 功能
ABS(x) 傳回x的絕對值
CEIL(x) 傳回大于x的最小整數值
FLOOR(x) 傳回小于x的最大整數值
MOD(x,y) 傳回x/y的模
RAND() 傳回0~1之間的随機值
ROUND(x,y) 傳回參數x四合五入的有y位小數的值
DATABSE() 傳回目前資料庫名
VERSION() 傳回目前資料庫版本
USER() 傳回目前登入使用者名
INET_ATON(IP) 傳回IP位址的數字表示
INET_NTOA(num) 傳回數字代表的IP位址
PASSWORD(str) 傳回字元串str加密版本
MD5(str) 傳回字元串str的MD5值
LTRIM(str) 去掉字元串str左側的空格
RTRIM(str) 去掉字元串行尾的空格
REPEAT(str,x) 傳回str重複x次的結果
REPLACE(str,a,b) 用字元串b替換字元串str中所有出現的a字元串
STRCMP(s1,s2) 比較字元串s1與s2
TRIM(str) 去掉str字元串的空格
SUBSTRING(str,x,y) 傳回字元串str中起始位置x到y個字元長度的字元串,一般用于截取小數點後位數過多。

一般通過select 接函數去插叙,例如:

MariaDB [(none)]> use sakila;
Database changed
MariaDB [sakila]> select DATABASE();
+------------+
| DATABASE() |
+------------+
| sakila     |
+------------+
1 row in set (0.000 sec)
           

3、連接配接工具介紹

推薦幾個比較常用的工具:phpMyAdmin、SQLyog、MySQL Workbench、Navicat可視化工具進行連接配接操作。工具的使用是其次的,更重要的在于對MySQL指令語句的運用。

tips:包含了SQLyog、plsqldev、Navicat,還整理了部分安裝包以及MySQL官方提供的sakila 、world示例喲!

連結: https://pan.baidu.com/s/11gIlZKxoTG5BCCcoXdVJRg 提取碼: ntu7

給出一個使用Navicat逆向生成的示例資料庫world的模型:

為什麼要學SQL,入門選擇哪款關系型資料庫最合适?

如果真的要使用到建實體模型:推薦你學習Sybase PowerDesigner設計工具的使用,而且需要了解關系資料庫設計遵循的三範式。現在資料庫設計最多滿足3NF,普遍認為範式過高,雖然具有對資料關系更好的限制性,但也導緻資料關系表增加而令資料庫IO更易繁忙,原來交由資料庫處理的關系限制現更多在資料庫使用程式中完成。

4、找回root使用者密碼

無論是初學者或者是熟手都有可能忘記之前設定的密碼。咱當初安裝MySQL也是吃過虧的,采用生成随機密碼坑過自己一次。

這裡介紹在linux下如何找回root使用者密碼:

  • 思路:繞過MySQL的權限驗證
  • 具體方法:使用update語句修改本地localhost的root使用者密碼

解決方案:登入到MySQL所在伺服器,通過程序指令

ps -ef

查詢MySQL服務:

#檢視mysql服務程序
$ ps -ef | grep mysql
#或者使用
$ ps -aux | grep mysql
mysql     2122  0.4  7.1 971244 133536 ?
--datadir=/var/lib/mysql
$ cat /var/run/mysqld/mysqld.pid 
2122
           

經過上面的對比,你會發現ps指令查出來的和mysql.pid裡記錄的是一緻的。查詢到MySQL預設安裝到了/var/lib/mysql下,存儲MySQL程序pid在/var/run/mysqld/mysqld.pid。通過kill指令停止:

$ kill -9 2122
           

使用--skip-grant-tables參數越過權限表認證,然後啟動MySQL。

#越過權限驗證,然後啟動mysql并放入背景運作,如果你用root使用者測試的,将user後的參數改為root
--skip-grant-tables
$ /usr/bin/mysqld_safe --skip-grant-tables --user=mysql &
           
-- 修改密碼
update user set password=password('123456') where user='root' and host='locahost';
           

越過權限驗證,然後啟動mysql并放入背景運作,如果你用root使用者測試的,将user後的參數改為root。然後使用update語句修改密碼。以上就是root使用者密碼忘記了,通過越過權限認證表修改密碼。看完之後,是不是感覺很簡單。

5、常用網絡資源

  • MySQL官網下載下傳位址:https://dev.mysql.com/downloads/
  • 目前最權威的MySQL資料庫以及工具線上手冊:https://dev.mysql.com/doc/
  • MySQL釋出的bug清單:https://bugs.mysql.com/

03 第三夜

第二夜的知識點對MySQL進行了簡單的介紹,也需要下去踏踏實實的實際操作。尤其是核心知識:視圖、函數、存儲過程以及觸發器。

我:小川啊,通過昨晚的探讨,MySQL的一些知識應該掌握不少了吧。

小川:大概入了個門,需要消化消化。

我:接下來就開始給你講講Oracle方面的一些注意事項,也是公司主要使用的資料庫,目前依舊以Oracle11g為主。

三、Oracle

Oracle主要分為兩種版本,目前貌似逐漸從Oracle11g轉向Oracle19c了。

  • 其中一種是帶g結尾的,比如現在依舊使用廣泛的Oracle11g
  • 另外一種就是帶c結尾的,以标志性的Oracle12c為代表。加入了很多新特性,對雲端(cloud)支援更友好。

這年頭網際網路的下一個風口浪尖,絕對是瞄準了雲(雲計算、雲原生)。

2.1、安裝

Windows下安裝Oracle的過程,就不詳細介紹了,給出三點注意事項:

  • 資料庫軟體的安裝(一般選企業版,就算個人使用你也不會去選标準版之類的)
  • 資料庫監聽程式配置(以管理者身份運作):Net Configuration Assistant
  • 資料庫執行個體化(以管理者身份運作):Database Configuration Assistant

Linux下部署Oracle可以參考我之前的博文《【linux環境】Oracle11g以及Oracle19c基于centos7安裝與優化》:

https://blog.csdn.net/Tolove_dream/article/details/122136388

2.2、SQL*Plus工具使用

以經典的Oracle11g作為講解,無論是在Windows平台還是linux平台都要設定對應支援的中文字元集,否則看到中文會是亂碼。安裝完成并配置好了環境變量,在任何目錄下都可以打開cmd指令視窗運作sqlplus。如果沒有配置環境變量,在目前Oracle用戶端的BIN目錄D:\app\product\11.2.0\client\BIN下執行sqlplus一樣可以進行登入。

登入SQL*Plus,提示輸入使用者名和密碼。

SQL*Plus: Release 11.2.0.1.0 Production on 星期六 11月 22 21:18:17 2021
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
請輸入使用者名?    system as sysdba
輸入密碼:
連接配接?
  Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
           

可以使用如下方式運作SQLPlus,然後進行連接配接:

C:\Users\sky>sqlplus/nolog
SQL*Plus: Release 11.2.0.1.0 - Production on 星期六 11月 22 21:18:17 2021
Version 11.2.0.1.0
Copyright (c) 1982, 2010, Oracle.  All rights reserved.
SQL> conn system(使用者名)/123456(密碼) as sysdba(以DBA身份登入)
Connected.
           

查詢安裝Oracle11g就已經自帶的scott使用者下的emp和dept表,在Oracle19c中預設是沒有的,需要手動導入。

select * from scott.emp;
select * from scott.dept;
#使用desc指令展示scott使用者下的dept表結構
SQL> desc scott.dept;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DEPTNO                                    NOT NULL NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)
           

在linux中使用Oracle的SQL*Plus就不詳細介紹了,感興趣的可以使用虛拟機搭建測試環境進行驗證,參考文中提到的教程喲!

#運作sqlplus,執行指令參考上面講解Windows的
$ /home/oracle/app/product/11.2.0/dbhome_1/bin/sqlplus as sysdba
           

建立使用者test,注意SQL語句結束以分号結尾。

create user test;
           

建立表空間TEST.DBF,設定表空間的大小為1024M

create tablespace TEST DATAFILE 'D:\app\product\11.2.0\oradata\orcl\TEST.DBF' SIZE 1024M;
           

賦予表空間,賦予使用者TEST的預設表空間為TEST。如果想偷懶,就直接用system表空間。

alter user TEST default tablespace TEST;
alter user TEST default tablespace system;
           

2.3、SQL Developer工具

安裝Oracle服務端或者用戶端自帶SQL Developer,我個人使用的是用戶端自帶的。需要依賴Java.exe啟動,并且以管理者身份運作。

D:\app\product\11.2.0\client\sqldeveloper
           

以前的我,也是不知道Oracle原來還有SQL Developer工具的,最近看了實體書籍才知道的。帶大家看看:

你可以看到上面将Oracle中的部分使用者列舉出來了:

  • 超級管理者:sys
  • 普通管理者system
  • 自帶的普通使用者:scott,Oracle12c改為c##scott
  • 海量資料使用者(大資料使用者):sh
為什麼要學SQL,入門選擇哪款關系型資料庫最合适?

展示一下我登入的system和scott使用者,順帶示範個人測試環境中,建立了test使用者和student01表。并使用SQL Developer工具進行查詢,使用到之前介紹過的統計函數count,總條數為:1kw條資料。如果你打開emp表,會用中文顯示如下内容喲:

為什麼要學SQL,入門選擇哪款關系型資料庫最合适?
  • 列、資料、限制條件;
  • 授權、統計資訊、觸發器;
  • 閃回技術、相關性、詳細資料、索引以及SQL

我沒有放截圖,圖檔不宜過多,是以就用文字描述出來了,希望不要介意喲。

2.4、PLSQL Developer工具

為什麼要學SQL,入門選擇哪款關系型資料庫最合适?

我相信在實際工作中Oracle的SQL操作,使用的最頻繁的還是PLSQL Developer,畢竟功能強大界面更加美觀。本人使用的是漢化版本1207,官方支援漢化包。可以直接到官網擷取,也可以在文中找到我提供的度盤連結擷取汁源喲!Windows平台下的相關操作可以參考我之前寫的文章:《Oracle11gR2部署與解除安裝,附帶plsqldev工具使用》

3、優勢

有商業支援,完善的售後技術支援。海量資料處理,對比其它關系型資料庫,其性能更強大。

1kw資料的統計

與MySQL不同的是,Oracle處理大資料時能承受更大的壓力,在查找1kw的資料時候有明顯的差別。當然,也可能是我對MySQL的了解比較淺(在分庫分表以及存儲引擎這塊知識點我比較缺乏)。我統計Oracle下student01表中有1kw條資料,在PLSQLDeveloper工具中測試輸入下:

select count(*) from test.student01;
/** Oracle11g R2 for Windows10 測試随機生成200w~1000w資料的表 此次測試對DM8資料庫同樣适用**/
/**  **/
-- 建立使用者,如果指定的表空間大小不夠,不足以滿足1kw條資料存儲,測試至少需要設定表空間大小為512M
create user test;
-- 從Oracle12c開始,預設CDB模式建立使用者需要加上c##
create user c##test;
-- 在test使用者下建立表
CREATE TABLE test.student
(
    ID NUMBER not null primary key,
    STU_NAME VARCHAR2(60) not null,
    STU_AGE NUMBER(4,0) not null,
    STU_SEX VARCHAR2(2) not null
)
-- 學生表随機生成200w資料
insert into test.student select rownum,dbms_random.string('*',dbms_random.value(6,10)),dbms_random.value(14,16),
'女' from dual
connect by level<=2000000

-- 建立student01表直接将student表中資料複制過來了
create table test.student01 as select * from test.student;
-- 執行4次,生成1kw條資料,不到10秒搞定
insert into test.student01 select * from test.student;
select count(*) from test.student01;
-- 優化
update test.student set ID=rownum where 1=1
-- 修改年齡随機14-16歲之間
update test.student set STU_AGE=dbms_random.value(14,16) where 1=1
-- 送出
commit;
           

Oracle表空間的建立與調整

建立使用者,如果指定的表空間大小不夠,不足以滿足1kw條資料存儲。本人測試至少需要設定表空間大小為512M,具體還需要依據字段存儲内容大小來判斷。一般情況會設定表空間大小并開啟自動擴充,擴充的語句示例為:

-- 建立表空間
create tablespace TEST DATAFILE 'D:\app\product\11.2.0\oradata\orcl\TEST.DBF' SIZE 1024M;
-- 調整空間允許自動擴容 AUTOEXTEND ON代表自動擴充。每次擴充100M,最大上限為2048M
alter DATABASE DATAFILE 'D:\app\product\11.2.0\oradata\orcl\TEST.DBF' AUTOEXTEND ON NEXT 100M MAXSIZE 2048M;
           
為什麼要學SQL,入門選擇哪款關系型資料庫最合适?

值得注意的是VARCHAR2字段屬性在Oracle中支援,但在MySQL中是不支援的。

Oracle中的rowid僞列,在plsqldev工具中點選帶鎖的标志即可進行編輯資料。這裡以scott使用者為例子進行展示:

select t.*,t.rowid from scott.dept t;
           
為什麼要學SQL,入門選擇哪款關系型資料庫最合适?

在sqlplus中解鎖scott使用者,登入系統賬戶修改scott使用者密碼。

SQL> alter user scott account unlock;
使用者已更改。
SQL> alter user scott identified by 123456;
使用者已更改。
           

推薦這本《Oracle開發實戰經典》的理由有如下3點:

  • 個人閱讀了一些書籍都停留在Oracle11g;
  • 《Oracle開發實戰經典》不僅講了Oracle11g,還不包含了Oracle12c的内容;
  • 從C開始,Oracle開始布局雲端,我們也需要了解新版本的特性。

04 第四夜

第三夜的知識點并不多,對Oracle的安裝以及優勢進行了介紹,穿插着講了一些對表空間的操作。

我:小川啊,通過昨晚的探讨,Oracle的一些知識應該有所了解,希望下去好好實踐多部署幾次。

小川:是的,部署過一次,有很多地方不是很明白。

我:接下來就開始給你講講SQLserver方面的一些注意事項。

四、SQLserver

關于Windows平台的一些鏡像或者工具下載下傳,推薦去msdn itellyou這個小站去擷取,提供的都是原生純淨版的iso鏡像位址。這年頭,為愛發電的良心小站已經不多了。

https://msdn.itellyou.cn/

版本使用的較經典的三個版本,當然都是微軟家的那一套.NET(C#、Winform)

  • 第一版是比較久遠的SQLserver2005,當年入門學的第一門SQL語言就是SQLserver2005了,堪稱入門經典。
  • 第二版就是SQLserver2008了,在我的印象中使用還是比較廣的。
  • 第三版就是SQLserver2012了,新特性也有,也不算太老。

個人推薦,使用版本不老也不新的版本SQLserver2012。

2.1、安裝SQLserver2012

SQLserver的安裝很簡單,畢竟是微軟自家的,在Windows上安裝就不做描述了。

非要推薦,咱之前也寫了個粗糙的記錄,湊合着看看呗《【附帶Java采用JDBC連接配接資料庫】SQLServer2012的安裝與注意事項詳解》:

https://blog.csdn.net/Tolove_dream/article/details/118864855

登入驗證提供了兩種選擇方案:

  • Windows身份驗證
  • SQL server身份驗證,也就是使用者名和密碼驗證

注意:安裝的時候建議采取Windows身份驗證和SQL server身份驗證的混合模式。

互動使用,Windows平台全是中文的。有了之前SQL的基礎,相信很容易上手的。

05 第五夜

前四夜的知識點還是很豐富的。需要下去認認真真、踏踏實實地實際操作,多多練習并加以了解。必要的時候學會舉一反三,在實際工作中靈活運用。

我:小川,今晚的知識都是些不可多得的工作經驗,需要好好記住。

小川:好的,具體都有哪些呢?

我:接下來就開始給你講講國創達夢資料庫方面的一些注意事項。

五、達夢資料庫(抓重點)

原本打算專門出一篇進行總結歸納的,現在就整合到一篇文章中了,便于大家參考。

tips:對于使用過Oracle的小夥伴來說,使用達夢更容易上手,是相容Oracle的。無論是在Windows平台還是Linux平台,請找到dm.ini檔案。建議開啟相容Oracle模式,設定值為2:

#這是Windows平台dm.ini配置檔案所在目錄
D:\software\dmdbms\data\DAMENG
#linux下預設安裝在opt目錄中
$ /opt/dmdbms/data/DAMENG
#在dm.ini檔案中找到COMPATIBLE_MODE,設定值為2,相容Oracle
COMPATIBLE_MODE  = 2 #Server compatible mode, 0:none, 1:SQL92, 2:Oracle, 3:MS SQL
           

無論是在Windows平台還是在Linux平台,在dm.ini檔案中找到COMPATIBLE_MODE,設定值為2,相容Oracle。都是通過對dm.ini配置檔案進行設定參數COMPATIBLE_MODE去相容其它資料庫。

以我熟悉的達夢資料庫來說明,目前逐漸開始推廣DM8。

  • 其中一種版本是DM7;
  • 另一種版本是目前最新版的DM8,也是鄙人接觸的第一個版本的達夢資料庫。

2.1、Windows平台安裝DM8

官方有提供DM8安裝手冊,在官網進行注冊登入即可下載下傳,安裝請進行參考:

DM8官網直通車:https://www.dameng.com/view_61.html

DM8安裝手冊.pdf

登入到disql,預設自帶的指令視窗,支援絕大部分操作。值得注意的是在銀河麒麟版本的DM8中預設沒有開啟自動送出事務(commit),需要手動送出事務(commit)。

D:\software\dmdbms\bin\DIsql.exe
disql V8
使用者名:SYSDBA
密碼:
伺服器[LOCALHOST:5236]:處于普通打開狀态
登入使用時間 : 5.466(ms)
SQL> 
           

在Windows平台安裝達夢資料庫,選擇安裝帶有管理用戶端的安裝包。在我們安裝的資料庫目錄下有doc目錄和tool目錄,作用如下:

  • doc目錄:存儲達夢資料庫的官方文檔,無論是DBA還是開發人員,都可以參考。
  • tool目錄:主要存放一些管理工具。比如manager管理用戶端、DTS資料遷移工具。
D:\software\dmdbms\tool\manager.exe
D:\software\dmdbms\tool\dts.exe
           

2.2、Linux下安裝DM8

看完整個DM8的使用過程,你會發現其實與标準的SQL使用時差不多的。隻是多了一些注意事項,安裝需要注意一下。

關于安裝隻提重點,請注意先執行個體化資料庫,再注冊腳本服務,Linux發行版Redhat系列環境參考:

#初始化,資料庫執行個體化,這裡注意進入dminit目錄,一般在/opt/dmdba/dmdbms/bin下面
./dminit PATH=/opt/dmdba/dmdbms/data
#進入對應腳本目錄,個人ARM架構銀河麒麟V10腳本服務所在位置 
cd /opt/dmdba/dmdbms/script/root/
#1.通過指定服務類型注冊服務
./dm_service_installer.sh  -t dmserver -dm_ini /opt/dmdba/dmdbms/data/DAMENG/dm.ini -p DMSERVER
#2.通過服務腳本注冊服務
./dm_service_installer.sh -s /opt/dmdba/dmdbms/bin/DmServiceDMSERVER
           

初始化,資料庫執行個體化,這裡注意進入dminit目錄,一般在/opt/dmdba/dmdbms/bin下面。然後進入對應腳本目錄,個人ARM架構銀河麒麟V10腳本服務所在位置。通過指定服務類型注冊服務或者通過服務腳本注冊服務。更多安裝詳細步驟請參考達夢官方文檔喲。

DM8一些參考文獻

官方有提供DM8安裝手冊,在Linux環境安裝請進行參考:

DM8_Linux服務腳本使用手冊.pdf

DM8備份與還原.pdf

DM8_DIsql使用手冊.pdf

在某些特定環境,disql真的幫了大忙。以上推薦參考額幾個文檔,是我平時在工作中參考的比較頻繁的,希望對你有所幫助。

你也可以參考我寫的博文。雖說有點混亂,湊活着看呗,但畢竟是親身部署過兩次的經曆:

【arm架構】銀河麒麟V10部署DM8資料庫

https://blog.csdn.net/Tolove_dream/article/details/119395777

依據個人真實作場部署實施使用經驗編寫,不可多得的關于安全版(特供版)的使用經驗。

終端啟用用戶端:

  • manager:Linux下達夢資料庫管理用戶端
  • dts:Linux下達夢資料庫資料遷移工具
$ /opt/dmdbms/bin/tool/manager &
$ /opt/dmdbms/bin/tool/dts &
           

tips:建議配合nohup與&啟動并輸出指定日志

3、DM8實戰注意事項

  • 伺服器是特供版
  • 資料庫也是特供版

DM8資料庫的操作(安全版、也稱特供版)。理一下思路

SYADBA

SYSSSO

權限區分的明明白白,就如同Linux作業系統權限足夠透明,分工明确。

必須用SYSDBA使用者執行的操作

1、隻能使用SYSDBA使用者建立普通使用者

CREATE USER TEST;
           

2、授權DBA給TEST使用者(這裡強調一下,權限遵循最小範圍内滿足即可的原則)

GRANT DBA TO TEST;
           

3、建立預設表空間并且設定大小為1024,建議根據實際應用情況設定表空間大小,可以參考官方文檔。

CREATE TABLESPACE TEST DATAFILE '/opt/dmdbms/data/DAMENG/TEST.dbf' size 1024;
           

4、授權resource,public給使用者

GRANT RESOURCE,PUBLIC TO TEST;
           

必須用SYSSSO使用者執行的操作

1、隻能使用安全使用者的操作:

  • 設定密碼、修改密碼;
  • 解鎖使用者;
  • 賦予表空間。

2、給建立的使用者TEST設定密碼

ALTER USER TEST IDENTIFIED BY 'SYSOFT1234';
           

3、賦予預設表空間TEST

ALTER USER TEST default tablespace TEST;
           

4、密碼限制等問題處理,當然這些操作可以在管理用戶端上進行,中文支援也很友好。

ALTER USER TEST LIMIT password_life_time UNLIMITED,
PASSWORD_LOCK_TIME UNLIMITED, 
PASSWORD_GRACE_TIME UNLIMITED, 
FAILED_LOGIN_ATTEMPS UNLIMITED,
PASSWORD_REUSE_TIME UNLIMITED,
PASSWORD_REUSE_MAX UNLIMITED;
           

通過五晚的知識交流,小川現在也能在工作中積極的運用所學知識。時不時還喊着老哥老哥,與我套近乎。想get到更多的知識點,這點小九九我還能不清楚嗎?當然是開個玩笑,我一向是樂于助人的。

持續更新優化中...

總結

以後優先釋出到微信公衆平台。我的微信公衆号與其他平台昵稱同樣是龍騰萬裡sky。能看到這裡的,都是帥哥靓妹。以上就是此次文章的所有内容的,希望能對你的工作有所幫助。感覺寫的好,就拿出你的一鍵三連。如果感覺總結的不到位,也希望能留下您寶貴的意見,我會在文章中進行調整優化。

為什麼要學SQL,入門選擇哪款關系型資料庫最合适?

原創不易,轉載也請标明出處和作者,尊重原創。不定期上傳到github或者gitee。認準龍騰萬裡sky,如果看見其它平台不是這個ID發出我的文章,就是轉載的。linux系列文章:《初學者如何入門linux,原來linux還可以這樣學》已經上傳至github和gitee。個人github倉庫位址,一般會先更新PDF檔案,然後再上傳markdown檔案。如果通路github太慢,可以使用gitee進行克隆。

https://github.com/cnwangk/SQL-study

作者:龍騰萬裡sky