MYSQL基础与练习

tanqi
18
2025-04-07

各数据类型及字节长度一览表

数据类型

字节长度

范围或用法

Bit

1

无符号[0,255],有符号[-128,127],天缘博客备注:BIT和BOOL布尔型都占用1字节

TinyInt

1

整数[0,255]

SmallInt

2

无符号[0,65535],有符号[-32768,32767]

MediumInt

3

无符号[0,224-1],有符号[-223,2^23-1]]

Int

4

无符号[0,232-1],有符号[-231,2^31-1]

BigInt

8

无符号[0,264-1],有符号[-263 ,2^63 -1]

Float(M,D)

4

单精度浮点数。天缘博客提醒这里的D是精度,如果D<=24则为默认的FLOAT,如果D>24则会自动被转换为DOUBLE型。

Double(M,D)

8

双精度浮点。

Decimal(M,D)

M+1或M+2

未打包的浮点数,用法类似于FLOAT和DOUBLE,天缘博客提醒您如果在ASP中使用到Decimal数据类型,直接从数据库读出来的Decimal可能需要先转换成Float或Double类型后再进行运算。

Date

3

以YYYY-MM-DD的格式显示,比如:2009-07-19

Date Time

8

以YYYY-MM-DD HH:MM:SS的格式显示,比如:2009-07-19 11:22:30

TimeStamp

4

以YYYY-MM-DD的格式显示,比如:2009-07-19

Time

3

以HH:MM:SS的格式显示。比如:11:22:30

Year

1

以YYYY的格式显示。比如:2009

Char(M)

M

定长字符串。

VarChar(M)

M

变长字符串,要求M<=255

Binary(M)

M

类似Char的二进制存储,特点是插入定长不足补0

VarBinary(M)

M

类似VarChar的变长二进制存储,特点是定长不补0

Tiny Text

Max:255

大小写不敏感

Text

Max:64K

大小写不敏感

Medium Text

Max:16M

大小写不敏感

Long Text

Max:4G

大小写不敏感

TinyBlob

Max:255

大小写敏感

Blob

Max:64K

大小写敏感

MediumBlob

Max:16M

大小写敏感

LongBlob

Max:4G

大小写敏感

Enum

1或2

最大可达65535个不同的枚举值

Set

可达8

最大可达64个不同的值

(1,'张琪',19,'男',9386,'2003-04-02'),
(2,'向山脊',20,'女',8181,'2006-08-09'),
(3,'李元一',39,'男',1586,'2008-03-12'),
(4,'赵元蝶',56,'女',2186,'2002-09-26'),
(5,'秦志涛',85,'男',8386,'2023-06-02'),
(6,'张成俊',10,'男',1386,'2006-09-02'),
(7,'张铭',5,'女',6386,'2002-05-02'),
(8,'曹爽',16,'女',9386,'2008-01-02'),
(10,'徐一凡',17,'男',9386,'2006-04-15'),
(11,'朱浪',42,'女',386,'2003-04-36'),
(12,'吴亦凡',32,'女',386,'2026-04-01'),
(13,'李易峰',22,'女',1386,'2066-02-22'),
(14,'王俊凯',19,'男',1386,'2022-01-12'),
(15,'周杰伦',19,'男',4386,'2033-03-26');

show databases;(查询所有数据库)

create database 数据库名;(创建数据库)

use 数据库名(使用数据库)

drop database 数据库名(删除数据库)

select database(); (查看现在使用的什么数据库)

建表语法

create table 表名(列 数据类型);             (创建表)

show tables;                (查看表)

desc 表名;                      (查看表结构)
 


alter table 原表名 rename to 新表名;             (修改表的名字)

alter table 表名 add 列名 数据类型; 																									(添加表的列)

alter table 表名 modify 需要修改的表类型列名 数据类型     (修改表 列的数据类型)

alter table 表名 change  列名  新列名 新类型;         (修改列名的名字与类型)

alter table 表名 drop 列名;                     (删除列名)

drop table 表名;                     (删除表)

表数据的增删改

insert into 表名(列名1,列名2) values (值1,值2);            (单个添加数据)

insert into 表名 values (值1,值2);                (给全部列表添加数据)
 
