上海網(wǎng)站建設公司 1861webgoogle search
?
目錄
1、什么是數(shù)據(jù)庫
2、 數(shù)據(jù)庫基本操作
2.1 查看當前數(shù)據(jù)庫
2.2 創(chuàng)建一個數(shù)據(jù)庫
2.3 選中數(shù)據(jù)庫
2.4 刪除數(shù)據(jù)庫?
3、常見的數(shù)據(jù)類型
3.1 數(shù)值類型?
3.2 字符串類型
3.3 日期類型?
4、表的操作
4.1 創(chuàng)建表
4.2 查看指定數(shù)據(jù)庫下的所有表
4.3 查看表的結構
4.4 刪除表
1、什么是數(shù)據(jù)庫
數(shù)據(jù)庫其實是一類軟件,這樣的軟件就能夠對數(shù)據(jù)進行操作,比如增刪改查。前面我們學習過的數(shù)據(jù)結構也是來管理數(shù)據(jù)的,數(shù)據(jù)呢也是基于數(shù)據(jù)結構實現(xiàn)出來的軟件。
數(shù)據(jù)庫大概可以分為兩類:
關系型數(shù)據(jù)庫:MySQL,Oracle,SQLServer,SQLite...
非關系型數(shù)據(jù)庫:Redis,MongoDB,HBase...
上述所說的呢,都是軟件,本專欄主要講解 SQL 這門編程語言,去操作 MySQL 數(shù)據(jù)庫。
一條 SQL 指令是可以換行的,以分號結尾即可。
2、 數(shù)據(jù)庫基本操作
數(shù)據(jù)庫的操作不區(qū)分大小寫!?
2.1 查看當前數(shù)據(jù)庫
MySQL中其實自帶了很多系統(tǒng)庫,使用 show databases; 就能查看當前所有的數(shù)據(jù)庫了:
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
-- 5 rows in set (0.00 sec)
上面顯示的除了 test 是博主創(chuàng)建的,其他的就是系統(tǒng)自帶的數(shù)據(jù)庫了,系統(tǒng)帶的庫可不要隨便亂動哦!
2.2 創(chuàng)建一個數(shù)據(jù)庫
create database 數(shù)據(jù)庫名;
比如說這里我們要創(chuàng)建一個 demo 數(shù)據(jù)庫,直接執(zhí)行上述的 SQL 語句即可:
create database demo;
-- Query OK, 1 row affected (0.00 sec)show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| demo |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
-- 6 rows in set (0.00 sec)
這里有個小細節(jié)不知道大家發(fā)現(xiàn)了沒有,創(chuàng)建數(shù)據(jù)庫的時候是 database,顯示所有數(shù)據(jù)庫是 databases,這里為啥,自然就不用博主解釋了吧,后續(xù)查看數(shù)據(jù)庫中所有表的操作也是類似的哦!
在創(chuàng)建數(shù)據(jù)庫的時候,也是可以指定字符集的:
create database 數(shù)據(jù)庫名 charset 字符集名;
如果創(chuàng)建數(shù)據(jù)庫名重復了會咋樣?
create database demo;
-- ERROR 1007 (HY000): Can't create database 'demo'; database exists
有一個辦法,可以解決報錯:
create database if not exists demo;
-- Query OK, 1 row affected, 1 warning (0.00 sec)
這樣寫就沒問題了,也就是不會報錯了,但是有一個警告,學習Java階段,我們知道一個程序中允許有 warning 但不允許有 error。
這樣寫的意思就是,如果存在了 demo 這個數(shù)據(jù)庫,那么就不創(chuàng)建了,沒有存在才創(chuàng)建 demo 數(shù)據(jù)庫,有小伙伴可能會問,這有啥用呢?不就是把 error 變成了 warning 嗎?
很多時候 SQL 是寫在文件中的,進行批量執(zhí)行,如果執(zhí)行過程中,某個操作報錯了,那么后續(xù)的代碼是無法執(zhí)行的,而 warning 是不影響的!
注意:數(shù)據(jù)庫的名字不能是 SQL 的關鍵字。?
2.3 選中數(shù)據(jù)庫
一個 MySQL 服務器上,數(shù)據(jù)庫是可以有多個的,要對數(shù)據(jù)庫進行操作,就需要先明確我們要操作的是哪個數(shù)據(jù)庫。
use demo;
-- Database changed
那么選中數(shù)據(jù)庫后,我們后面的操作都是針對這個 demo 數(shù)據(jù)庫來執(zhí)行的。
2.4 刪除數(shù)據(jù)庫?
drop database demo; -- drop database 數(shù)據(jù)庫名;
-- Query OK, 0 rows affected (0.01 sec)
注意:刪除數(shù)據(jù)庫是非常危險的一個操作,如果你刪的是測試環(huán)境的那還好,如果你刪的是生產(chǎn)環(huán)境的數(shù)據(jù)庫,那就可能會出問題了,可能有的人想到,反正有備份,但是雖然有備份,但是仍然是需要耗費大量時間的,一個公司的數(shù)據(jù)量可想而知。?
3、常見的數(shù)據(jù)類型
3.1 數(shù)值類型?
數(shù)據(jù)類型 | 大小 | 說明 |
---|---|---|
BIT[ (M) ] | M指定位 數(shù),默認 為1 | 二進制數(shù),M范圍從1到64, 存儲數(shù)值范圍從0到2^M-1 |
TINYINT | 1字節(jié) | |
SMALLINT | 2字節(jié) | |
INT | 4字節(jié) | |
BIGINT | 8字節(jié) | |
FLOAT(M,D) | 4字節(jié) | 單精度,M指定長度,D指定小數(shù)位數(shù),會發(fā)生精度丟失 |
DOUBLE(M,D) | 8字節(jié) | |
DECIMAL(M,D) | M/D最大 值+2 | 雙精度,M指定長度,D表示 小數(shù)點位數(shù)。精確數(shù)值 |
NUMERIC(M, D) | M/D最大 值+2 | 和DECIMAL一樣 |
數(shù)值類型可以定義成無符號(unsigned),表示不取負數(shù),但是沒這個必要,就比如對于 int 類型可能放不下的數(shù)據(jù) int unsigned 也可能放不下,不如直接采用 bigint 來的實在。
上述常用類型:int,double,decimal,bigint?
3.2 字符串類型
數(shù)據(jù)類型 | 大小 | 說明 |
---|---|---|
VARCHAR(SIZE) | 0-65,535字節(jié) | 可變長度字符串 |
TEXT | 0-65,535字節(jié) | 長文本數(shù)據(jù) |
MEDIUMTEXT | 0-16 777 215字節(jié) | 中等長度文本數(shù)據(jù) |
BLOB | 0-65,535字節(jié) | 二進制形式的長文本數(shù)據(jù) |
上述的 VARCHAR(128) 表示這個列最多存 128 個字符,但是這里也不是你寫了 128 就真的固定分配了這么多內(nèi)存,也會動態(tài)適應,但最大的內(nèi)存不會超過這個 128.
TEXT 和 MEDIUMTEXT 更適合于更長的字符串。BLOB 主要是存二進制數(shù)據(jù)的。
3.3 日期類型?
數(shù)據(jù)類型 | 大小 | 說明 |
---|---|---|
DATETIME | 8字節(jié) | 范圍從1000到9999年,不會進行時區(qū)的 檢索及轉換。 |
TIMESTAMP | 4字節(jié) | 范圍從1970到2038年,自動檢索當前時 區(qū)并進行轉換。 |
第二個目前就不推薦使用了,畢竟時間戳到 2038 年就用盡了。
4、表的操作
4.1 創(chuàng)建表
當我們要創(chuàng)建表的時候,要明確是哪個數(shù)據(jù)庫中創(chuàng)建,所以創(chuàng)建表的前提是,我們要選中需要操作的數(shù)據(jù)庫。
use demo;
-- Database changed
create table student(id int, name varchar(10));
-- Query OK, 0 rows affected (0.02 sec)
這里我們的學生表就創(chuàng)建完成了,創(chuàng)建表采用 create 這個命令,與創(chuàng)建數(shù)據(jù)庫是類似的,這里值得注意的是,我們定義字段是 字段名在前 字段類型在后,中間用空格隔開,每列中間用逗號隔開。
這里 varchar(10),這里面的10并不是表示10個字節(jié),而是表示10個字符,具體大小取決于你數(shù)據(jù)庫設定的字符集,要知道不同的字符集設定的每個字符大小可是不一樣的!這里在JavaSE有講到過。
同一個表中是不能存在兩張名字相同的表的:
create table student(id int);
-- ERROR 1050 (42S01): Table 'student' already exists
而且如上代碼可只,與列無關,純屬是表明不能相同!
表名和列名,不能和 SQL 關鍵字相同:
create table table (val int);
-- ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table (val int)' at line 1
這里發(fā)現(xiàn)報錯了,如果實在要表名或列名與關鍵字相同怎么辦呢?可以把表名或列名使用反引號引起來就行了,但是不推薦:
create table `table`(val int);
-- Query OK, 0 rows affected (0.02 sec)
英文千千萬,你何必非要跟關鍵字過意不去呢?
在創(chuàng)建表的時候也可以對字段增加說明,使用 comment 關鍵字:
create table student (id int comment '學號', name varchar(10) comment '姓名');
-- Query OK, 0 rows affected (0.02 sec)
使用如下指令就能查看已有表所有字段的注釋了:
show full columns from student;
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| id | int(11) | NULL | YES | | NULL | | select,insert,update,references | 學號 |
| name | varchar(10) | utf8_general_ci | YES | | NULL | | select,insert,update,references | 姓名 |
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
-- 2 rows in set (0.00 sec)
注意:MySQL 中不允許創(chuàng)建沒有任何列的表,這樣的表是沒有無意義的。
4.2 查看指定數(shù)據(jù)庫下的所有表
show tables;
+----------------+
| Tables_in_demo |
+----------------+
| student |
+----------------+
-- 1 row in set (0.00 sec)
那個跟 SQL 關鍵字重名的 table 表的我已經(jīng)刪了,所以這里能看見只存在一張前面剛創(chuàng)建的學生表,這里還是要注意,這里 tables,相比 table 是多了個 s 的,跟顯示所有數(shù)據(jù)庫是一樣的。
由于前面操作我已經(jīng)選中的 demo 數(shù)據(jù)庫,所以顯示指定數(shù)據(jù)庫下所有表的操作是不會出錯的,但是有的小伙伴可能一登錄就開始查看所有的表,在沒選中數(shù)據(jù)庫的情況下,是會報錯的:
show tables;
-- ERROR 1046 (3D000): No database selected
4.3 查看表的結構
desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
-- 2 rows in set (0.00 sec)
int(11) 這個只是顯示的寬度,不會影響數(shù)據(jù)的存儲,Null這一列表示該列能否為空,這個后續(xù)文章也會介紹到,key 與表的約束有關,Default 指的是該列沒有插入數(shù)據(jù)默認是啥數(shù)據(jù),Extra 額外的描述,這些內(nèi)容在后續(xù)都會介紹到,這里簡單看一下即可。
4.4 刪除表
drop table student;
-- Query OK, 0 rows affected (0.00 sec)
跟刪除庫一樣,仍然是個特別危險的操作,這里需要注意。
那如果沒有要刪除的表則會報錯:
drop table hello;
-- ERROR 1051 (42S02): Unknown table 'demo.hello'
這里一樣的 ERROR,能不能不讓報錯呢?像我們前面講到過,報錯是不好的,跟創(chuàng)建數(shù)據(jù)庫時如果重名是一樣的:
drop table if exists hello;
-- Query OK, 0 rows affected, 1 warning (0.00 sec)
下期預告:【MySQL】增刪改操作(基礎篇)