文章目錄
- 一、表操作
-
- 1、MySQL表資料類型
-
- 1.1、MySQL資料類型
- 1.2、MySQL數值資料類型
- 1.3、MySQL布爾資料類型
- 1.4、MySQL字元串資料類型
- 1.5、MySQL日期和時間資料類型
- 1.6、MySQL空間資料類型
- 1.7、JSON資料類型
- 2、用SQL語句建立表
-
- 2.1、語句解釋
- 2.2、設定列類型 、大小、限制
- 2.3、設定主鍵
- 3、用SQL語句向表中添加資料
-
- 3.1、語句解釋
- 3.2、多種添加方式(指定列名;不指定列名)
- 4、用SQL語句删除表
-
- 4.1、DELETE
- 4.2、DROP
- 4.3、TRUNCATE
- 4.4、不同方式的差別
- 5、用SQL語句修改表
-
- 5.1、修改列名
- 5.2、删除列
- 5.3、建立列
- 5.4、建立行
- 5.5、删除行
- 5.6、修改表中資料
- 6、作業
- 二、表聯結
-
-
- 1、MySQL别名
- 2、INNER JOIN
- 3、LEFT JOIN
- 4、CROSS JOIN
- 5、自連接配接
- 6、UNION
- 7、以上幾種方式的差別和聯系
- 8、作業
-
一、表操作
1、MySQL表資料類型
1.1、MySQL資料類型
資料庫表包含具有特定資料類型(如數字或字元串)的多個列。
MySQL提供更多的資料類型,而不僅僅是數字或字元串。
MySQL中資料類型都可以通過以下特征來确定:
- 它用來表示資料值。
- 占用的空間以及值是固定長度還是可變長度。
- 資料類型的值可以被索引。
- MySQL如何比較特定資料類型的值。
資料類型 | 指定值和範圍 |
---|---|
| String(0~255) |
| String(0~255) |
| String(0~255) |
| String(0~65536) |
| String(0~65536) |
| String(0~16777215) |
| String(0~16777215) |
| String(0~4294967295) |
| String(0~4294967295) |
| Integer(-128~127) |
| Integer(-32768~32767) |
| Integer(-8388608~8388607) |
| Integer(-214847668~214847667) |
| Integer(-9223372036854775808~9223372036854775807) |
| decimal(精确到23位小數) |
| decimal(24~54位小數) |
| 将 轉儲為字元串形式 |
| YYYY-MM-DD |
| YYYY-MM-DD HH:MM:SS |
| YYYYMMDDHHMMSS |
| HH:MM:SS |
| 選項值之一 |
| 選項值子集 |
| tinyint(1) |
1.2、MySQL數值資料類型
數字類型 | 描述 |
---|---|
TINYINT | 一個很小的整數 |
SMALLINT | 一個小的整數 |
MEDIUMINT | 一個中等大小的整數 |
INT | 一個标準整數 |
BIGINT | 一個大整數 |
DECIMAL | 定點數 |
| 單精度浮點數 |
| 雙精度浮點數 |
BIT | 一個位元組字段 |
1.3、MySQL布爾資料類型
MySQL沒有内置的`BOOLEAN`或`BOOL`整數,是以要表示布爾值,MySQL使用最小的整數類型。也就是`TINYINT(1)`。
換句話說,`BOOLEN`和`BOOL`是`TINYINT(1)`的同義詞。
1.4、MySQL字元串資料類型
在MySQL中,字元串可以容納從純文字到二進制資料(如圖像或檔案)的任何内容。
可以通過使用`LIKE`運算符,正規表達式和全文搜尋,根據模式來比較和搜尋字元串。
字元串類型 | 描述 |
---|---|
char | 固定長度的非二進制(字元)字元串 |
varchar | 可變長度的非二進制字元串 |
| 一個固定長度的二進制字元串 |
| 一個可變長度的二進制字元串 |
| 一個非常小的BLOB(二進制大對象) |
| 一個小的BLOB(二進制大對象) |
| 一個中等大小的BLOB(二進制大對象) |
| 一個大的BLOB(二進制大對象) |
TINYTEXT | 一個非常小的非二進制字元串 |
TEXT | 一個小的非二進制字元串 |
MEDIUMTEXT | 一個中等大小的非二進制字元串 |
LONGTEXT | 一個很大的非二進制字元串 |
ENUM | 枚舉; 每個列值可以被配置設定一個枚舉成員 |
| 集合; 每個列值可以配置設定零個或多個 成員 |
1.5、MySQL日期和時間資料類型
MySQL提供日期和時間的類型以及日期和時間的組合。
此外,MySQL還支援時間戳資料類型,用于跟蹤表的一行中的更改。
如果隻想存儲沒有日期和月份的年份資料,則可以使用`YEAR`資料類型。
字元串類型 | 描述 |
---|---|
DATE | 格式的日期值 |
TIME | 格式的時間值 |
DATETIME | 格式的日期和時間值 |
TIMESTAMP | 格式的時間戳記值 |
| 或 格式的年值 |
1.6、MySQL空間資料類型
字元串類型 | 描述 |
---|---|
GEOMETRY | 任何類型的空間值 |
POINT | 一個點(一對X-Y坐标) |
LINESTRING | 曲線(一個或多個POINT值) |
POLYGON | 多邊形 |
GEOMETRYCOLLECTION | 值的集合 |
MULTILINESTRING | 值的集合 |
MULTIPOINT | 值的集合 |
MULTIPOLYGON | 值的集合 |
1.7、JSON資料類型
2、用SQL語句建立表
2.1、語句解釋
建立新表:
CERATE TABLE
語句
簡單的形式說明文法:
CERATE TABLE [IF NOT EXISTS] table_name(
column_list
)engine=table_type;
- 首先,指定
子句之後建立的表名稱。表名在資料庫中必須是唯一的。CERATE TABLE
是語句的可選部分,允許檢查正在建立的表是否存在于資料庫中。如果存在,MySQL會忽略整個語句,不會建立任何新的表。建議使用。IF NOT EXISTS
- 其次,在
部分指定表的清單。字段的列用逗号(column_list
)分隔。,
- 需要為
子句中的表指定存儲引擎。可以使用任何引擎,預設使用InnoDB。engine
2.2、設定列類型 、大小、限制
column_name_data_type[size] [NOT NULL|NULL] [DEFAULT value]
[AUTO_INCREMENT]
-
指定列的名稱。每列具有特定資料類型和大小,例如:column_name
。VARCHAR(255)
-
或者NOT NULL
表示該列是否接受NULL
值。NULL
-
值用于指定列的預設值。DEFAULT
-
訓示每當将新行插入到表中時,列的值會自動增加。每個表都有一個且隻有一個AUTO_INCREMENT
列。AUTO_INCREMENT
2.3、設定主鍵
使用以下文法:
PRIMARY KEY (col1,col2,col3,……)
資料庫建立示例:

