當你登陸你的QQ帳號和別人吹水的時候,當你期末交做業去度娘複製的時候,當你在工做中登陸一些網站的時候,再好比當你查看本身幾乎沒有什麼餘額的銀行卡的時候(捂臉),或許本身也沒注意,(非須要,大部分人也不想注意哈哈哈)咱們一直都在以某種方式與數據庫打交道,或許你是一個開發人員,也或許你也只是一個普通的用戶,數據庫與咱們的生活息息相關,做爲一名程序員,如今學習 MySQL 和 Oracle 的會多一些,像微軟的 SQL Server 之前配合 asp 的時候用的仍是挺多的,不過如今就沒那麼流行了,mysql
因此咱們先從 MySQL 講起,同時文章中穿插一些 SQL 的基本概念,我以爲能更好的理解這幾種 SQL 型數據庫哈程序員
關於 MySQL 的幾篇文章,在前一年左右大概更新過幾篇,可是都差強人意,因此最近加班加點,從新將 MySQL 相關的,例如語法、約束、事務等等從新整理一遍,第一篇先來看一下入門的一些語法和操做sql
既然你都打開這篇文章了,那你就註定不是一個村民,這一局咱們跳 Java 程序員!數據庫
開發學習中,想知足一些需求,與數據打交道這可太頻繁了,如何存儲這些數據就是你考慮的問題了,固然不考慮性能,管理、安全等等,你的選擇可就多了,存個 txt,存個xml,甚至還能夠存個excel等等,有位剛入門朋友曾經問過我這樣一個問題 「他在學習IO的一些技術的時候,經常會簡單的保存一些數據到 .txt 文件中,爲何還須要數據庫呢?」,這樣的一些小Demo,你們在Java基礎的學習中應該都是作過的,那麼咱們下面就從這個問題講起~安全
假定咱們將數據所有存儲在一個普通文件中(data.txt)_(以逗號間隔)微信
...... "Eminem",male,1972,"USA" "Rihanna",female,1988,"Barbados" "Taylor Swift",1989,female,"USA" "Aavril Lavigne",1984,female,"Canada" ......
若是在咱們的數據極爲龐大的狀況下,咱們須要查詢其中的一些數據,例如,查詢Eminem的國籍,咱們通常會使用遍歷,可是毫無疑問,這個響應時間會變得極其緩慢,可是使用數據庫後,它所提供的一些索引技術等就能夠解決這樣的問題併發
"Rihanna",female,1988,"Barbados" "Rihanna",female,1995,"USA"
若是數據中出現了重名的狀況,又如何判斷是否是同一我的呢?函數
若是data.txt文件中的數據被錯誤的修改,例如出生年份被修改成其餘類型字符串這種無效表達怎麼辦?工具
或許你能夠在程序中寫一些邏輯判斷語句進而篩選處理這些問題,可是仍舊在數據較爲龐大的狀況下,會出現各類各樣的問題,增長了開發者的開發難度,而數據庫自己就制定了一些約束,從而保證了數據的完整且,有效,從而使開發者只須要更加註重於程序自己的設計,而不用花費過多的時間去處理數據上的一些細節問題性能
經常使用來簡單存儲數據的 txt/excel 等均屬於單一文件,而且都是沒法共享的,只支持當前用戶使用而且修改
而數據庫則容許用戶共享,不一樣的用戶能夠同時存取數據庫中的數據,用戶也能夠用各類方式經過接口使用數據庫,並提供數據共享
在咱們前者中,數據的修改是很隨意的
可是在實際開發中,咱們有時候須要面臨,多個用戶檢索、修改同一文件中的數據,或者在併發狀況下,寫同一文件或者記錄,而數據庫基於鎖等的一些技術即可以幫助咱們解決這些問題
因爲邏輯或者物理上的錯誤,致使了系統的錯誤操做,從而使得數據被破壞,如何快速恢復數據,咱們上面的單一文件系統顯然沒法幫助咱們解決問題,而數據庫卻有相關機制去彌補、處理相關問題
上面咱們僅僅從幾個常見的點分析了爲何使用數據庫,固然遠遠不止這些,因此總的來講就是數據庫其特殊的存儲以及管理方式,既提升了效率,也極大的減小了開發人員的負擔
總結一下:數據庫 em... 是個好東西!
至於安裝的部分,這裏就不說起了,不然篇幅會過於的長,不管是選擇安裝版本也好,免安裝的壓縮包也好,選對版本,裝好就好了,能夠去網上參考一些教程,至於版本 5.5 -> 5.6 -> 5.7 -> 8 都是能夠的,畢竟只是單純的學習 MySQL,不用過多的考慮和 Java 等的版本或者配置問題,我這臺機器版本爲 5.7 哈
同時今天演示的全部內容,直接在 cmd 命令行中執行也能夠,直接使用一些圖形化工具,例如 Navicat、SQLyog 等等都是能夠的,圖形化工具看數據會更舒服一些,可是即便圖形化工具中,入門的學習,我仍是極其不推薦直接點擊按鈕,執行建立插入等等操做,過於依賴圖形界面,會讓你的惰性變得更加的大,對在高級語言中本身寫 SQL 也是百害無一利,必定要本身書寫,執行,才能更好的理解與學習哈
首先登陸以前須要啓動,相關的 MySQL 服務,有兩種方式
一、經過服務窗口設置
二、經過命令啓動
net start mysql : 啓動mysql的服務
net stop mysql : 關閉mysql服務
一、安裝版 點擊 MySQL 5.7 Command Line Client 後輸入密碼便可(安裝後就有,能夠看任務欄)
二、經過命令行
三、命令行示例:
① mysql -u用戶名 -p密碼
② mysql -u用戶名 -p
③ mysql -h 地址 -P 端口 -u用戶名 -p
舉例:用戶名:root,密碼:root99
mysql -uroot -proot99
mysql -uroot -p
mysql -h 192.168.3.144 -P 3306 -uroot -p
一、 exit
二、quit
Structured Query Language:結構化查詢語言
SQL就是訪問和處理關係數據庫的計算機標準語言,它定義了操做全部關係型數據庫的規則
雖然 SQL 的語法標準不少部分能夠直接在其餘 DBMS 上使用,不過大部分數據庫在SQL的標準上進行了擴展。而每一種數據庫操做的方式存在不同的地方,稱爲「方言」
但凡涉及到關係型數據庫就離不開SQL,例如在電商網站中存入商品信息,遊戲中存儲裝備道具信息等
常見的關係型數據庫:MySQL 、Oracle、Microsoft SQL Server、Microsoft Access、DB二、
商用:Oracle、DB二、Microsoft SQL Server
開源:MySQL
桌面:Microsoft Access
常見的非關係型數據庫:Cloudant、MongoDb、Redis、HBase
總之:SQL 是一種強力的語言,咱們能夠經過必定簡潔的語法,實現各類複雜的需求
一、SQL語句 單行或多行書寫,以分號結尾,而且可使用空格和縮進來加強語句的可讀性
二、MySQL 數據庫的 SQL 語句不區分大小寫,關鍵字建議使用大寫
三、三種註釋
-- 註釋內容 # 註釋內容 (這是MySQL獨有的)
/* 註釋內容 */
分類 | 做用 |
---|---|
數據定義語言——DDL(Data Definition Language) | 容許用戶定義 (建立) 數據庫對象:數據庫,表,列等 |
數據操做語言——DML(Data Manipulation Language) | 容許用戶對數據庫中表的數據進行增刪改 |
數據查詢語言——DQL(Data Query Language) | 容許用戶查詢數據庫中表的記錄(數據) |
數據控制語言——DCL(Data Control Language) | 用來定義數據庫的訪問權限和安全級別,及建立用戶 |
其實這部分語法的介紹,圍繞的就是 CURD
這一部分例如建立、查詢、使用數據庫是比較經常使用的,可是對於數據庫的操做並不會很頻繁,通常初期設置好後,不多會去修改數據庫,因此這一部分,快速瞭解就行了,標題中標 ※ 符號的要會用
一、建立數據庫
CREATE DATABASE 數據庫名稱;
舉例:
mysql> CREATE DATABASE mysql_grammar_test; Query OK, 1 row affected (0.12 sec)
二、建立數據庫,判斷不存在,再建立
CREATE DATABASE IF NOT EXISTS 數據庫名稱;
三、建立數據庫,而且制定字符集
CREATE DATABASE 數據庫名稱 CHARACTER SET 字符集名;
一、修改數據庫的字符集
ALTER DATABASE 數據庫名稱 CHARACTER SET 字符集名稱;
查詢全部數據庫名稱
SHOW DATABASES
查詢某個數據庫的字符集
SHOW CREATE DATABASE 數據庫名稱;
舉例:
mysql> SHOW CREATE DATABASE mysql_grammar_test; +--------------------+-----------------------------------------------------------------------------+ | Database | Create Database | +--------------------+-----------------------------------------------------------------------------+ | mysql_grammar_test | CREATE DATABASE `mysql_grammar_test` /*!40100 DEFAULT CHARACTER SET utf8 */ | +--------------------+-----------------------------------------------------------------------------+ 1 row in set (0.00 sec)
一、刪除數據庫
DROP DATABASE 數據庫名稱;
二、判斷數據庫存在,存在再刪除
DROP DATABASE IF EXISTS 數據庫名稱;
關於數據庫經常使用的增刪改查就說完了,下面要開始講解關於表和數據了,可是咱們必須指定使用的數據庫,才能夠針對這個數據進行一些操做表或數據等等操做
一、查詢當前正在使用的數據庫名稱
SELECT DATABASE();
二、使用數據庫
USE 數據庫名稱;
符號規定:下面展現一些定義的時候,爲簡便理解,使用中文配合符號表述(會有具體舉例,不用擔憂理解不了)
<>
中的內容爲實際的語義[]
中的內容爲任選項(不填寫也可){}
中的內容必須顯式的指定|
爲選項符[,...n]
表示前面的項能夠重複屢次SQL 語言經過定義一個關係所對應的基本表來完成關係模式的定義,其語句格式爲:
CREATE TABLE 表名( <列名1> <數據類型1> [<列級完整約束條件>], [<列名2> <數據類型2> [<列級完整約束條件>],...], [<表級完整約束條件>] );
固然了你看完這個定義可能一會兒很差理解,我在後面,會就着一個實際的例子,來和你們講解,在此以前有兩個重要的知識須要補充:
關係中的每個屬性,都來自一個域,它的取值必須是域中的值,而在 SQL 中,這個域的概念,用數據類型來實現,就好比,咱們定義的這一列數據都只能是 8個單位長度之內的字符串
下面列了幾種常見的數據類型
數據類型 | 含義 |
---|---|
CHAR(n) | 長度爲 n 的定長字符串 |
VARCHAR(n) | 最長度爲 n 的邊長字符串 |
INT 或 INTERGER | 長整數 |
SMALLINT | 短整數 |
DOUBLE(6,3) | 雙精度浮點數,表明共保留6位數字,小數點後保留3位(也可不設置直接使用) |
FLOAT(n) | 浮點數,精度至少爲 n 位數字(也可不設置直接使用) |
DATE | 日期,只包含年月日,yyyy-MM-dd |
TIMESTAMP | 時間戳類型,包含年月日時分秒,yyyy-MM-dd HH:mm:ss |
約束,就是針對屬性值的一些約束條件,只針對某一列,叫作列級約束、針對多列屬性的約束,叫作表級約束,怎麼理解呢?就例如某一列叫作 學號,咱們就指定約束,這一行不容許爲 NULL 等等
約束要想說清楚,仍是須要一點篇幅的,同時例如外鍵約束等,就會引伸出一些多表之間的問題,爲了簡便,在這一篇入門文章中就不寫關於約束以及多表的問題了,我後面兩篇將這部分相關的內容
簡單解釋一下,建立一個學生表,其中有這麼幾個字段(列)學號、姓名、年齡、出生日期、成績、插入時間,指定 stu_id 也就是學號做爲主鍵,至於一些非空或者 id 自增我都沒有設置哈
CREATE TABLE student( stu_id INT, stu_name VARCHAR(32), stu_age INT, stu_birthday DATE, stu_score DOUBLE(4,1), stu_insert_time TIMESTAMP, PRIMARY KEY(stu_id) );
一、修改表名
ALTER TABLE 表名 RENAME TO 新表名;
二、修改列名稱和類型
ALTER TABLE 表名 CHANGE 列名 新列名 新數據類型;
三、修改類型
ALTER TABLE 表名 MODIFY 列名 新數據類型;
四、修改表的字符集
ALTER TABLE 表名 CHARACTER SET 字符集名稱;
五、添加一列
ALTER TABLE 表名 ADD 列名 數據類型;
一、查詢某個數據庫中全部的表名
SHOW TABLES;
二、查詢表結構
DESC 表名;
DROP TABLE 表名; Drop TABLE IF EXISTS 表名;
這一塊的內容,實際上纔是咱們通俗意義上的增刪改查,這一塊也是用的最多的,畢竟數據庫和表,通常初期都會設計好,除非臨時有大的需求變動,不然不多會去修改
一、基本語法:
INSERT INTO 表名(列名1,列名2,...列名n) VALUES(值1,值2,...值n);
二、舉個例子
就用上面建立的學生表
INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1001,'張三',20,'2020-05-30',66.6,'2020-05-30 19:00:35');
三、注意
Column count doesn't match value count
一、基本語法
DELETE FROM 表名 [WHERE 條件]
刪除數據的條件就很靈活了,在這個部分,我給你們列幾種例子,例如在插入這樣三條記錄的基礎上
INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1001,'張三',20,'2020-05-30',66.6,'2020-05-30 19:00:35'); INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1002,'李四',25,'2020-05-30',66.6,'2020-05-30 19:00:35'); INSERT INTO student(stu_id, stu_name, stu_age, stu_birthday, stu_score, stu_insert_time) Values(1003,'王五',16,'2020-05-30',66.6,'2020-05-30 19:00:35');
DELETE FROM student WHERE stu_id = 1001;
DELETE FROM student WHERE stu_name = '張三';
DELETE FROM student WHERE stu_age >= 20;
二、刪除全部數據
若是不填寫刪除語句中的條件部分,則會刪除表中的全部數據
DELETE FROM 表名;
可是這種方式並不推薦,由於這種方式下有多少條記錄就會執行多少次刪除操做,數據量大的狀況下,效率很低
推薦使用
TRUNCATE TABLE 表名;
它的機制是,先刪除掉整個表,而後再建立一個空的,與原來同樣的表,效率會更高一些
UPDATE 表名 SET 列名1 = 值1, 列名2 = 值2,... [WHERE 條件];
關於修改數據,通常狀況下,都是經過在條件中,指定某個 id 值,而後去修改,由於這個 id 值通常都是主鍵,能肯定惟一數據
UPDATE student SET stu_birthday = '2020-02-22', stu_score = 90.8 WHERE stu_id = 1001;
你本身測試的時候能夠發現,換種寫法即便不指定 WHERE stu_id = 1001
彷佛也能執行成功
UPDATE student SET stu_id = 1001, stu_birthday = '2020-02-22', stu_score = 90.8;
這是由於前面咱們已經傳入了主鍵 stu_id = 1001
,通常咱們修改數據仍是在後面設置條件更多
UPDATE student SET stu_id = 1001, stu_name = '張三', stu_age = 20, stu_birthday = '2020-01-01', stu_score = 90.8, stu_insert_time = '2020-02-22' WHERE stu_id = 1001;
也就是,不須要更新的也列了出來,只不過更新的值沒有變化而已,這樣能夠知足用戶各類的修改狀況,這部份內容,在 JDBC 的相關文章中才是重點,這裏也不過多說起了
這一塊內容比較多,單獨摘出來講,多說一句,這一塊的內容,還只是涉及到單表的查詢,至於多表複雜的查詢,會在下一篇講完約束之後提到
這個很是經常使用,*
表明全部,而後 FROM 指定表名就能夠了,它會將全部記錄的完整信息列出來
SELECT * FROM 表名;
提一個小 Tips ,若是特別注重效率的話例如在 MyBatis 配合插件,就會直接使用插件生成的 Base_Column_List ,做爲查詢的值,這個Base_Column_List 就表明全部的字段(列),用 * 若是後期字段存在增加的問題,在必定程度上這樣的書寫方式會提升一些效率,可是就普通的項目而言,實際上,也沒有太大關係
若是隻須要查詢指定的幾個字段,能夠經過下面的方法,列出指定字段,經過逗號分隔
SELECT 字段名1,字段名2... FROM 表名;
一、全部的條件查詢語句,都是基於 WHERE 進行使用的
二、WHERE 後配合各類運算符,就能夠靈活的實現不少查詢需求
> 、< 、<= 、>= 、= 、<>
IS NULL 或 IS NOT NULL
AND 或 &&
BETWEEN...AND
OR 或 ||
NOT 或 !
IN( 集合)
LIKE:模糊查詢
_
:單個任意字符佔位符%
:多個任意字符佔位符三、舉些例子
SELECT * FROM student WHERE stu_score != 66.6; SELECT * FROM student WHERE stu_score <> 66.6;
-- 查詢哪些學生成績字段爲 NULL SELECT * FROM student WHERE stu_score IS NULL; -- 查詢哪些學生成績字段不爲 NULL SELECT * FROM student WHERE stu_score IS NOT NULL; -- 這是一種錯誤的寫法,NULL的判斷是不能用等號的 SELECT * FROM student WHERE stu_score = NULL; (錯誤!!!)
SELECT * FROM student WHERE stu_score >=60.0 AND stu_score <= 80.0; SELECT * FROM student WHERE stu_score >=60.0 && stu_score <= 80.0; SELECT * FROM student WHERE stu_score BETWEEN 60.0 AND 80.0;
SELECT * FROM student WHERE stu_score = 40.0 OR stu_score = 90.8; SELECT * FROM student WHERE stu_score = 40.0 || stu_score = 90.8; SELECT * FROM student WHERE stu_score IN (40.0,90.8);
這裏要注意了,我上面在 OR 中使用 = 測試,是爲了引出 IN 的這個使用方式,可是就沒有很好的體現出 OR 和 AND 的區別了
SELECT * FROM student WHERE stu_score >= 60.0 OR stu_score <= 80.0;
它的意思是先查詢到成績 >= 60.0 的全部數據,而後再查詢到成績 <= 80.0 的全部數據,這一點要注意哦
SELECT * FROM student WHERE stu_name LIKE '張%';
SELECT * FROM student WHERE stu_name LIKE '_四%';
_
)SELECT * FROM student WHERE stu_name LIKE '____';
SELECT * FROM student WHERE stu_name LIKE '%五%';
咱們不少時候,查詢到的數據都是按照主鍵,例如 id 爲順序的,不過若是咱們想要查詢到的數據按照必定的方式排序,就用到了 ORDER BY 這個語句,語法以下
ORDER BY 排序字段1 排序方式1 ,排序字段2 排序方式2... -- 排序方式: ASC:升序,默認的。 DESC:降序
注意:
一、只有排序字段1的值相同時,纔會執行排序字段2,若是沒有排序字段2,則按照主鍵默認排序
二、默認的排序方式是升序,即由低到高
SELECT * FROM student ORDER BY stu_score DESC;
SELECT * FROM student ORDER BY stu_score DESC, stu_age ASC;
一、基本語法
GROUP BY 分組字段
SELECT stu_age, AVG(stu_score), COUNT(stu_id) FROM student WHERE stu_score > 60 GROUP BY stu_age;
說明:AVG 方法是求平均值的,COUNT 方法是求個數的
這個可能很差理解,一樣配個圖,先看一下全部的數據,有7位同窗,年齡只有18以及20這兩個,固然通常用男女或者班級,系別等區分會更加貼近現實,我只是懶得,再建立一張表了,就姑且用年齡演示就行了
能夠看到對應的一些值就查到了,而且不及格的同窗並無參與到分組中
SELECT stu_age, AVG(stu_score), COUNT(stu_id) FROM student WHERE stu_score > 60 GROUP BY stu_age HAVING COUNT(stu_id) > 2;
這個地方就要引入一個新的概念,就是 HAVING
WHERE 和 HAVING 有什麼區別呢?
執行結果:
聚合函數補充:
聚合函數:將一列數據做爲一個總體,進行縱向的計算,儘可能選擇不爲空的列進行計算,不然就須要使用 IFNULL 函數進行判斷
COUNT:計算個數 -- 通常選擇非空的列:主鍵 MAX:計算最大值 MIN:計算最小值 SUM:計算和 AVG:計算平均值
若是查詢到的數據太多,在同一個頁面上顯示,很麻煩,分頁查詢就能夠解決這個問題
一、基本語法
limit 開始的索引,每頁查詢的條數;
二、基本書寫公式套路
開始的索引 = (當前的頁碼 - 1) * 每頁顯示的條數
SELECT * FROM student LIMIT 0,2; -- 第1頁 SELECT * FROM student LIMIT 2,2; -- 第2頁 SELECT * FROM student LIMIT 4,2; -- 第3頁 SELECT * FROM student LIMIT 6,2; -- 第4頁
我暫時表中有7條數據 id 從 1001-1007 ,因此例如我執行顯示第二頁的語句,就會顯示 id 爲1003 以及 1004 的數據
另外,LIMIT 是一個MySQL"方言",在其餘數據庫中就不支持了,可是不一樣的數據庫,都會有一些替代的寫法
若是文章中有什麼不足,歡迎你們留言交流,感謝朋友們的支持!
若是能幫到你的話,那就來關注我吧!若是您更喜歡微信文章的閱讀方式,能夠關注個人公衆號
在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤一個堅持推送原創開發技術文章的公衆號:理想二旬不止