1. 程式人生 > >(三)mysql SQL 基本操作

(三)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