1.数据库约束
约束:数据库针对数据进行一系列的校验,如发现插入的数据不符合约束中描述的校验规则,就会插入失败,为了更好的保证数据的正确性。
1.1 约束类型
NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
DEFAULT - 规定没有给列赋值时的默认值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标
识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略
CHECK子句
1.not null
2.unique:该列的所有行的数据是不能重复的。
3.default 给列执行默认值.
create table student (id int not null,name varchar(20) default ‘unknown’);
4.primary key 主键 等价于not null + unique
create table student (id int primary key,name varchar(20));
一般建议创建每张表时,最后都给这个表指定一个主键,如何保证主键不重复,可以借助数据库自动生成,使用auto_increment (自增)
自增特点:
若表中没有记录,自增从1开始,若表中有记录,从上一条记录开始,如果把中间的某个数据删掉,再次插入数据,刚才删掉的自增主键的值不会重复利用,
int 类型的自增主键的有效范围是-21亿 到+21亿
这个null不是就真的插入null,而是让数据库自动生成这个值.
5.foreign key 外键.描述两张表之间的关联关系
需要指定三方面信息:
1.指定当前表中哪列进行关联.
2.指定和哪张表关联
3.指定和目标表中的哪一列关联
后续往student 插入数据的时候,MySQL就会自动检查当前的classId 字段的值是否在class表的id列中出现过,如果没有出现过,插入就会失败.
使用外键会对插入操作的效率产生一定影响,外键约束也会影响表的删除. 比如此时class表被其他表关联着,此时是无法直接删除class表的
2.查询
1.聚合查询
一般需要搭配MySQL中的一些内置“函数”
e.g. select count(*) from user;
select avg(score)from student where score < 90;
2.group by
把得到的查询结果集按找一定的规则分组,相同的记录会被分组到同一组中
group by 可结合一些条件对数据进行进一步的筛选,使用having
e.g. select role, avg(salary) from person group by role having avg(salary) > 239;
*3.(难点)联合查询(多表查询)
实现联合查询的基本机制:笛卡尔积
先计算多个表的笛卡尔积,再基于一些条件对笛卡尔积中的记录进行筛选.
不应该再生产环境进行多表查询(开销较大,效率低)
但是会有大量数据没有意义,所以要有限制
如:
多表查询的另一种写法 使用join on
4.子查询
在其他sql中嵌入查询语句
e.g. select name from student where classes_id = (select classes_id from student where name = ‘11’);
多行子查询:借助in的方式来进行子查询->先进行子查询,再把子查询的结果保存到内存中,在进行主查询,再结合刚才子查询的结果来筛选最终结果.借助exists也能完成子查询.如果子表查询的结果集比较小,使用in,比较大,而主表的集合小,使用exists
5.合并查询
把多个查询的结果集合并成一个集合,需要保证多个结果集之间的字段类型和数目一致.
union关键字 e.g. select * from course where id < 3 union select * from course where name = ‘ww’;
如果两个查询结果中存在相同的记录,只保留一个,如果不想去重,可以使用 union all