SQL是什麼?

龍騰萬里sky發表於2022-01-25

前言

:小川,聽說你對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官網下載地址: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_schemamysqlperformance_schema這三個資料庫;
  • 其它的比如av、sakilaworld、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、連線工具介紹

推薦幾個比較常用的工具:phpMyAdminSQLyogMySQL Workbench、Navicat視覺化工具進行連線操作。工具的使用是其次的,更重要的在於對MySQL命令語句的運用。

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

連結: https://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、常用網路資源

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安裝與優化》:

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

展示一下我登入的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映象地址。這年頭,為愛發電的良心小站已經不多了。

https://msdn.itellyou.cn/

1、版本

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

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

2、入門

個人推薦,使用版本不老也不新的版本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去相容其它資料庫。

1、版本

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

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

2、入門

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安裝手冊.pdf

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資料庫的操作(安全版、也稱特供版)。理一下思路SYADBASYSSSO許可權區分的明明白白,就如同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進行克隆。

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

作者:龍騰萬里sky

相關文章