约束、数据库设计、多表查询、事务

一、约束
【重点】1、单表约束
概念:
设置在列上的一种规则。
作用:
限制添加到表中的数据,保证数据的正确性、有效性、完整性。
创建格式:
create table 表名(
id int primary key auto_increment,
// primary key 主键约束,非空且唯一,主键只能有一个
// auto_increment 自增长约束
name varchar(20) not null unique,
// not null 非空约束
//unique 数据唯一约束,数据唯一,一个表中可以使用多次
phone varchar(11) not null,
address varchar(100) default ‘’
//default 默认约束,没有值时,默认一个值
);
2、单表约束
概念:
给多表间建立一个连接
创建格式
create table 表名(
id int primary key auto_increment,
name varchar(20) not null unique,
phone varchar(11) not null,
address varchar(100) default ‘’,
dept_id int,
constraint fk_01 foreign key(dept_id) references dept(id)
// 两个表之间建立联系,
);
二、数据库设计
多表关系以及添加外键
1、一对多:
在多的一方添加外键指向一的一方主键
2、多对多:
创建一张中间表,在中间表中至少有两个字段作为外键分别指向 多对多双方的主键
3、一对一:
在任意一方添加外键指向另一方的主键,同时给外键列设置unique约束。
三、连接查询 【重点】
1、内连接
语法:
隐式内连接:
select * from 表1,表2,… where 条件。
案例:

create table student(classid int ,name varchar(10),age int(3) ,gender char);
create table class(classid int,name varchar(10));
select *
-- student s,s是给student取的简称,方便调用表里面的信息
from student s,class c  where s.classid=c.classid ;

显示内连接:
select * from 表1 [inner] join 表2 on 关联条件 [inner] join 表3 on 关联条件 … where 其他条件。
案例:

create table student(classid int ,name varchar(10),age int(3) ,gender char);
create table class(classid int,name varchar(10));

select *
-- 可以省略[inner]不写
from student s join class c on s.classid = c.classid;

2、外链接
左外连接:
概念:以左边为主表,获取主表的所有的信息,再获取与副表有交集的信息
语法:
select * from 表1 left [outer] join 表2 on 关联条件 left [outer] join 表3 on 关联条件 … where 其他条件
示例图
在这里插入图片描述
案例:

create table student(classid int ,name varchar(10),age int(3) ,gender char);
create table class(classid int,name varchar(10));
-- student为主表,class为副表
select *
from student s left join class c on s.classid = c.classid;

右外连接:
概念:
以右边为主表,获取主表的所有的信息,再获取与副表有交集的信息
语法:
select * from 表1 right [outer] join 表2 on 关联条件 right [outer] join 表3 on 关联条件 … where 其他条件
示例图:

案例:

create table student(classid int ,name varchar(10),age int(3) ,gender char);
create table class(classid int,name varchar(10));
-- class 为主表 ,student 为副表
select *
from student s right join class c on s.classid = c.classid;

四、子查询(重点)
1、概念:查询中嵌套查询
2、子查询结果是单行单列:作为>、>=、=、<、<=后面的条件值
语法:select * from 表 where 字段名 > (子查询)

-- 获取所有比张三年龄大的学生信息
-- 先获取张三的年龄,获取的是一个单行单列的
select student.age from student where student.name='张三';
-- 再拿张三的年龄跟所有学生对比
select *
from student where student.age>(select student.age from student where student.name='张三');

3、子查询结果是多行单例:作为in()括号中的值
语法:select * from 表 where 字段名 in(子查询);

-- 查询年龄跟张三和李四相同的学生信息

-- 先获取张三和李四的年龄
select student.age from student where student.name='张三' or student.name='李四';
-- 获取的是一个多行单列的,可以作为判断条件
select *
from student where student.age in (select student.age from student where student.name='张三' or student.name='李四');

4、子查询结果是多列:作为表和其他表进行连接查询
语法:select * from 表1,(子查询) 别名 where 条件

-- 查询跟张三年龄相同且班级相同的学生信息

-- 先获取张三年龄和班级的信息
select student.age,student.classid from student where student.name='张三';
-- 获取的是一个多行多列的,不能作为where后面的判断条件,可以作为虚拟表进行多表查询,一定要用括号括起来
select s.age,s.classid,s.name,s.gender
from student s,(select student.age,student.classid from student where student.name='张三') s2 where s.classid=s2.classid or s.age=s2.age;

五、分析需求(重点)
【第一步】:查询结果或者条件涉及哪些表?
【第二步】:使用连接查询还是子查询?
【第三步】连接条件或者确定子查询语句

六、事务
概念:将一组SQL看成时一个整体,要么同时执行成功,要么同时执行失败。
事务的三个操作
开启事务:start transaction或者begin
提交事务:commit
回滚事务:rollback

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值