insert into 表名(列名1,列名2)values (值1,值2),(值1,值2);    (批量添加数据)

insert into 表名 values(值1,值2),(值1,值2);            (也是批量添加表数据)
update 表名 set 列名1=值1,列名2=值2 where 条件判断;         (修改表数据)

{如update 表名 set NianLing=18,name='张三' where id=1;
修改了 年龄等于18,姓名等于张三  条件就是1号用户(id)}


delete from 表名 where 条件判断               (删除表数据)

查表语法

select * from 表名;                       (查询表的全部数据)

select 列名1,列名2  from 表名;               (查询指定字段表数据)

select distinct 列名1,列名2 from 表名;       (去除重复查询)

select 列名1 运算符+-*\ 列名2 from 表名;      (查询指定列 可进行ifnull判断是否为空)

select 列名1 ifnull(列名,0)+10 from 表名;     (ifnull判断是否为空)

select 列名1 ifnull(列名,0)+10 as 新列名 from 表名; (列名修改)

条件查询

select 列名列表 from 表名 where 条件;         (条件查询)

(select * from 表名 where 列名>20;)                (查询 年龄大于20的)

(select * from 表名 where 列名>20 and 列名<30;)     (查询年龄大于20小于30的)

(select * from 表名 where 列名=22 or 列名=32; )    ( 也可以使用in(22,32)  (查询年龄22和32的)

(select * from 表名 where 列名 like '男';)        (查询性别为男的)

(select * from 表名 where 列名 like '张%';)     (查询名字为张的人 (%代表所有字符)(_表示单个字符))

表聚合查询

//将一列数据作为一个整体 进行纵向的计算   像什么求和-平均值-求最大值
//conunt列名 统计数量
//max  最大值  min 最小值  sum 求和  avg 平均值

select 函数名(列名) from 表名 where(条件);

select count(*) from zq;      (查看表中记录的总条数)

select max(nn) from zq;      (最大年龄)

select min(nn) from zq;       (最小年龄)

select sum(nn) from zq;         (计算总年龄)

select avg(nn) from zq;         (计算平均年龄)

排序查询

select 列名列表 from 表名 where(条件) order by 列名 排序方式,列名 排序方式..;
//asc 升序     desc 降序 

select * from zqq order by nn;   (年龄升序)

select * from zqq where name like '张_' order by nn;             (张姓年龄升序)(记得加条件)

select * from zqq where name like '__' order by nn desc;          (对年龄降序 条件是name=两个字符)

select * from zqq order by xb,nn desc;         (按照性别相同排序,年龄降序)

分组查询

select 列名列表 from 表名 where group by 分组列名
having [分组后条件过滤]  (可选)
order by [排序方式]      (可选)

select xb,sum(age) from zq group by xb; 	(查询男女性别的 年龄总和)

select xb,sum(age) from zq where age<40 group by xb;   (查询男女性别 年龄小于40岁的总和)

select xb,sum(age) getage from zq where age<40 group by xb having getage < 100;  (查询男女性别 年龄小于40岁的总和 再次查询年龄小于100总和的性别)

select xb,sum(age) getage from zq where age<40 group by xb having getage < 125 order by getage desc;          
(此行是查询男女性别 年龄小于40岁的总和 再次查询年龄小于100总和的性别 以降序的方式输出)

!!!!!!重点!!!!!!!!
分组查询:不太适合男女查询,可用于商品 品牌之间的 品牌-总金额-库存等查询
db1;

分组查询练习

-- 创建数据表    与数据准备
	id INT,				-- 商品编号
	NAME VARCHAR(20),	-- 商品名称
	price DOUBLE,		-- 商品价格
	brand VARCHAR(10),	-- 商品品牌
	stock INT,			-- 商品库存
	insert_time DATE    -- 添加时间


(1,'华为手机',3999,'华为',23,'2088-03-10'),
(2,'小米手机',2999,'小米',30,'2088-05-15'),
(3,'苹果手机',5999,'苹果',18,'2088-08-20'),
(4,'华为电脑',6999,'华为',14,'2088-06-16'),
(5,'小米电脑',4999,'小米',26,'2088-07-08'),
(6,'苹果电脑',8999,'苹果',15,'2088-10-25'),
(7,'联想电脑',7999,'联想',NULL,'2088-11-11');

group by 分组列名
having [分组后条件过滤]  (可选)
order by [排序方式]      (可选)

题目1:按照品牌分组,获取每组商品的总金额
| brand  | sum(price) |
+--------+------------+
| 华为   |      10998 |
| 小米   |       7998 |
| 联想   |       7999 |
| 苹果   |      14998 |
+--------+------------+
实现代码:   select brand,sum(price) from pp group by brand;

题目2:对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额
+--------+------------+
| brand  | sum(price) |
+--------+------------+
| 华为   |       6999 |
| 小米   |       4999 |
| 联想   |       7999 |
| 苹果   |      14998 |
+--------+------------+
实现代码:select brand,sum(price) from pp where price>4000  group by brand;

题目3:对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的
+--------+-------+
| brand  | gg    |
+--------+-------+
| 联想   |  7999 |
| 苹果   | 14998 |
+--------+-------+
实现代码:  select brand,sum(price) gg from pp where price>4000  group by brand having gg > 7000;

题目4:对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的,并按照总金额的降序排列
+--------+-------+
| brand  | gg    |
+--------+-------+
| 苹果   | 14998 |
| 联想   |  7999 |
+--------+-------+

实现代码:select brand,sum(price) gg from pp where price>4000  group by brand having gg > 7000 order by gg desc;

分页查询

select 列名列表 from 表名
where 条件
group by 分组列名
having 分组的过滤条件
order by 排序列名 排序方式
limit 当前页数 每页显示的条数
当前页数有个公式:当前页数=(当前页数-1) * 每页显示的条数

select * from pingpai limit 0,3;       (显示第一页数据)
(从0开始也就是从第一页开始显示3条数据)可以依次类推  (1,3) (2,3) (3,3)

约束

约束是什么

//约束=限制(数据能不能重复) 保证数据的正确性,有效性,完整性

primary key  [主键约束]

primary key auto_increment     [主键自增]

uni1ue       				[唯一约束]

not null         [非空约束]

foreign key      [外键约束]

foreign key on update cascade [外键级联更新]

主键约束

//主键约束默认包含非空和唯一两个功能
//一张表只能有一个主键
//主键一般用于表中的唯一标识
//这样建表后id就是唯一的 不同的


create table 表名(
	列名  数据类型  primary key,
  );


//删除主键约束
alter table 表名 drop primary key;

//建表后单独添加主键约束
alter table 表名 mooify 列名 数据类型 primary key;

主键自增约束

create table 表名(
		列名 数据类型 primary key auto_increment,
  )
//写了自增约束后会自动输入id 1 2 3 依次类推

//删除主键自增约束
alter table 表名 modify 列名 数据类型;

alter table 表名 modify 列名 数据类型 auto_increment;

主键唯一约束

create table 表名(
	列名 数据类型 unique,  
)

//删除唯一约束
alter table 表名 drop index 列名;

//建表后单独添加唯一主键
alter table 表名 modify 列名 数据类型 unique;

主键非空约束

create table 表名(
	列名 数据类型 not null,  
)

//删除非空约束
alter table 表名 modify 列名 数据类型;

//建表后删除非空约束 
alter table 表名 modify 列名 数据类型 not null;

主键外键约束

create table 表名(
  	列名 数据类型 约束;
    constraint 外键名 foreign kry(本表外键名) references 主表名 (主表主键列名)
)


//删除外键约束
alter table 表名 drop foreign key 外键名;

//建表后单独添加外键约束
alter table 表名 add
constrint 外键名 foreign key (本表外键列名) references 主表名 (主键列名)

主键外键联级约束

//由于不推荐使用 容易造成数据损失 了解就行

//添加级联更新

alter table 表名 add
constrint 外键名 foreign key (本表外键列名) references 主表名 (主键列名)
on update cascade on delete cascade; //添加级联更新 级联删除

mysql多表查询

//多表概念
//大致意思就是,多张数据表,而表与表之间是可以有一定关系的,这种关联关系通过外键约束实现
//分类:  一对一    一对多     多对多 

一对一表

//适用场景:人与身份证,一个身份证只对应一个人


######创建一个身份证信息表
create table sfz(
    -> id int primary key auto_increment,            //设置主键id  主键自增
    -> name varchar(20)
    -> );

INSERT INTO fr VALUES (NULL,'秦之涛'),(NULL,'张琪')

create table card( 
  id int primary key auto_increment,     //设置主键id  主键自增
  number varchar(20) unique not null,     //设置主键唯一约束 和非空约束
  pid int unique,
  constraint st_fk foreign key (pid) references sfz(id)
	);

INSERT INTO caro VALUES (NULL,'3432',1),(NULL,'4422',2),(NULL,'4213',3)

	//constraint 外键列名 foreign key(本表外键名) references 主表名 (连接主表列名)
	//设置表连接 pid关联sfz的id 设置唯一约束,

//添加数据后就是实现外键链接

一对多表

//用户和订单:一个用户可以有多个订单,
//商品分类和商品,一个分类下可以有多个商品

 uid int,
constraint  外键列名 freign key(本表外键列名) references 主表名(主表列名)

CREATE TABLE pp(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
);


INSERT INTO pp VALUES (NULL,'联想'),(NULL,'惠普'),(NULL,'外星人')

CREATE TABLE sp(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	ssid INT,
	CONSTRAINT sp_aa FOREIGN KEY(ssid) REFERENCES pp(id)
);
	
INSERT INTO sp VALUES (NULL,'拯救者',1),(NULL,'小新',1),(NULL,'惠普2号',2),(NULL,'惠普3号',2),(NULL,'外星人2号',3),(NULL,'外星人3号',3)

多对多表

//学生和课程关系,一个学生可以选择多个课程,一个课程也可以被多个学生选择
//需要借助第三张表的中间表,中间表至少包含两个列,这两个列作为中间表的外键,分别关联两张表的主键

sid int //用于和student表中的id进行外键关联  (添加学生的外键约束)

cid int //用于和coures表中的id进行外键关联  (添加课程外键约束)

CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);