3、用SQL語句向表中添加資料
3.1、語句解釋
使用
INSERT
關鍵字。
INSERT
語句的文法:
INSERT INTO table(column1,column2,……)
VALUES(value1,value2,……);
- 在
子句之後,在括号内指定表名和逗号分隔列的清單。INSERT INTO
- 将括号内的相應列的逗号分隔值放在
關鍵字之後。VALUES
3.2、多種添加方式(指定列名;不指定列名)
指定列名
INSERT INTO tasks(SUBJECT,start_date,end_date,description)
VALUES('Learn MySQL INSERT','2017-07-21','2017-07-22','Start learning..');
SELECT * FROM tasks;
查詢結果:
不指定列名
為表中所有列指定相應列的值,可以不指定列名添加。
INSERT INTO tasks
VALUES('Learn MySQL INSERT','2017-07-21','2017-07-22','Start learning..');
SELECT * FROM tasks;
與上方效果相同。
4、用SQL語句删除表
4.1、DELETE
文法:
DELETE FROM table_name
WHERE condition;
- 指定删除資料的表(
)table_name
- 使用條件來指定要在
子句中删除的行記錄。如果行比對條件,這些行記錄将被删除。省略WHERE子句,DELETE語句将删除表中的所有行。WHERE
除了删除資料外,
DELETE
語句傳回删除的行數。
限制删除的行數:
DELETE FROM table
LIMIT row_count;
請注意,表中的行順序未指定,是以,當使用LIMIT子句時,應始終使用ORDER BY子句,不然删除的記錄可能不是預期的那樣。
4.2、DROP
删除資料庫
DROP DATABASE
删除資料庫意味着資料庫中的所有資料和關聯對象将被永久删除,并且無法撤銷。
IF EXISTS
是該語句的可選部分,以防止您删除資料庫伺服器中不存在的資料庫。
4.3、TRUNCATE
清除表内内容,保留表結構。
4.4、不同方式的差別
- 需要永久删除,使用
。DROP
- 隻需要删除表内内容,保留表結構,使用
。TRUNCATE
- 删除部分記錄,使用
。DELETE
5、用SQL語句修改表
使用
ALTER TABLE
更改現有表的結構。
- 在
子句之後指定要更改的表名稱。ALTER TABLE
- 列出一組要應用于該表的操作。操作可以是添加新列,添加主鍵,重命名表等任何操作。
語句允許在單個ALTER TABLE語句中應用多個操作,每個操作由逗号(,)分隔。ALTER TABLE
5.1、修改列名
ALTER TABLE table_name
CHANGE 原列名 新列名 資料類型 限制;
慎重使用,注意資料類型不能省略。
5.2、删除列
ALTER TABLE table_name
DROP COLUMN 列名;
5.3、建立列
ALTER TABLE table_name
ADD COLUMN 列名 資料類型;
可以使用
FIRST
與
ALTER 列名
指定建立列的位置。
5.4、建立行
使用
INSERT INTO
語句。
5.5、删除行
使用
DELETE WHERE
語句。
5.6、修改表中資料
UPDATE table_name
SET 列1=值1,列2=值2
WHERE 條件;
6、作業
//建立course表,有student學生和class班級字段
CREATE TABLE course(
student VARCHAR(10),
class VARCHAR(10)
);
//插入資料
INSERT INTO course
VALUES
('A','Math'),
('B','English'),
('C','Math'),
('D','Biology'),
('E','Math'),
('F','Computer'),
('G','Math'),
('H','Math'),
('I','Math'),
('A','Math');
//查詢結果
SELECT * FROM course;
+---------+----------+
| student | class |
+---------+----------+
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
| A | Math |
+---------+----------+
//查詢所有超過或等于5名學生的課程(學生在每個課中不應被重複計算)
SELECT class FROM course GROUP BY class
HAVING COUNT(DISTINCT student) >= 5;
+-------+
| class |
+-------+
| Math |
+-------+
//建立一個salary表,有m=男性和f=女性的值。
CREATE TABLE salary(
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(10) NOT NULL,
sex CHAR(2) NOT NULL,
salary VARCHAR(10) NOT NULL
);
INSERT INTO salary
VALUES
(1,'A','m',2500),
(2,'B','f',1500),
(3,'C','m',5500),
(4,'D','f',500);
SELECT * FROM salary;
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
| 1 | A | m | 2500 |
| 2 | B | f | 1500 |
| 3 | C | m | 5500 |
| 4 | D | f | 500 |
+----+------+-----+--------+
//交換所有的f值和m值
//第一種方法
UPDATE salary SET sex = (
CASE sex
WHEN 'f'
THEN 'm'
WHEN 'm'
THEN 'f'
END
);
SELECT * FROM salary;
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
| 1 | A | f | 2500 |
| 2 | B | m | 1500 |
| 3 | C | f | 5500 |
| 4 | D | m | 500 |
+----+------+-----+--------+
//第二種方法
UPDATE salary SET sex = IF(
sex = 'm','f','m'
);
SELECT * FROM salary; //與上面的結果比較
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
| 1 | A | m | 2500 |
| 2 | B | f | 1500 |
| 3 | C | m | 5500 |
| 4 | D | f | 500 |
+----+------+-----+--------+
二、表聯結
1、MySQL别名
通過使用SQL語言,可以為表名稱或列名稱指定别名。使用
AS
關鍵字。
建立别名是為了讓列名稱的可讀性更強。
//列的SQL别名文法:
SELECT column_name AS alias_name//提示:如果列名稱包含空格,要求使用雙引号或方括号
FROM table_name;
//表的 SQL 别名文法:
SELECT column_name(s)
FROM table_name AS alias_name;
//列的别名示例1:指定了兩個别名,一個是 name 列的别名,一個是 country 列的别名。
SELECT name AS n, country AS c
FROM Websites;
//列的别名示例2:把三個列(url、alexa 和 country)結合在一起,并建立一個名為 "site_info" 的别名。
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
FROM Websites;
//表的别名執行個體:使用 "Websites" 和 "access_log" 表,并分别為它們指定表别名 "w" 和 "a"(通過使用别名讓 SQL 更簡短):
SELECT w.name, w.url, a.count, a.date
FROM Websites AS w, access_log AS a
WHERE a.site_id=w.id and w.name="教程";
//如果不使用别名:(與上面SQL語句效果相同)
SELECT Websites.name, Websites.url, access_log.count, access_log.date
FROM Websites, access_log
WHERE Websites.id=access_log.site_id and Websites.name="教程";
在以下情況中應使用别名:
- 在查詢中涉及超過一個表
- 在查詢中使用了函數
- 列名稱很長或者可讀性差
- 需要把兩個列或者多個列結合在一起
2、INNER JOIN
内連接配接或等值連接配接,擷取兩個表中字段比對關系的記錄。
//在RUNOOB資料庫中存在這樣兩張表:
mysql> use RUNOOB;
Database changed
mysql> show tables;
+------------------+
| Tables_in_runoob |
+------------------+
| runoob_tbl |
| tcount_tbl |
+------------------+
2 rows in set (0.01 sec)
mysql> select * from tcount_tbl;
+---------------+--------------+
| runoob_author | runoob_count |
+---------------+--------------+
| 菜鳥教程 | 10 |
| RUNOOB.COM | 20 |
| Google | 22 |
+---------------+--------------+
3 rows in set (0.00 sec)
mysql> select * from runoob_tbl;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 1 | 學習 PHP | 菜鳥教程 | 2017-04-12 |
| 2 | 學習 MySQL | 菜鳥教程 | 2017-04-12 |
| 3 | 學習 Java | RUNOOB.COM | 2015-05-01 |
| 4 | 學習 Python | RUNOOB.COM | 2016-03-06 |
| 5 | 學習 C | FK | 2017-04-05 |
+-----------+---------------+---------------+-----------------+
5 rows in set (0.00 sec)
//使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一樣)來連接配接以上兩張表來讀取runoob_tbl表中所有runoob_author字段在tcount_tbl表對應的runoob_count字段值:
mysql> select a.runoob_id,a.runoob_author,b.runoob_count
-> from runoob_tbl a
-> inner join tcount_tbl b
-> on a.runoob_author = b.runoob_author;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
| 1 | 菜鳥教程 | 10 |
| 2 | 菜鳥教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
+-----------+---------------+--------------+
4 rows in set (0.01 sec)
3、LEFT JOIN
左連接配接,擷取左表中所有記錄,即使右表沒有對應比對的記錄。
//以 runoob_tbl 為左表,tcount_tbl 為右表
mysql> select a.runoob_id,a.runoob_author,b.runoob_count
-> from runoob_tbl a
-> left join tcount_tbl b
-> on a.runoob_author = b.runoob_author;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
| 1 | 菜鳥教程 | 10 |
| 2 | 菜鳥教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
| 5 | FK | NULL |
+-----------+---------------+--------------+
5 rows in set (0.00 sec)
4、CROSS JOIN
CROSS JOIN
将傳回第一個表中的每一行與第二個表中的每一行組合在一起的所有記錄。這也意味着
CROSS JOIN
傳回連接配接表中行集的笛卡爾積。
CROSS JOIN
使用:可以以兩種方式來指定
JOIN
或文法通過列出在表
FROM
由逗号分隔的條款,而無需使用
WHERE
子句供給聯接标準。
SQL CROSS JOIN
文法:
SELECT * FROM [表1] CROSS JOIN [表2]
或
SELECT * FROM [表1],[表2]
mysql> select * from runoob_tbl cross join tcount_tbl;
+-----------+---------------+---------------+-----------------+---------------+--------------+
| runoob_id | runoob_title | runoob_author | submission_date | runoob_author | runoob_count |
+-----------+---------------+---------------+-----------------+---------------+--------------+
| 1 | 學習 PHP | 菜鳥教程 | 2017-04-12 | 菜鳥教程 | 10 |
| 1 | 學習 PHP | 菜鳥教程 | 2017-04-12 | RUNOOB.COM | 20 |
| 1 | 學習 PHP | 菜鳥教程 | 2017-04-12 | Google | 22 |
| 2 | 學習 MySQL | 菜鳥教程 | 2017-04-12 | 菜鳥教程 | 10 |
| 2 | 學習 MySQL | 菜鳥教程 | 2017-04-12 | RUNOOB.COM | 20 |
| 2 | 學習 MySQL | 菜鳥教程 | 2017-04-12 | Google | 22 |
| 3 | 學習 Java | RUNOOB.COM | 2015-05-01 | 菜鳥教程 | 10 |
| 3 | 學習 Java | RUNOOB.COM | 2015-05-01 | RUNOOB.COM | 20 |
| 3 | 學習 Java | RUNOOB.COM | 2015-05-01 | Google | 22 |
| 4 | 學習 Python | RUNOOB.COM | 2016-03-06 | 菜鳥教程 | 10 |
| 4 | 學習 Python | RUNOOB.COM | 2016-03-06 | RUNOOB.COM | 20 |
| 4 | 學習 Python | RUNOOB.COM | 2016-03-06 | Google | 22 |
| 5 | 學習 C | FK | 2017-04-05 | 菜鳥教程 | 10 |
| 5 | 學習 C | FK | 2017-04-05 | RUNOOB.COM | 20 |
| 5 | 學習 C | FK | 2017-04-05 | Google | 22 |
+-----------+---------------+---------------+-----------------+---------------+--------------+
15 rows in set (0.00 sec)
5、自連接配接
自連接配接就是同一張表的不同列連接配接在一起,也就是自我連接配接。
mysql> select a.runoob_id,a.runoob_author,b.runoob_count
-> from runoob_tbl a,tcount_tbl b
-> where a.runoob_author = b.runoob_author;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
| 1 | 菜鳥教程 | 10 |
| 2 | 菜鳥教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
+-----------+---------------+--------------+
4 rows in set (0.00 sec)
6、UNION
MySQL UNION 操作符用于連接配接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會删除重複的資料。
//MySQL UNION 操作符文法格式:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
參數:
- expression1, expression2, … expression_n: 要檢索的列。
- tables: 要檢索的資料表。
- WHERE conditions: 可選, 檢索條件。
- DISTINCT: 可選,删除結果集中重複的資料。預設情況下 UNION 操作符已經删除了重複資料,是以 DISTINCT 修飾符對結果沒啥影響。
- ALL: 可選,傳回所有結果集,包含重複資料。
//從"runoob_tbl"表和"tcount_tbl"表中選取所有不同的runoob_author(隻有不同的值):
mysql> select runoob_author from runoob_tbl
-> union
-> select runoob_author from tcount_tbl
-> order by runoob_author;
+---------------+
| runoob_author |
+---------------+
| FK |
| Google |
| RUNOOB.COM |
| 菜鳥教程 |
+---------------+
4 rows in set (0.01 sec)
//使用union all從"runoob_tbl"表和"tcount_tbl"表中選取所有的runoob_author(也有重複的值):
mysql> select runoob_author from runoob_tbl
-> union all
-> select runoob_author from tcount_tbl
-> order by runoob_author;
+---------------+
| runoob_author |
+---------------+
| FK |
| Google |
| RUNOOB.COM |
| RUNOOB.COM |
| RUNOOB.COM |
| 菜鳥教程 |
| 菜鳥教程 |
| 菜鳥教程 |
+---------------+
8 rows in set (0.00 sec)
7、以上幾種方式的差別和聯系
- INNER JOIN:内連接配接或等值連接配接,擷取兩個表中字段比對關系的記錄。
- LEFT JOIN:左連接配接,擷取左表中所有記錄,即使右表沒有對應比對的記錄。
- CROSS JOIN:将傳回第一個表中的每一行與第二個表中的每一行組合在一起的所有記錄。笛卡爾積
- 自連接配接:同一張表的不同列連接配接在一起,也就是自我連接配接。
- UNION :用于連接配接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會删除重複的資料。
8、作業
mysql> use program;
Database changed
mysql> create table Person(
-> PersonId int(11) primary key,
-> FirstName varchar(10),
-> LastName varchar(10)
-> );
Query OK, 0 rows affected (0.82 sec)
mysql> desc Person;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| PersonId | int(11) | NO | PRI | NULL | |
| FirstName | varchar(10) | YES | | NULL | |
| LastName | varchar(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> create table Address(
-> AddressId int(11) primary key,
-> PersonId int(11),
-> City varchar(10),
-> State varchar(10)
-> );
Query OK, 0 rows affected (0.97 sec)
mysql> desc Address;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| AddressId | int(11) | NO | PRI | NULL | |
| PersonId | int(11) | YES | | NULL | |
| City | varchar(10) | YES | | NULL | |
| State | varchar(10) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
mysql> insert into Person
-> values(1,'A1','B1'),(2,'A2','B2'),(3,'A3','B3');
Query OK, 3 rows affected (0.15 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from Person;
+----------+-----------+----------+
| PersonId | FirstName | LastName |
+----------+-----------+----------+
| 1 | A1 | B1 |
| 2 | A2 | B2 |
| 3 | A3 | B3 |
+----------+-----------+----------+
3 rows in set (0.00 sec)
mysql> insert into Address
-> values(1,2,'a1','b1'),(2,3,'a2','b2'),(3,1,'a3','b3');
Query OK, 3 rows affected (0.22 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from Address;
+-----------+----------+------+-------+
| AddressId | PersonId | City | State |
+-----------+----------+------+-------+
| 1 | 2 | a1 | b1 |
| 2 | 3 | a2 | b2 |
| 3 | 1 | a3 | b3 |
+-----------+----------+------+-------+
3 rows in set (0.00 sec)
//SQL查詢,無論 person 是否有位址資訊,都需要基于上述兩表提供 person 的以下資訊:FirstName, LastName, City, State
mysql> select p.FirstName,p.LastName,a.City,a.State
-> from Person p
-> left join Address a
-> on p.PersonId = a.PersonId;
+-----------+----------+------+-------+
| FirstName | LastName | City | State |
+-----------+----------+------+-------+
| A2 | B2 | a1 | b1 |
| A3 | B3 | a2 | b2 |
| A1 | B1 | a3 | b3 |
+-----------+----------+------+-------+
3 rows in set (0.00 sec)
//編寫一個 SQL 查詢,來删除 email 表中所有重複的電子郵箱,重複的郵箱裡隻保留 ID 最小 的那個。
mysql> select * from email;
+----+---------+
| ID | Email |
+----+---------+
| 1 | [email protected].com |
| 2 | [email protected].com |
| 3 | [email protected].com |
+----+---------+
3 rows in set (0.30 sec)
mysql> delete e1 from email e1
-> left join email e2
-> on e1.Email = e2.Email
-> where e1.ID>e2.ID;
Query OK, 1 row affected (0.26 sec)
mysql> select * from email;
+----+---------+
| ID | Email |
+----+---------+
| 1 | [email protected].com |
| 2 | [email protected].com |
+----+---------+
2 rows in set (0.00 sec)
參考:
https://www.yiibai.com/mysql
http://www.runoob.com/mysql/mysql-join.html
http://www.runoob.com/sql/sql-alias.html
https://www.sqlguides.com/sql_cross_join.php