目錄
內容概述
1.MySQL數據表
-1.1 表的增刪改查
-1.2 表數據的增刪改查
-1.3 排序與去重
-1.4 其他語句
-1.5 where語句以及having語句
內容詳細
1.MySQL數據表
數據表是數據庫的重要組成部分,每一個數據庫都是由若干個數據表組成的。換句話說,沒有數據表就無法在數據庫中存放數據。
1.1 表的增刪改查
創建表
1.創建數據表
# 基本語法
在 MySQL 中,可以使用 CREATE TABLE 語句創建表。其語法格式為:
1.基本語法:
在 MySQL 中,可以使用 CREATE TABLE 語句創建表。其語法格式為:
CREATE TABLE <表名> ([表定義選項])[表選項][分區選項];
其中[表定義選項]的格式為:
<列名1> <類型1> [,…] <列名n> <類型n>
CREATE TABLE 語句的主要語法及使用說明如下:
● CREATE TABLE:用於創建給定名稱的表,必須擁有表CREATE的權限。
● <表名>:指定要創建表的名稱,在 CREATE TABLE 之后給出,必須符合標識符命名規則。表名稱被指定為 db_name.tbl_name,以便在特定的數據庫中創建表。無論是否有當前數據庫,都可以通過這種方式創建。在當前數據庫中創建表時,可以省略 db-name。如果使用加引號的識別名,則應對數據庫和表名稱分別加引號。例如,'mydb'.'mytbl' 是合法的,但 'mydb.mytbl' 不合法。
● <表定義選項>:表創建定義,由列名(col_name)、列的定義(column_definition)以及可能的空值說明、完整性約束或表索引組成。
● 默認的情況是,表被創建到當前的數據庫中。若表已存在、沒有當前數據庫或者數據庫不存在,則會出現錯誤。
創建表的格式
create table <table name> (字段名 字段類型,字段名n 字段類型n) ENGINE=<存儲引擎> CHARSET=<字符集編碼>;
案例:
create table test01(id int(11), name varchar(25));
mysql> show tables;
+------------------+
| Tables_in_xiaohu |
+------------------+
| rng |
+------------------+
1 row in set (0.00 sec)
創建一個班級表
mysql> CREATE TABLE class (
-> id int,
-> name varchar(100),
-> age tinyint(2),
-> sex enum("1","2")
-> )ENGINE=InnoDB CHARSET=utf8mb4;
Query OK, 0 rows affected (0.00 sec)
查看表
查看表
mysql> SHOW CREATE TABLE class\G
*************************** 1. row ***************************
Table: class
Create Table: CREATE TABLE `class` (
`id` int(11) DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`age` tinyint(2) DEFAULT NULL,
`sex` enum('1','2') DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
mysql> DESC class;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(100) | YES | | NULL | |
| age | tinyint(2) | YES | | NULL | |
| sex | enum('1','2') | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
Field :字段名稱
Type :字段類型
Null :是否可以為空
Key :約束
Default :默認值
修改表
修改表結構
# 修改表名稱
mysql> ALTER TABLE class RENAME TO linux13_class;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-------------------+
| Tables_in_linux13 |
+-------------------+
| linux13_class |
# 修改表字符集編碼
mysql> ALTER TABLE linux13_class CHARACTER SET utf8;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE linux13_class\G
*************************** 1. row ***************************
Table: linux13_class
Create Table: CREATE TABLE `linux13_class` (
`id` int(11) DEFAULT NULL,
`name` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL,
`age` tinyint(2) DEFAULT NULL,
`sex` enum('1','2') CHARACTER SET utf8mb4 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
# 修改表字段
mysql> ALTER TABLE linux13_class CHANGE name name varchar(50);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE linux13_class\G
*************************** 1. row ***************************
Table: linux13_class
Create Table: CREATE TABLE `linux13_class` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`age` tinyint(2) DEFAULT NULL,
`sex` enum('1','2') CHARACTER SET utf8mb4 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
# 修改字段的數據類型
mysql> ALTER TABLE linux13_class MODIFY age int;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE linux13_class\G
*************************** 1. row ***************************
Table: linux13_class
Create Table: CREATE TABLE `linux13_class` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` enum('1','2') CHARACTER SET utf8mb4 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
刪除表
1.刪除字段
mysql> SHOW CREATE TABLE linux13_class\G
*************************** 1. row ***************************
Table: linux13_class
Create Table: CREATE TABLE `linux13_class` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` enum('1','2') CHARACTER SET utf8mb4 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> ALTER TABLE linux13_class DROP sex;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE linux13_class\G
*************************** 1. row ***************************
Table: linux13_class
Create Table: CREATE TABLE `linux13_class` (
`id` int(11) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
2.刪除表
mysql> DROP TABLE linux13_class;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW CREATE TABLE linux13_class\G
ERROR 1146 (42S02): Table 'linux13.linux13_class' doesn't exist
增加字段
MySQL 數據表是由行和列構成的,通常把表的“列”稱為字段(Field),把表的“行”稱為記錄(Record)。隨着業務的變化,可能需要在已有的表中添加新的字段。
# 在開頭位置添加字段
MySQL 默認在表的最后位置添加新字段,如果希望在開頭位置(第一列的前面)添加新字段,那么可以使用 FIRST 關鍵字。
ALTER TABLE <表名> ADD <新字段名> <數據類型> [約束條件] FIRST;
案例:
alter table test01 add name varchar(20) first;
# 在中間位置添加字段
MySQL 除了允許在表的開頭位置和末尾位置添加字段外,還允許在中間位置(指定的字段之后)添加字段,此時需要使用 AFTER 關鍵字。
alter table <表名> add <新字段名> <數據類型> [約束條件] after <已經存在的字段名>;
after 的作用是將新字段添加到某個已有字段后面
alter table test01 sex varchar (20) after id;
# 在末尾位置添加字段
一個完整的字段包括字段名、數據類型和約束條件。
ALTER TABLE <表名> ADD <新字段名><數據類型>[約束條件];
對語法格式的說明如下:
● <表名> 為數據表的名字
● <新字段名> 為所要添加的字段的名字
● <數據類型> 為所要添加的字段能存儲數據的數據類型
● [約束條件] 是可選的,用來對添加的字段進行約束
使用alter table 語句添加一個 INT類型的字段age,SQL語句和運行結果如下:
alter table test01 add addr varchar(20);
1.2 表數據的增刪改查
表相當於文件,表中保存的其實是真正的數據,接下來介紹表數據的各種常見操作。
增加表數據
增加數據其實就是向表中插入數據,或者是向表中添加數據
格式:
INSERT INTO <表名> (字段1,字段2,...字段n) VALUES (數據1,數據2...數據n);
案例:
-- 創建一個班級表
CREATE TABLE class(
id int,
name varchar(50),
age tinyint(2),
sex enum('1','2')
);
-- 向班級中插入數據
INSERT INTO class (id,name,age,sex) VALUES (1,'同學1',22,1);
INSERT INTO class (id,name,age,sex) VALUES (2,'同學2',23,2);
當要插入的數據所有字段都涉及到了,那么括號中的字段可以省略;當插入的字段沒有全部涉及到,那么字段則不能省略。
mysql> INSERT INTO class VALUES (3, '小帥哥', 17, 1);
Query OK, 1 row affected (0.00 sec)
查詢數據
表中保存了許多數據,其目的就是為了使用的時候可以查詢出來,查詢語句使用的頻率比較多,下面我么介紹查詢語法:
格式:
SELECT [查詢字段] FROM [表名] [條件語句] [顯示規則] [規則條件]
案例:
-- * 默認代表所有的字段
mysql> SELECT * FROM class;
+------+-----------+------+------+
| id | name | age | sex |
+------+-----------+------+------+
| 1 | 班長 | 18 | 1 |
| 2 | 小仙女 | 16 | 2 |
| 3 | 小帥哥 | 17 | 1 |
+------+-----------+------+------+
3 rows in set (0.00 sec)
-- 查詢指定字段
mysql> SELECT name FROM class;
+-----------+
| name |
+-----------+
| 班長 |
| 小仙女 |
| 小帥哥 |
+-----------+
3 rows in set (0.00 sec)
條件語句(where)
條件語句可以用來篩選數據,主要用於查詢某些數據,下面我們介紹條件語句
# 判斷條件
> :大於
< : 小於
= :等於
!= 和 <> : 不等於
>= : 大於等於
<= : 小於等於
like : 模糊查詢
and : 並且
or :或者
案例1:要求查出id>1的所有信息
mysql> select * from class01 where id > 1;
+------+-------+------+------+
| id | name | age | sex |
+------+-------+------+------+
| 2 | ak47 | 47 | 1 |
| 3 | m4 | 20 | 1 |
| 4 | knife | 1 | 2 |
+------+-------+------+------+
3 rows in set (0.00 sec)
案例2:要求查出sex為2的有哪些?
mysql> select * from class01 where sex = 2;
+------+-------+------+------+
| id | name | age | sex |
+------+-------+------+------+
| 4 | knife | 1 | 2 |
+------+-------+------+------+
1 row in set (0.00 sec)
案例3 要求查詢出id既大於1,又小於3
mysql> select * from class01 where id > 1 and id < 3;
+------+------+------+------+
| id | name | age | sex |
+------+------+------+------+
| 2 | ak47 | 47 | 1 |
+------+------+------+------+
1 row in set (0.00 sec)
1.3 排序與去重
排序(order by)
排序,顧名思義就是按照某種規則查詢出數據,默認情況下是按照從前到后查詢數據,但是也可以通過排序語法查詢出相關的數據。
格式:
SELECT [查詢字段] FROM [表名] [顯示規則]
-- 排序的規則
ASC :默認,正向排序
DESC :反向排序
案例1:按照年齡的從大到小的順序查詢所有的數據
mysql> select * from class01 order by age desc;
+------+-------+------+------+
| id | name | age | sex |
+------+-------+------+------+
| 2 | ak47 | 47 | 1 |
| 1 | uzi | 23 | 1 |
| 3 | m4 | 20 | 1 |
| 4 | knife | 1 | 2 |
+------+-------+------+------+
4 rows in set (0.00 sec)
去重(DISTINCT)
去重,顧名思義就是在查詢的數據中過濾掉重復數據,默認會顯示所有的數據,可以使用出重語法實現去掉重復數據。
格式:
去重是在指定需要被出重的語句之前添加去重關鍵字
案例:要求按照性別去重
mysql> select distinct sex from class01;
+------+
| sex |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
1.4 其他語句
別名
別名,顧名思義就是將字段設置一個新的名字
案例:
要求計算出當前表中所有的行數
-- 計算行數的函數是count()
mysql> SELECT count(id) FROM class;
+-----------+
| count(id) |
+-----------+
| 3 |
+-----------+
1 row in set (0.00 sec)
# 設置別名
mysql> SELECT count(id) '行數' FROM class;
+--------+
| 行數 |
+--------+
| 3 |
+--------+
1 row in set (0.00 sec)
常用的函數
函數,就是具備某種功能的工具。那么在數據庫中使用函數就是通過函數實現某種具體的功能。
# 計算行數的函數
案例:計算出當前數據有多少行
-- 計算行數的函數是count()
mysql> SELECT count(id) FROM class;
+-----------+
| count(id) |
+-----------+
| 3 |
+-----------+
1 row in set (0.00 sec)
# 計算某個字段的和
案例:計算表中所有的年齡的總和
-- 計算和的函數是sum()
mysql> SELECT SUM(age) FROM class;
+----------+
| SUM(age) |
+----------+
| 91 |
+----------+
1 row in set (0.00 sec)
# 計算平均值
案例:計算表中所有的年齡的平均值
mysql> select avg(age) from class01;
+----------+
| avg(age) |
+----------+
| 22.7500 |
+----------+
1 row in set (0.00 sec)
1.5 where語句以及having語句
having語句
having也是一個條件判斷語句,類似於前面所講的where語句是用於做條件判斷的,但是有所不同的是where的條件作用於查詢之前的字段,having是作用於查詢之后的語句。
案例:所有sex為1的,age>17的有哪些?
mysql> SELECT * FROM class01 WHERE sex = 1 HAVING age > 17;
+------+------+------+------+
| id | name | age | sex |
+------+------+------+------+
| 1 | uzi | 23 | 1 |
| 2 | ak47 | 47 | 1 |
| 3 | m4 | 20 | 1 |
+------+------+------+------+
3 rows in set (0.00 sec)
為什么要使用having語句?
因為having語句查詢的是處理過后的數據,在查詢速度上更快。