INSERT INTO student VALUES(NULL,'张琪'),(NULL,'向同学'),(NULL,'赵同学'),(NULL,'曹爽')

CREATE TABLE ture(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO ture VALUES(NULL,'李老师'),(NULL,'法老师'),(NULL,'赵老师'),(NULL,'元老师')


CREATE TABLE zj(
id INT PRIMARY KEY AUTO_INCREMENT,
ppid INT,
ddid INT,
CONSTRAINT ssd_fk FOREIGN KEY(ppid) REFERENCES student(id),
CONSTRAINT sst_lk FOREIGN KEY(ddid) REFERENCES ture(id)

  
INSERT INTO zj VALUES (NULL,1,1),(NULL,1,2),(NULL,2,1),(NULL,2,2),(NULL,3,1),(NULL,3,2),(NULL,4,1),(NULL,4,2);

多表查询

-- 创建db6数据库
CREATE DATABASE db6;
-- 使用db6数据库
USE db6;

-- 创建user表
CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,	-- 用户id
	NAME VARCHAR(20),			        -- 用户姓名
	age INT                             -- 用户年龄
);
-- 添加数据
INSERT INTO USER VALUES (1,'张三',23);
INSERT INTO USER VALUES (2,'李四',24);
INSERT INTO USER VALUES (3,'王五',25);
INSERT INTO USER VALUES (4,'赵六',26);


-- 订单表
CREATE TABLE orderlist(
	id INT PRIMARY KEY AUTO_INCREMENT,	-- 订单id
	number VARCHAR(30),					-- 订单编号
	uid INT,    -- 外键字段
	CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
);
-- 添加数据
INSERT INTO orderlist VALUES (1,'hm001',1);
INSERT INTO orderlist VALUES (2,'hm002',1);
INSERT INTO orderlist VALUES (3,'hm003',2);
INSERT INTO orderlist VALUES (4,'hm004',2);
INSERT INTO orderlist VALUES (5,'hm005',3);
INSERT INTO orderlist VALUES (6,'hm006',3);
INSERT INTO orderlist VALUES (7,'hm007',NULL);


-- 商品分类表
CREATE TABLE category(
	id INT PRIMARY KEY AUTO_INCREMENT,  -- 商品分类id
	NAME VARCHAR(10)                    -- 商品分类名称
);
-- 添加数据
INSERT INTO category VALUES (1,'手机数码');
INSERT INTO category VALUES (2,'电脑办公');
INSERT INTO category VALUES (3,'烟酒茶糖');
INSERT INTO category VALUES (4,'鞋靴箱包');


-- 商品表
CREATE TABLE product(
	id INT PRIMARY KEY AUTO_INCREMENT,   -- 商品id
	NAME VARCHAR(30),                    -- 商品名称
	cid INT, -- 外键字段
	CONSTRAINT cp_fk1 FOREIGN KEY (cid) REFERENCES category(id)
);
-- 添加数据
INSERT INTO product VALUES (1,'华为手机',1);
INSERT INTO product VALUES (2,'小米手机',1);
INSERT INTO product VALUES (3,'联想电脑',2);
INSERT INTO product VALUES (4,'苹果电脑',2);
INSERT INTO product VALUES (5,'中华香烟',3);
INSERT INTO product VALUES (6,'玉溪香烟',3);
INSERT INTO product VALUES (7,'计生用品',NULL);


-- 中间表
CREATE TABLE us_pro(
	upid INT PRIMARY KEY AUTO_INCREMENT,  -- 中间表id
	uid INT, -- 外键字段。需要和用户表的主键产生关联
	pid INT, -- 外键字段。需要和商品表的主键产生关联
	CONSTRAINT up_fk1 FOREIGN KEY (uid) REFERENCES USER(id),
	CONSTRAINT up_fk2 FOREIGN KEY (pid) REFERENCES product(id)
);
-- 添加数据
INSERT INTO us_pro VALUES (NULL,1,1);
INSERT INTO us_pro VALUES (NULL,1,2);
INSERT INTO us_pro VALUES (NULL,1,3);
INSERT INTO us_pro VALUES (NULL,1,4);
INSERT INTO us_pro VALUES (NULL,1,5);
INSERT INTO us_pro VALUES (NULL,1,6);
INSERT INTO us_pro VALUES (NULL,1,7);
INSERT INTO us_pro VALUES (NULL,2,1);
INSERT INTO us_pro VALUES (NULL,2,2);
INSERT INTO us_pro VALUES (NULL,2,3);
INSERT INTO us_pro VALUES (NULL,2,4);
INSERT INTO us_pro VALUES (NULL,2,5);
INSERT INTO us_pro VALUES (NULL,2,6);
INSERT INTO us_pro VALUES (NULL,2,7);
INSERT INTO us_pro VALUES (NULL,3,1);
INSERT INTO us_pro VALUES (NULL,3,2);
INSERT INTO us_pro VALUES (NULL,3,3);
INSERT INTO us_pro VALUES (NULL,3,4);
INSERT INTO us_pro VALUES (NULL,3,5);
INSERT INTO us_pro VALUES (NULL,3,6);
INSERT INTO us_pro VALUES (NULL,3,7);
INSERT INTO us_pro VALUES (NULL,4,1);
INSERT INTO us_pro VALUES (NULL,4,2);
INSERT INTO us_pro VALUES (NULL,4,3);
INSERT INTO us_pro VALUES (NULL,4,4);
INSERT INTO us_pro VALUES (NULL,4,5);
INSERT INTO us_pro VALUES (NULL,4,6);
INSERT INTO us_pro VALUES (NULL,4,7);

内连接查询

//查询有交集的数据也就是有外键的数据


select 列名 from 表名 inner join 表名2 on 关联条件

select * from 表1 inner join 表2 on orderlist.uid=user.id  (关联条件表2的uid=表1的id)
(查询到订单号,订单名称,订单归属于用户id,用户姓名,用户年龄)

select * from 表1 起别名 innsr join 表2 起别名 on o.uid=u.id    (起别名方法)

//查询用户姓名 年龄 订单编号
select
    	u.name      ----用户姓名
    	u.age       -----用户年龄
    	o.number		------用户订单编号
from
      	user u
inner join
    	orderlist o
on
    	o.uid=u.id



//还有隐式内连接查询
select 
    	u.name      ----用户姓名
    	u.age       -----用户年龄
    	o.number		------用户订单编号
form
    	user u,
    	orderlist o
where
  	o.uid=u.id

外连接查询

查询全部数据,也可以查询没有交际的数据
记住一个就差不多了

select 列名 from 表名1 left outer join 表名2 on 条件;  (左外连接)

select 
    	u.*,
    	o.number
from
    	user u
left outer join
      orderlist o
on
      o.uid=u.id;


select 列名 from 表名1 right outer join 表名2 on 条件  (右外连接)

select 
  		o.*,
    	u.name
	
from
  	user u
right outer join
    orderlist o
on 
  	o.uid=u.id;

子查询

查询语句中嵌套了查询语句,我们就将嵌套称为子查询

查询结果 单行单列

select 列名 from 表名 where 列名=(select 列名 from 表名) where 条件

select max(age) from user;

select name,age from user where age=(select max(age) from user);  

查询结果 多行单列
select 列名 from 表名 where 列名 in (select 列名 from 表名 where 条件);

select * from orderlist where uid in (1,2);

select * from user where name name in ('张三','李四');

select * from orderlist where uid in (elect * from user where name name in ('张三','李四'));

多行多列
select 列名 from 表名 别名 (select 列名 from 表名 where 条件)别名 where 条件

select * from orderlist where id<4;

select
      u.name,
    	o.number
from
  	user u,
  	(select * from orderlist where id<4) o
where
  	o.uid=u.id

自关联查询

在同一张表中数据有关联性,我们可以把这张表当成多个表查询

-- 创建员工表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	mgr INT,
	salary DOUBLE
);
-- 添加数据
INSERT INTO employee VALUES 
(1001,'孙悟空',1005,9000.00),
(1002,'猪八戒',1005,8000.00),
(1003,'沙和尚',1005,8500.00),
(1004,'小白龙',1005,7900.00),
(1005,'唐僧',NULL,15000.00),
(1006,'武松',1009,7600.00),
(1007,'李逵',1009,7400.00),
(1008,'林冲',1009,8100.00),
(1009,'宋江',NULL,16000.00);

