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語言了。
正文
推薦入門首選的關係型資料庫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語句的分類。
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是啥呀!

我:波老師啊,很出名的一位老師,很大、很白。
想啥呢?回到正題,抓緊搞定基本的操作。
小川:嗯嗯,我也對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官網下載地址://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
在所有的關係型資料庫中,我提醒你要注意的一點是,都有個很重要的過程就是資料庫的實例化,沒有實例化是無法啟動資料庫服務的。更多安裝方式可以參考菜鳥教程進行安裝://www.runoob.com/mysql/mysql-install.html
MySQL資料庫的安裝配置與Oracle資料庫相比要簡單的多。下載完後並完成安裝,MySQL的官網也提供了示例資料庫和Oracle提供的scott用戶下的emp和dept類似。你可以到官網獲取MySQL提供的資料庫示例sakila和world,然後進行導入到資料庫中。
也給出MariaDB的下載地址://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 | 允許長度0~65535位元組,值的長度+2個位元組。 |
| MEDIUMTEXT | 允許長度0~16,777,215位元組,值的長度+3個位元組。 |
| 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示例喲!
鏈接: //pan.baidu.com/s/11gIlZKxoTG5BCCcoXdVJRg 提取碼: ntu7
給出一個使用Navicat逆向生成的示例資料庫world的模型:

如果真的要使用到建物理模型:推薦你學習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官網下載地址://dev.mysql.com/downloads/
- 目前最權威的MySQL資料庫以及工具在線手冊://dev.mysql.com/doc/
- MySQL發布的bug列表://bugs.mysql.com/
03 第三夜
第二夜的知識點對MySQL進行了簡單的介紹,也需要下去踏踏實實的實際操作。尤其是核心知識:視圖、函數、存儲過程以及觸發器。
我:小川啊,通過昨晚的探討,MySQL的一些知識應該掌握不少了吧。
小川:大概入了個門,需要消化消化。
我:接下來就開始給你講講Oracle方面的一些注意事項,也是公司主要使用的資料庫,目前依舊以Oracle11g為主。
小川:嗯嗯,並點了點頭。拿出了小本本開始記錄...
三、Oracle
1、版本
Oracle主要分為兩種版本,目前貌似逐漸從Oracle11g轉向Oracle19c了。
- 其中一種是帶g結尾的,比如現在依舊使用廣泛的Oracle11g
- 另外一種就是帶c結尾的,以標誌性的Oracle12c為代表。加入了很多新特性,對雲端(cloud)支援更友好。
這年頭互聯網的下一個風口浪尖,絕對是瞄準了雲(雲計算、雲原生)。
2、入門
2.1、安裝
Windows下安裝Oracle的過程,就不詳細介紹了,給出三點注意事項:
- 資料庫軟體的安裝(一般選企業版,就算個人使用你也不會去選標準版之類的)
- 資料庫監聽程式配置(以管理員身份運行):Net Configuration Assistant
- 資料庫實例化(以管理員身份運行):Database Configuration Assistant
Linux下部署Oracle可以參考我之前的博文《【linux環境】Oracle11g以及Oracle19c基於centos7安裝與優化》:
//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

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

- 列、數據、約束條件;
- 授權、統計資訊、觸發器;
- 閃回技術、相關性、詳細資料、索引以及SQL
我沒有放截圖,圖片不宜過多,所以就用文字描述出來了,希望不要介意喲。
2.4、PLSQL Developer工具

我相信在實際工作中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;

值得注意的是VARCHAR2欄位屬性在Oracle中支援,但在MySQL中是不支援的。
Oracle中的rowid偽列,在plsqldev工具中點擊帶鎖的標誌即可進行編輯數據。這裡以scott用戶為例子進行展示:
select t.*,t.rowid from scott.dept t;

在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鏡像地址。這年頭,為愛發電的良心小站已經不多了。
1、版本
版本使用的較經典的三個版本,當然都是微軟家的那一套.NET(C#、Winform)
- 第一版是比較久遠的SQLserver2005,當年入門學的第一門SQL語言就是SQLserver2005了,堪稱入門經典。
- 第二版就是SQLserver2008了,在我的印象中使用還是比較廣的。
- 第三版就是SQLserver2012了,新特性也有,也不算太老。
2、入門
個人推薦,使用版本不老也不新的版本SQLserver2012。
2.1、安裝SQLserver2012
SQLserver的安裝很簡單,畢竟是微軟自家的,在Windows上安裝就不做描述了。
非要推薦,咱之前也寫了個粗糙的記錄,湊合著看看唄《【附帶Java採用JDBC連接資料庫】SQLServer2012的安裝與注意事項詳解》:
//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去兼容其它資料庫。
1、版本
以我熟悉的達夢資料庫來說明,目前逐漸開始推廣DM8。
- 其中一種版本是DM7;
- 另一種版本是目前最新版的DM8,也是鄙人接觸的第一個版本的達夢資料庫。
2、入門
2.1、Windows平台安裝DM8
官方有提供DM8安裝手冊,在官網進行註冊登錄即可下載,安裝請進行參考:
DM8官網直通車://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安裝手冊.pdf
DM8_Linux服務腳本使用手冊.pdf
DM8備份與還原.pdf
DM8_DIsql使用手冊.pdf
在某些特定環境,disql真的幫了大忙。以上推薦參考額幾個文檔,是我平時在工作中參考的比較頻繁的,希望對你有所幫助。
你也可以參考我寫的博文。雖說有點混亂,湊活著看唄,但畢竟是親身部署過兩次的經歷:
【arm架構】銀河麒麟V10部署DM8資料庫
//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。能看到這裡的,都是帥哥靚妹。以上就是此次文章的所有內容的,希望能對你的工作有所幫助。感覺寫的好,就拿出你的一鍵三連。如果感覺總結的不到位,也希望能留下您寶貴的意見,我會在文章中進行調整優化。

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

