數據表


內容概述

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語句查詢的是處理過后的數據,在查詢速度上更快。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM