一 數據庫簡介
數據庫系統(DBS,DATABASE SYSTEM):數據庫(DB,DATABASE) +數據庫管理系統(DBMS,DATABASE MANAGEMENT SYSTEM)
1.1 關係型數據庫系統
- 數據結構可以規定,同類數據,結構一致。就是一個二維的表格。
- 數據之間的關係可以設置。實體之間的聯繫。
- 非關係型數據庫NoSQL。Membase, MongoDB (類似與php的數組,通過下標標識,值任意格式)
- 區別,通常關係數據庫系統,要求具有相同的結構,而非關係型不一定要求。
1.2 關係型數據(RMDBS)的常用術語
- 數據庫(DataBase),倉庫。
- 表(table),數據庫內的數據集合都放在表(二維表)內。
- 行&列(row)&(column),數據表由數據行和數據列構成。
- 記錄(Record),一個數據行就是一個記錄。
- 字段(Field),記錄內的每個列,就是一個字段。
- 管理系統(management system):用來執行增刪改查等操作的軟件。
- 關係(relational),關係模型。
- 結構化查詢語言SQL(Structured query language),關係數據庫的操作語言,用於執行數據的檢索和其他操作。
1.3 MySQL架構
- 服務器端:存儲和管理數據庫的。
- 客戶端:發出操作請求的程序。
- 連接,認證。
- 客戶端發送操作指令到服務器端
- 服務器端處理請求指令
- 服務器端將處理結果返回給瀏覽器
- 客戶端顯示得到的結果
1.4 指令-SQL結構化查詢語言
- 數據管理語言(DML,DataManipulationLanguage )(DQL+DML)
- 結構操作語言(數據定義語言,DDL,DataDefinitionLanguage )
- 數據庫控制語言(數據庫控制語言,DCL,DataBaseControlLanguage)
二 庫操作
2.1 查詢已經存在的數據庫
show databases [like ‘pattern’];
like pattern 指的是顯示符合哪些命名規則的。不存在指的是所有的數據庫。(這裏使用英文狀態下的單引號)。- 數據庫中的標識符大小寫取決於操作系統(Windows下不區分大小寫,Linux下是區分大小寫的),爲了兼容性更好,我們認爲數據庫系統中的標識符是區分大小寫的;
- 推薦使用下劃線命名方式;
- 標識符原則上可以使用任意字符,但是對於一些特殊的字符,用限定符來包裹起來,如純數字、MySQL的內部關鍵字等等;
- 限定符:反引號。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
結果表明:在當前狀態下,總共有四個數據庫。2.2 創建數據庫
Create database [if not exists] 數據庫名 [數據庫選項]
- 數據庫名:可以是任意字符(目錄可以創建成功),但特殊的字符需要使用反引號包裹,中文名的存儲方式時編碼過的。標識符的大小寫區別於操作系統的大小寫特徵;
- If not exists 表示在數據庫不存在時創建;
- 數據庫選項中,可以設定數據庫字符集(character set utf8)和校對集(collate utf8_general_ci);
- 用中括號括起來的選項是可以不指名的。
mysql> create database student_1;
Query OK, 1 row affected (0.00 sec)
mysql> create database if not exists student_2 character set gbk;
Query OK, 1 row affected (0.00 sec)
mysql> create database `1111`;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| 1111 |
| mysql |
| performance_schema |
| student_1 |
| student_2 |
| test |
+--------------------+
7 rows in set (0.00 sec)
注意:其實,每一個數據庫都在你的數據庫存儲目錄中單獨的被存儲爲一個工作目錄,裏邊可以放多張表格,例如創建了前邊兩個數據庫之後,在你的數據庫存儲目錄中多出來兩個文件夾,分別爲student_1、student2和1111。
2.3 查詢創建數據庫的語句
Show create database db_name;
mysql> show create database `1111`;
+----------+---------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------+
| 1111 | CREATE DATABASE `1111` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)
表明該1111數據庫使用的字符集爲utf82.4 更新數據庫選項信息
alter database db_name 更新表選項
mysql> alter database `1111` character set gbk;
Query OK, 1 row affected (0.00 sec)
mysql> show create database `1111`;
+----------+--------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------+
| 1111 | CREATE DATABASE `1111` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+--------------------------------------------------------------+
1 row in set (0.00 sec)
更改成功!2.5 刪除數據庫
Drop database [if exists] db_name;
- If exists 表示數據庫存在才刪除。
- 當刪除一個數據庫時,同時刪除該數據庫相關的目錄及其目錄內容。
mysql> drop database `1111`;
Query OK, 0 rows affected (0.01 sec)
刪除成功!mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| student_1 |
| student_2 |
| test |
+--------------------+
6 rows in set (0.00 sec)
注意:刪除表選項是不可逆的,當刪除的時候一定要慎重處理,增加嚴格的篩選條件!
- 創建新數據庫,將原數據庫內的表重命名到新數據庫內,刪除原數據庫。
- 將原數據庫的數據和結構導出,然後在導入到新數據庫內,刪除原數據庫
三 表操作
3.1 創建表
create table [if not exists] tbl_name (列定義) [表選項]
create table [if not exists] tbl_name like old_tbl_name;
create table [if not exists] tbl_name select 語句;
每當創建一個表,會在數據目錄創建對應的文件保存表信息。列定義:
- 列名 類型 [是否爲空] [Default 默認值] [是否爲自動增長] [是否爲主索引或唯一索引] [comment 註釋] [引用定義]
- 類型指的是 當前列所保存數據的類型。(簡單的 int 整型,varchar字符串類型,需要指定最大長度)
- 每個列定義使用逗號分隔。
- 表引擎:engine|type=引擎
- 表字符集與校對集 charset set=字符集 collate=校對集
- 註釋 comment=‘註釋’
mysql> create table if not exists student_class1(
-> NO varchar(20),
-> name varchar(20),
-> score int
-> );
Query OK, 0 rows affected (0.06 sec)
注意:最後一個列定義不能用逗號!3.2 查詢表
show tables [from db_name] [like ‘pattern’];
查詢數據庫中存在的數據表,如果沒有數據庫名,則採用當前數據庫,如果沒有like則獲得所有表。mysql> show tables from student_1;
+---------------------+
| Tables_in_student_1 |
+---------------------+
| student_class1 |
| student_class2 |
| student_class3 |
+---------------------+
3 rows in set (0.00 sec)
mysql> show tables from student_1 like '%1';
+--------------------------+
| Tables_in_student_1 (%1) |
+--------------------------+
| student_class1 |
+--------------------------+
1 row in set (0.00 sec)
其中%稱之爲通配符,表示任意字符的任意個數的組合。上方的代碼表示篩選出最後一個字符是1的全部的表。mysql> show tables from student_1 like 'student%';
+--------------------------------+
| Tables_in_student_1 (student%) |
+--------------------------------+
| student_class1 |
| student_class2 |
| student_class3 |
+--------------------------------+
3 rows in set (0.00 sec)
上述代碼表明篩選出表名前綴是student的全部的表。3.3 設置數據庫爲當前的默認數據庫
mysql> use student_1;
Database changed
設置數據庫student_1爲當前默認的數據庫。mysql> show tables;
+---------------------+
| Tables_in_student_1 |
+---------------------+
| student_class1 |
| student_class2 |
| student_class3 |
+---------------------+
3 rows in set (0.00 sec)
3.4 查看錶結構
desc|describe tbl_name;(show columns from tbl_name);
查看當前表的結構。mysql> describe student_class1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| NO | varchar(20) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> desc student_class1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| NO | varchar(20) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
即用desc代替describe3.5 查看當前表的定義語句
show create table tbl_name;
查看當前表的定義語句mysql> show create table student_class1;
+----------------+------------------------------------------
-------------------------------------------------------+
| Table | Create Table
|
+----------------+------------------------------------------
-------------------------------------------------------+
| student_class1 | CREATE TABLE `student_class1` (
`NO` varchar(20) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------------+------------------------------------------
-------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show create table student_class1 \G
*************************** 1. row ***************************
Table: student_class1
Create Table: CREATE TABLE `student_class1` (
`NO` varchar(20) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
3.6 刪除表
drop table [if exists] tbl_name;
注意,可以同時刪除多個表名,表名之間使用逗號分割。mysql> drop table if exists student_class3, student_class4;
Query OK, 0 rows affected (0.05 sec)
mysql> show tables;
+---------------------+
| Tables_in_student_1 |
+---------------------+
| student_class1 |
| student_class2 |
+---------------------+
2 rows in set (0.00 sec)
3.7 表的重命名(數據庫不能重命名)
rename table tbl_name to new_tbl_name;
可以同時針對多個表進行重命名,只需用逗號隔開,甚至可以跨數據庫。mysql> rename table student_class1 to student_info;
Query OK, 0 rows affected (0.04 sec)
對一個表進行重命名;mysql> show tables;
+---------------------+
| Tables_in_student_1 |
+---------------------+
| student_class2 |
| student_info |
+---------------------+
2 rows in set (0.00 sec)
mysql> rename table student_class2 to student_exam, student_info to info_student;
Query OK, 0 rows affected (0.04 sec)
對兩個表同時進行重命名,只需用逗號隔開即可。mysql> show tables from student_2;
Empty set (0.00 sec)
mysql> rename table student_exam to student_2.exam_student;
Query OK, 0 rows affected (0.02 sec)
通過制定表的名稱來實現跨數據庫操作,這種行爲類似於移動表,也就是將表從一個數據庫中移動到另外一個數據庫中。3.8 修改列定義
alter table tbl_name add/modify/drop/change
3.8.1 增加一個新的列
Alter table tbl_name add column_definition。
可以同時增加多個列,使用括號括起來多個列的定義。mysql> desc info_student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| NO | varchar(20) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
增加一個性別sex列:
mysql> alter table info_student add sex varchar(10);
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc info_student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| NO | varchar(20) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
| sex | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
mysql> alter table info_student add (age int, height int);
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
顯示新的表:
mysql> desc info_student;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| NO | varchar(20) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
| sex | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| height | int(11) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
3.8.2 刪除列
alter table tbl_name drop column_name;
刪除表中的一列數據alter table tbl_name drop column_name;
<pre name="code" class="sql">mysql> alter table info_student drop age;
刪除表中兩列數據,age列和height列mysql> desc info_student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| NO | varchar(20) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
| sex | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
3.8.3 修改已有的列定義(修改數據類型或者容量)
mysql> alter table info_student modify name varchar(40);
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
表信息:
mysql> desc info_student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| NO | varchar(20) | YES | | NULL | |
| name | varchar(40) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
| sex | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
3.8.4 重命名一個列(同時更改列名和數據類型)
更改表中的性別sex爲height 類型爲int:mysql> alter table info_student change sex height int;
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
表信息:
mysql> desc info_student;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| NO | varchar(20) | YES | | NULL | |
| name | varchar(40) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
| height | int(11) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
注:表中的信息太多,我們刪掉最後一行;
mysql> alter table info_student drop height;
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc info_student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| NO | varchar(20) | YES | | NULL | |
| name | varchar(40) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
3.9 修改表選項
alter table info_student character set gbk;
mysql> show create table info_student \G;
*************************** 1. row *******************
Table: info_student
Create Table: CREATE TABLE `info_student` (
`NO` varchar(20) CHARACTER SET utf8 DEFAULT NULL,
`name` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
`score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
3.10 對錶中數據的操作(DML)
3.10.1 向表中增加數據:
insert into tbl_name (字段列表) values (值列表)
mysql> insert into info_student (NO, name, score) values('14011', 'Apple', 75);
Query OK, 1 row affected (0.02 sec)
mysql> insert into info_student values('14012', 'Lin', 85);
Query OK, 1 row affected (0.03 sec)
3.10.2 獲得表中的數據
select 字段列表 from tbl_name 檢索條件;
字段列表出位*表示獲取所有的數據,檢索條件爲where 1時代表永遠成立,和不寫檢索條件是一樣的。mysql> select * from info_student where 1;
+-------+-------+-------+
| NO | name | score |
+-------+-------+-------+
| 14011 | Apple | 75 |
| 14012 | Lin | 85 |
+-------+-------+-------+
2 rows in set (0.00 sec)
3.10.3 刪除數據
Delete from tbl_name 刪除條件;
例如:刪除分數低於80分的人員信息數據
mysql> delete from info_student where score<=80;
Query OK, 1 row affected (0.03 sec)
mysql> select * from info_student;
+-------+------+-------+
| NO | name | score |
+-------+------+-------+
| 14012 | Lin | 85 |
+-------+------+-------+
1 row in set (0.00 sec)
3.10.4 修改數據
Update tbl_name set 字段=值 列表 更新條件
mysql> update info_student set score=100 where score>=80;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from info_student;
+-------+------+-------+
| NO | name | score |
+-------+------+-------+
| 14012 | Lin | 100 |
+-------+------+-------+
1 row in set (0.00 sec)