作用:
为了保证数据的有效性和完整性
mysql中常用的约束:主键约束(primarykey) 唯一约束(unique) 非空约束(notnull) 外键约束(foreignkey)
主键约束:被修饰过的字段唯一非空
注意:一张表只能有一个主键,这个主键可以包含多个字段
方式1:建表的同时添加约束 格式: 字段名称 字段类型 primarykey
方式2:建表的同时在约束区域添加约束
所有的字段声明完成之后,就是约束区域了
格式: primarykey(字段1,字段2)createtable pk01(
id int,
username varchar(20),primarykey(id));insertinto pk01 values(1,'tom');-- 成功insertinto pk01 values(1,'tom');-- 失败 Duplicate entry '1' for key 'PRIMARY'insertinto pk01 values(null,'tom');-- 失败 Column 'id' cannot be nullcreatetable pk01(
id intprimarykey,
username varchar(20),primarykey(id));-- 错误的 一张表只能有一个主键
方式3:建表之后,通过修改表结构添加约束
createtable pk02(
id int,
username varchar(20));altertable pk02 addprimarykey(字段名1,字段名2..);altertable pk02 addprimarykey(id,username);insertinto pk02 values(1,'tom');-- 成功insertinto pk02 values(1,'tomcat');-- 成功insertinto pk02 values(1,'tomcat');-- 失败
唯一约束:(了解)
被修饰过的字段唯一,对null不起作用
方式1:建表的同时添加约束 格式: 字段名称 字段类型 uniquecreatetable un(
id intunique,
username varchar(20)unique);insertinto un value(10,'tom');-- 成功insertinto un value(10,'jack');-- 错误 Duplicate entry '10' for key 'id'insertinto un value(null,'jack');-- 成功insertinto un value(null,'rose');-- 成功
方式2:建表的同时在约束区域添加约束
所有的字段声明完成之后,就是约束区域了
unique(字段1,字段值2...)
方式3:建表之后,通过修改表结构添加约束
altertable 表名 addunique(字段1,字段2);-- 添加的联合唯一altertable 表名 addunique(字段1);-- 给一个添加唯一altertable 表名 addunique(字段2);-- 给另一个添加唯一createtable un01(
id int,
username varchar(20));altertable un01 addunique(id,username);insertinto un01 values(1,'tom');-- 成功insertinto un01 values(1,'jack');-- 成功insertinto un01 values(1,'tom');-- 失败 Duplicate entry '1-tom' for key 'id'/
非空约束(了解)
特点:被修饰过的字段非空
方式:
createtable nn(
id intnotnull,
username varchar(20)notnull);insertinto nn values(null,'tom');-- 错误的 Column 'id' cannot be null
auto_increment 自增
要求:
1.被修饰的字段类型支持自增. 一般int2.被修饰的字段必须是一个key 一般是primarykeycreatetable ai01(
id varchar(10)auto_increment);-- 错误 Incorrect column specifier for column 'id'createtable ai01(
id intauto_increment);-- 错误 Incorrect table definition; there can be only one auto column and it must be defined as a key
多表查询
技术分析:
内连接
外连接
子查询
/
笛卡尔积:了解
多张表无条件的联合查询.没有任何意思
select a.*,b.*from a,b;
内连接:★
格式1:显式的内连接
select a.*,b.*from a [inner]join b on ab的连接条件
格式2:隐式的内连接
select a.*,b.*from a,b where ab的连接条件
外连接:★
左外连接:★
select a.*,b.*from a left[outer]join b on 连接条件;
意思:
先展示join左边的(a)表的所有数据,根据条件关联查询 join右边的表(b),符合条件则展示出来,不符合以null值展示.
右外连接:
select a.*,b.*from b right[outer]join a on 连接条件;
意思:
先展示jion右边的表(a)表的所有数据,根据条件关联查询join左边的表(b),符合条件则展示出来,不符合以null值展示.
子查询:★
一个查询依赖另一个查询.
练习:
查询用户的订单,没有订单的用户不显示
隐式内连接:
selectuser.*,orders.*fromuser,orders whereuser.id=orders.user_id;
显示内连接
selectuser.*,orders.*fromuserjoin orders onuser.id=orders.user_id;
查询所有用户的订单详情
左外连接: user在左
selectuser.*,orders.*fromuserleftjoin orders onuser.id=orders.user_id;
查询所有订单的用户详情
右外连接:orders 在右
select orders.*,user.*fromuserrightjoin orders onuser.id=orders.user_id;
练习:
查看用户为张三的订单详情
1.先查询张三的id
select id fromUserwhere username ='张三';// 32.select*from orders where user_id = ?;
两个合二为一
select*from orders where user_id =(select id fromUserwhere username ='张三');
查询出订单的价格大于300的所有用户信息。
1.先查询出订单价格>300的用户的id
select user_id from orders where price >300;//(3,3,5,null)2.select*fromuserwhere id in(3,3,5,null);
两个合二为一:
select*fromuserwhere id in(select user_id from orders where price >300);
查询订单价格大于300的订单信息及相关用户的信息。
内连接:
select orders.*,user.*from orders,userwhereuser.id=orders.user_id and orders.price>300;
子查询: 是将一个查询的结果作为一张临时表
selectuser.*,tmp.*fromuser,(select*from orders where price>300)as tmp whereuser.id=tmp.user_id;
给表起别名
格式: 表 [as] 别名
////
初始化数据:
-- 用户表(user) createtable`user`(`id`intauto_incrementprimarykey,`username`varchar(50)-- 用户姓名 );-- 订单表(orders)createtable`orders`(`id`intauto_incrementprimarykey,`price`double,`user_id`int);-- 给订单表添加外键约束altertable orders addconstraint user_fk foreignkey(user_id)referencesuser(id);-- 向user表中添加数据insertintouservalues(3,'张三');insertintouservalues(4,'李四');insertintouservalues(5,'王五');insertintouservalues(6,'赵六');-- 向orders 表中插入数据insertinto orders values(1,1314,3);insertinto orders values(2,1314,3);insertinto orders values(3,15,4);insertinto orders values(4,315,5);insertinto orders values(5,1014,null);