天天看點

MySQL學習筆記(3)一、表操作二、表聯結

文章目錄

  • 一、表操作
    • 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如何比較特定資料類型的值。
           
資料類型 指定值和範圍

char

String(0~255)

varchar

String(0~255)

tinytext

String(0~255)

text

String(0~65536)

blob

String(0~65536)

mediumtext

String(0~16777215)

mediumblob

String(0~16777215)

longblob

String(0~4294967295)

longtext

String(0~4294967295)

tinyint

Integer(-128~127)

smallint

Integer(-32768~32767)

mediumint

Integer(-8388608~8388607)

int

Integer(-214847668~214847667)

bigint

Integer(-9223372036854775808~9223372036854775807)

float

decimal(精确到23位小數)

double

decimal(24~54位小數)

decimal

double

轉儲為字元串形式

date

YYYY-MM-DD

datetime

YYYY-MM-DD HH:MM:SS

timestamp

YYYYMMDDHHMMSS

time

HH:MM:SS

enum

選項值之一

set

選項值子集

boolean

tinyint(1)

1.2、MySQL數值資料類型

數字類型 描述
TINYINT 一個很小的整數
SMALLINT 一個小的整數
MEDIUMINT 一個中等大小的整數
INT 一個标準整數
BIGINT 一個大整數
DECIMAL 定點數

FLOAT

單精度浮點數

DOUBLE

雙精度浮點數
BIT 一個位元組字段

1.3、MySQL布爾資料類型

MySQL沒有内置的`BOOLEAN`或`BOOL`整數,是以要表示布爾值,MySQL使用最小的整數類型。也就是`TINYINT(1)`。
換句話說,`BOOLEN`和`BOOL`是`TINYINT(1)`的同義詞。
           

1.4、MySQL字元串資料類型

在MySQL中,字元串可以容納從純文字到二進制資料(如圖像或檔案)的任何内容。
可以通過使用`LIKE`運算符,正規表達式和全文搜尋,根據模式來比較和搜尋字元串。
           
字元串類型 描述
char 固定長度的非二進制(字元)字元串
varchar 可變長度的非二進制字元串

BINARY

一個固定長度的二進制字元串

VARBINARY

一個可變長度的二進制字元串

TINYBLOB

一個非常小的BLOB(二進制大對象)

BLOB

一個小的BLOB(二進制大對象)

MEDIUMBLOB

一個中等大小的BLOB(二進制大對象)

LONGBLOB

一個大的BLOB(二進制大對象)
TINYTEXT 一個非常小的非二進制字元串
TEXT 一個小的非二進制字元串
MEDIUMTEXT 一個中等大小的非二進制字元串
LONGTEXT 一個很大的非二進制字元串
ENUM 枚舉; 每個列值可以被配置設定一個枚舉成員

SET

集合; 每個列值可以配置設定零個或多個

SET

成員

1.5、MySQL日期和時間資料類型

MySQL提供日期和時間的類型以及日期和時間的組合。
此外,MySQL還支援時間戳資料類型,用于跟蹤表的一行中的更改。
如果隻想存儲沒有日期和月份的年份資料,則可以使用`YEAR`資料類型。
           
字元串類型 描述
DATE

YYYY-MM-DD

格式的日期值
TIME

hh:mm:ss

格式的時間值
DATETIME

YYYY-MM-DD hh:mm:ss

格式的日期和時間值
TIMESTAMP

YYYY-MM-DD hh:mm:ss

格式的時間戳記值

YEAR

YYYY

YY

格式的年值

1.6、MySQL空間資料類型

字元串類型 描述
GEOMETRY 任何類型的空間值
POINT 一個點(一對X-Y坐标)
LINESTRING 曲線(一個或多個POINT值)
POLYGON 多邊形
GEOMETRYCOLLECTION

GEOMETRY

值的集合
MULTILINESTRING

LINESTRING

值的集合
MULTIPOINT

POINT

值的集合
MULTIPOLYGON

POLYGON

值的集合

1.7、JSON資料類型

2、用SQL語句建立表

2.1、語句解釋

建立新表:

CERATE TABLE

語句

簡單的形式說明文法:

CERATE TABLE [IF NOT EXISTS] table_name(
     	column_list
     )engine=table_type;
           
  • 首先,指定

    CERATE TABLE

    子句之後建立的表名稱。表名在資料庫中必須是唯一的。

    IF NOT EXISTS

    是語句的可選部分,允許檢查正在建立的表是否存在于資料庫中。如果存在,MySQL會忽略整個語句,不會建立任何新的表。建議使用。
  • 其次,在

    column_list

    部分指定表的清單。字段的列用逗号(

    ,

    )分隔。
  • 需要為

    engine

    子句中的表指定存儲引擎。可以使用任何引擎,預設使用InnoDB。

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,……)
           

資料庫建立示例:

MySQL學習筆記(3)一、表操作二、表聯結

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;
           

查詢結果:

MySQL學習筆記(3)一、表操作二、表聯結

不指定列名

為表中所有列指定相應列的值,可以不指定列名添加。

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

    子句中删除的行記錄。如果行比對條件,這些行記錄将被删除。省略WHERE子句,DELETE語句将删除表中的所有行。

除了删除資料外,

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

内連接配接或等值連接配接,擷取兩個表中字段比對關系的記錄。

MySQL學習筆記(3)一、表操作二、表聯結
//在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

左連接配接,擷取左表中所有記錄,即使右表沒有對應比對的記錄。

MySQL學習筆記(3)一、表操作二、表聯結
//以 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

繼續閱讀