(三)mysql SQL 基本操作
MySQL伺服器物件
mysql 伺服器物件內部分成了 4 層:
系統(DBMS)---->資料庫(DB)---->表(Table)---->欄位(Field)
mysql 的基本操作
基本操作:CRUD ;
將SQL的基本操作根據操作物件進行分類,分為三類:庫操作,表(欄位)操作,資料操作;
SQL的註釋
- SQL註釋
mysql> -- 雙中劃線+空格 ,代表單行註釋 ;
-> ;
Query OK, 0 rows affected
mysql> #單行註釋也可使用 #,不需要加空格 ;
-> ;
Query OK, 0 rows affected
庫操作
對資料庫進行 CRUD ;
新增資料庫語法:create database 資料庫名字 [庫選項]
;
庫選項:用來約束資料庫,分為兩個選項 :
① 字符集設定 :charset/character set 具體字符集 ;在中文中常用的字符集有:gbk,utf8 ;用於指定表的字符集 ; ②校對集設定:collate 具體校對集(資料比較規則) ,預設校對集是跟著字符集走的;校對集是排序用的!
SQL 語句演示
--------------建立資料庫-------------------
資料庫名字中不能含有關鍵字,如果非要使用關鍵字作名字,則使用 反引號
-- 建立資料庫
mysql> create database mydatabase_1 charset utf8 ;
Query OK, 1 row affected
-- 用關鍵字做作資料庫名字,且沒有使用反引號括起來,報錯
mysql> create database database charset utf8;
1064 - 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 'database charset utf8' at line 1
-- 用關鍵字做作資料庫名字,使用反引號括起來,通過
mysql> create database `database` charset utf8;
Query OK, 1 row affected
```
資料庫是支援中文作為名字的,但是需要先告訴mysql伺服器你的字符集,不然它識別不出來中文
```sql
-- 告訴mysql伺服器,我們使用的字符集,不然它識別不出來中文
mysql> set names utf8;
Query OK, 0 rows affected
-- 然後再使用中文作為資料庫的名字
mysql> create database 中國 charset utf8;
Query OK, 1 row affected
--------------小結-------------------
① 當執行完建立資料庫的sql語句之後,會在資料庫系統中,增加對應的資料庫資訊;
② 會在儲存資料庫的資料夾下面的 data
目錄下,建立一個對應資料庫名字的資料夾;
③ 在該對應檔案下,會有一個 opt
檔案,裡面儲存了資料庫的庫選項 ;
--------------檢視資料庫-------------------
① 檢視所有資料庫:show databases ;
-- 檢視所有資料庫
mysql> show databases ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| database |
| mysql |
| test |
| user |
| 中國 |
+--------------------+
13 rows in set
② 檢視部分資料庫,類似於模糊查詢 :show databases like 'pattern' ;
pattern
:是個匹配模式,有2種佔位符 :
% : 代表匹配多個任意字元 ; _ : 代表匹配單個任意字元 ;
但是 _
也是可以作為資料庫名字的,因此要想查詢 _
得使用轉義 \_
;
-- _ 程式碼佔位符,因此可以查詢出多個數據庫
mysql> show databases like 'my_%';
+-----------------+
| Database (my_%) |
+-----------------+
| mybatisday01 |
| mydatabase_1 |
| mysql |
+-----------------+
3 rows in set
-- \_ 代表資料庫的名字,因此一個沒有查出來,因為我們沒有 my_xxx 的資料庫 ;
mysql> show databases like 'my\_%';
Empty set
③ 檢視資料庫的建立語句:show create database 資料庫名字
;
注意,查詢出來的時候資料庫優化過後的sql
語句,因此,和我們建立時候,寫的不一樣 ;
mysql> show create database user ;
+----------+---------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------+
| user | CREATE DATABASE `user` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set
--------------更新資料庫-------------------
資料庫的名字不可以更改,在低版本的mysql
中可以更改,高版本中修改為不可修改!
語法:alter database 資料庫名字 [庫選項]
;
字符集:charset/character set [=] 字符集
;
校對集:collate 校對集
;
其中校對集是依賴字符集的,修改字符集,校對集會自動的更改 ;
mysql> alter database 中國 charset = gbk ;
Query OK, 1 row affected
--------------刪除資料庫-------------------
資料庫的刪除是不可逆操作,,因此,執行刪除的時候,需要萬分注意 ;
語法 :drop database 資料庫名字 ;
mysql> drop database 中國 ;
Query OK, 0 rows affected
刪除資料庫的時候,會將之前建立資料庫的時候,產生的資料夾刪除掉;
表(欄位)操作
--------------建立表---------------
# 語法:
-- 如果不想顯式的指明資料庫,則使用 use 資料庫名字,進入到某個具體的資料庫中
create table [if not exists] 資料名.表名( -- 顯式的指明資料庫
欄位,
欄位 -- 最後一個欄位後面不需要加 逗號 ,可以看出是方法的最後一個引數
) [表選項];
Query OK, 0 rows affected
if not exists
: 起檢查作用,如果表不存在,則建立表,表存在,則不建立;
表選項:
① charset/character set 字符集
; 指定表中欄位內容,也就是資料單元的字符集 ;
② collate
校對集;
③ 儲存引擎 :engine
具體的儲存引擎 ;(常用的有 innodb,myisam
)
sql 演示:
mysql> use user ; -- 進入 user 資料庫
-> create table student(
-> name varchar(10),
-> age int ,
-> genger varchar(10)
-> ) charset utf8 ;
Query OK, 0 rows affected
當上面的sql
執行以後,會在對應的資料庫中,創建出表,並且在對應的資料庫資料夾下面 ,會產生對應的 表的結構檔案
(跟儲存引擎有關);
--------------查看錶---------------
跟檢視資料庫,基本別無二致 ;但是多一個查詢欄位的操作
sql 演示:
# 查詢資料庫中的所有表
mysql> show tables ;
+--------------------+
| Tables_in_database |
+--------------------+
| student |
+--------------------+
1 row in set
# 模糊查詢,亦可以使用 '%t' ,但是這樣會很慢,其中 緣由是這樣查,不能使用 索引;
mysql> show tables like 'stud%' ;
+----------------------------+
| Tables_in_database (stud%) |
+----------------------------+
| student |
+----------------------------+
1 row in set
# 查詢 表的建立語句,可以使用 \g 代替 ; \G 表示將查詢結果迴圈 90°
mysql> show create table student ;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
`name` varchar(10) default NULL,
`age` int(11) default NULL,
`genger` varchar(10) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
#查詢表中的欄位,三種 方法
# desc 表名 ,describe 表名,show columns from 表名
mysql> desc student ;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| genger | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set
mysql> describe student ;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| genger | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set
mysql> show columns from student ;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| genger | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set
--------------修改表---------------
修改表,分為2部分,一部分是修改 表本身,另一種是修改 表的欄位 ;
sql 演示 :
① 修改表本身
# 修改表名
# 語法:rename table 老表名 to 新表名 ;
mysql> rename table student to my_student ;
Query OK, 0 rows affected
# 修改表選項
# 語法:alter table 表名 表選項 [=] 值 ;
mysql> alter table my_student charset = gbk ;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
② 修改表的欄位
涉及的操作很多:新增欄位 、刪除欄位、重新命名欄位、修改欄位屬性 ;
sql 演示 :
# 新增欄位
# 語法:alter table 表名 add [column] 欄位名 資料型別 [列屬性] [位置] ;
# 位置,可以放在表中任意位置上; first 表示第一個;after 欄位名 ,表示放在某個欄位後面 ;
# 預設是放在最後一個欄位後面 ;
mysql> alter table my_student
-> add column id int
-> first ;
Query OK, 0 rows affected
# 修改欄位 一般修改是的欄位的列屬性或者資料型別
# 語法:alter table 表名 modify 欄位名 資料型別 [列屬性] [位置] ;
mysql> alter table my_student modify name char(10) ;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
# 重新命名欄位
# 語法:alter table 表名 change 舊欄位名 新欄位名 資料型別 [列屬性] [位置] ;
mysql> alter table my_student change genger sex char(2) first ;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
# 刪除欄位
# 注意:刪除欄位,會將該欄位列的值全部一併刪除,這個操作是不可逆的!!
# 語法:alter table 表名 drop 欄位名 ;
mysql> alter table my_student drop id ;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
--------------刪除表---------------
sql 演示:
# 刪除表,可以一次性刪除多張表 ;
# 語法:drop table 表名1,表名2 ... ;
mysql> drop table my_student ;
Query OK, 0 rows affected
刪除表以後,建立表時候,在資料庫對應的資料夾下面生成的表的約束檔案,也一併被刪除 ;
資料操作
-------------新增資料 ------------
插入資料,非數值資料使用單引號括起來,其實所有資料都可以使用單引號括起來 ; 有兩種方法: ① 給全表字段插入資料,要求插入資料的順序必須和表字段的順序一致; (可以一次性插入多條資料)
# 新增資料,可以一次性插入多條記錄
# 語法:insert into 表名 values(欄位值..),(欄位值...) ;
mysql> insert into student values('1','yaz','male'),('2','dog','female');
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
②給部分欄位插入只值,但是插入值的順序可以更改,根據表名後面的欄位的順序 ;
# 給部分欄位插入值,也可以一次性插入多條記錄
# 語法:insert into 表名(欄位..) values(欄位值..) ;
mysql> insert into student(id,name) values('3','nanda');
Query OK, 1 row affected
# 一次性插入多個值
mysql> insert into student(id,name) values('3','nanda'),('22','haha');
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
-------------查詢資料 ------------
# 查詢所有欄位的值
# 語法:select * from 表名 ;
mysql> select * from student ;
+----+-------+--------+
| id | name | sex |
+----+-------+--------+
| 1 | yaz | male |
| 2 | dog | female |
| 3 | nanda | NULL |
| 3 | nanda | NULL |
| 22 | haha | NULL |
+----+-------+--------+
5 rows in set
# 查詢部分欄位值
# 語法:select 欄位1,欄位2 ... from 表名 ;
mysql> select id,name from student ;
+----+-------+
| id | name |
+----+-------+
| 1 | yaz |
| 2 | dog |
| 3 | nanda |
| 3 | nanda |
| 22 | haha |
+----+-------+
5 rows in set
# 根據條件查詢
# 語法: select 欄位 from 表名where 條件;
mysql> select sex,name from student where id = 22;
+------+------+
| sex | name |
+------+------+
| NULL | haha |
+------+------+
1 row in set
-------------更新資料 ------------
# 按照條件更新
# 語法:update 表名 set 欄位= 欄位值 [where 條件] ;
mysql> update student set sex = 'male' where name = 'dog' ;
Query OK, 1 row affected -- 如果更新失敗,則影響的行數為 0 ;
Rows matched: 1 Changed: 1 Warnings: 0
# 如果更新失敗,影響的行數
mysql> update student set sex = 'male' where name = 'dogs' ;
Query OK, 0 rows affected -- 更新失敗,沒有name 為 dogs 的 人
Rows matched: 0 Changed: 0 Warnings: 0
-------------刪除資料 ------------
刪除需謹慎,不可逆操作 !!
# 按照 條件是刪除資料
# 語法: delete from 表名 [條件];
mysql> delete from student where sex = 'male';
Query OK, 1 row affected