-- 查询所有员工的姓名及其直接上级的姓名,没有上级的员工也需要查询
/*
分析:
	员工姓名 employee表        直接上级姓名 employee表
	条件:employee.mgr = employee.id
	查询左表的全部数据,和左右两张表交集部分数据,使用左外连接
*/
SELECT
	t1.name,	-- 员工姓名
	t1.mgr,		-- 上级编号
	t2.id,		-- 员工编号
	t2.name     -- 员工姓名
FROM
	employee t1  -- 员工表
LEFT OUTER JOIN
	employee t2  -- 员工表
ON
	t1.mgr = t2.id;

多表练习

查询用户编号,姓名,年龄,订单编号。

查询所有用户,用户的编号,姓名。年龄,订单编号

查询所有的订单,用户的编号,姓名,年龄。订单编号

查询用户年龄大于23岁的信息,显示用户的编号,姓名,年龄,订单编号

查询张三和李四的用户信息,显示用户的编号,姓名年龄,订单编号

查询商品分类的编号,分类名称,分类下的商品名称

查询所有的商品分类,商品分类的编号,分类名称,分类下的商品名称

查询所有的商品信息,商品分类的编号,分类名称,分类下的商品名称

查询所有用户和所有商品的商品,显示用户的编号和姓名,年龄,商品名称

查询张三和李四这两个用户可以看到的商品。显示用户的编号,年龄,姓名,商品名称

modify(修改列类型) change(修改列名与类型)

update表名set (修改表数据) delete (删除表数据)


distinct (去重复查询) and(及) or (含有) like (如)
count(总条数) ava(平均)
order by (默认升序 desc(降序))
group by (分组查询) having (分组后的条件查询)
limit (分页查询)
primary key(主键约束)auto_increment (主键自增)unliue(唯一约束)


constraint (取名字) foreign key (外键约束) references (连接主表)
内连查询 inner join
内连查询隐式 where
左外连接 left outer join 右连接 right outer join

动物装饰