执行运算符:加减乘除
select score + 10 from student where id = 1;
select score - 10 from student where id = 1;
select score * 10 from student where id = 1;
select score / 10 from student where id = 1;
比较运算符:大于、等于、小于、不等于
select score > 10 from student where id = 1;
select score = 10 from student where id = 1;
select score < 10 from student where id = 1;
select score != 10 from student where id = 1;
逻辑运算符:与 或 非
select score != 10 && score > 10 from student where id = 1;
select score != 10 || score > 10 from student where id = 1;
select !(score != 10 || score < 10) from student where id = 1;
is null 判断值是否为空
select score is null from users where id = 1;
between and 判断值是否在某个区间之内
select score between 15 and 20 from users;
in 判断值是否在某个特定的集合内
select score from users where id in (1,2,3);
like 模糊查询
select name from users where name like "张三";
主键:数据的唯一标识,保证唯一性
默认情况每一行只有一个主键,一张表只能有一个主键
主键生成策略:代理主键,与业务无关,仅仅是来标识该行数据的,一般为int类型,int存储空间小
我们采用主键自增的策略,每行数据自动生成主键,主键的值为上一行主键的数据加一
PRIMARY key:标识主键
auto_increment:id自增
CREATE TABLE student (
id int PRIMARY key auto_increment,
name varchar(20)
);
外键
表中的一个字段,将表中的一个字段设置为外键,与其他表的主键建立约束关系,外键被主键约束
外键可以选择的值只能从主键已有的值中选择,不能指定一个主键不存在的值
设置外键的表是从表
foreign key (cid):设置外键的key
references class(id):关联的表
create table student(
id int primary key auto_increment,
name varchar(11),
cid int,
foreign key (cid) references class(id)
);
主外键约束关系是数据表之间常用的一种维护方式,确保数据的准确性,实际开发中不设置外键,因为外键需要消耗大量资源,通过逻辑来控制程序的准确性
数据表直接映射业务逻辑
一对一 :身份证和人
一对多:一个教室对应多个学生
多对多:学生和选课,一个学生可以选择多个课程,一个课程可以被多个学生选择‘
一对多通常用外键来使用
多对多关系通常需要需要一个关联表来关联,中间表对应两张表都是一对多的关系
索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,可以大大加快查询的速度,使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。索引的作用类似于书的目录,可以根据目录中的页码快速找到所需的内容。
索引是数据库中重要的数据结构,它可以快速的查看数据库的特定记录,索引是提高性能的重要方式,所有字段都可以添加索引
举一个例子,三个表t1、t2、t3,每个表中只有一个字段,但是每一个表中都有1000行记录,这些记录都是1~1000的数字。
执行以下的查找语句
mysql>SELECT c1,c2,c3 FROM t1,t2,t3 WHERE c1=c2 AND c1=c3;
在无索引的情况下处理此查询, 必须寻找 3 个表所有的组合,以便得出与 WHERE 子句相配的那些行。而可能的组合数目 为 1000×1000×1000(十亿)
如果对每个表进行索引,就能极大地加速查询进程,利用索引的查询处理如下。
从表 t1 中选择第一行,查看此行所包含的数据。
使用表 t2 上的索引,直接定位 t2 中与 t1 的值匹配的行。同理,利用表 t3 上的索引, 直接定位 t3 中与 t1 的值匹配的行。
扫描表 t1 的下一行并重复前面的过程,直到遍历 t1 中所有的行。
在这样的情况下,对表 t1 执行了一个完全扫描,但能够在表 t2 和 t3 上进行索引查找直接取出这些表中的行,比未用索引时要快一百万倍。
利用索引,MySQL 加速了 WHERE 子句满足条件行的搜索,而在多表连接查询时、在执行连接时加快了与其他表中的行匹配的速度。
使用索引可以提升检索数据的速度,但是创建和维护索引需要耗费时间、索引需要占用物理空间。
普通索引:不需要任何限制条件的索引,可以在任意数据类型上创建
唯一索引:索引的值必须唯一,比如主键索引
全文索引:只能创建在 char varchar text 类型的字段上,查询数据量较大的字符串类型的字段时,使用全文索引可以提升速度,InnoDB 存储引擎不支持全文索引
单列索引:只对应一个字段的索引
多列索引:在一张表的多个字段上创建一个索引,查询时使用第一个字段,即可触发该索引
空间索引:只能建立在空间数据类型(GIS),InnoDB 存储引擎不支持该索引
1、主键自带索引
2、可以给其他字段添加索引
1、出现在 where 语句中的列,不是 select 后面要查询的列(重要)
2、索引的值尽量唯一,效率更高
3、不要添加过多的索引,维护成本很高
创建索引
alter table student add index in_name(name);
create index in_name on student(name);
删除索引
alter table student drop index in_name;
drop index in_name on student;
将多条SQL整合到一起一起执行,要么全部执行,要么一条都不执行
原子性:多条SQL不能被分割
隔离性:事务执行的时候不能被其它事务干扰
一致性:SQL语句执行前后,数据库的数据前后是一致的
持久性:事务一旦执行,对数据库的改变是永久的
事务的操作:
开启事务
start transaction;
回滚
rollback;
提交
commit;