limit(分页查询)
是MySQL中的特有,其他数据库中没有,不通用
作用:取结果集中的部分机制
案例:取工资前五名的员工:
select ename,sal from emp by sal desc limit 0,5
select ename,sal from emp by sal desc limit 5//如果不说,默认前面是0
limit是sql语句中最后一个执行环节
select 5
。。。
from 1
。。。
where 2
。。。
group by 3
。。。
having 4
。。。
order by 6
。。。
limit 7
。。。
通用分页mysql
每页显示pagesize条记录:
第pageno页:(pageno-1)*pagesize,pagesize
pagesize:每页显示多少条记录
pageno显示第几页
创建表:
建表语句:create table 表名(
字段名1 数据类型
字段名2 数据类型
字段名3 数据类型
};
关于mysql当中字段的数据类型
int
bigint
char定长字符串
varchar 可变长字符串
BLOB(二级制大对象,存储图片 视频等信息)
CLOB字符大对象(储存较大文本)
Float
Date 日期型 年月日
DateTime 年月日 时分秒
当一个字段中的数据长度不发生改变时:是用定长的char
当一个字段的数据长度不确定,采用varchar,如简介,姓名
表明在数据库中一般建议以:t_或者tbl _开始
创建学生表:
学生信息包括:
学号:bigint
姓名:varchar
性别:char
班级编号:int
生日:char
creater table t_student(
no bigint,
name varchar(255),
sex char(1),
classno varchar(255),
brith char(10)
);
上述为建表语句
向表中插入数据
insert语句插入数据
语法格式: intsert into 表名(字段名1,字段名2,字段名3)values(值1,值2,值3)
表的复制
语法:
create table 表名 as select语句
将查询结果当做表创建出来
将查询结果插入到一张表中
insert into dept1select * from dept;
select *from dept;
修改数据:update
语法格式:
update 表名 set 字段名1=值1,字段名2=值2.。。。where 条件
update dept set loc=‘上海’,dname=‘renshibu’ where deptno=10;
删除数据
语法格式:
delete from 表名 where 条件
删除10部门数据
delete from deptl where deptno=10;
怎么删除大表
truncate table empl;//表被截断,不可回滚,永久丢失
约束:
非空约束(not null):约束的字段不能为null;
唯一约束(unique):约束的字段不能重复
主键约束(primary key)约束的字段不能重复也不能为null
检查约束(check)目前mysql不支持
唯一约束:
drop table if exists t_user; \ \如果以前有表,先删除原来的表。
create table t_user(
id int
username varchar(255) unique\ \对username进行唯一性约束
);
insert into t_user values(1,'zhangsan');
insert into t_user values(2,'zhangsan');//这种情况下就会报错,因为username有两个zhangsan
案例,给两个或者多个列添加unique
drop table if exists t_user; \ \如果以前有表,先删除原来的表。
create table t_user(
id int
username varchar(255),
usercode varchar(255),
unique(username,usercode)
);//两个字段连起来不能重合
两者之间的区别
drop table if exists t_user; \ \如果以前有表,先删除原来的表。
create table t_user(
id int
username varchar(255) unique,
usercode varchar(255)unique
);//每个都不能重合
#####
主键约束:
drop table if exists t_user;
create table t_user(
id int primary key,//这个是主键约束,带有主键约束的字段叫主键字段
username varchar(255) ,
email varchar(255)
);
insert into t_user (id,username,email)values(1,‘zs’,‘zs123@123.com’)//输入的是主键值
insert into t_user (id,username,email)values(1,‘ls’,‘ls123@123.com’)
insert into t_user (id,username,email)values(1,‘ww’,‘ww 123@123.com’)
根据以上测试得出:id是主键,因为添加了主键约束,主键中数据不能为null,也不能重复
主键的作用:
表的设计三范式,第一范式要求任何一张表都应该有主键
主键的作用:主键值是这行记录在这张表当中的唯一标识(身份证号)
主键的分类
根据主键的字段数量来划分
单一主键(最常用的)
复合主键(多个字段联合起来添加一个主键约束)
自然主键
mysql提供主键值自增
drop table if exists t_user;
create table t_user(
id int primary key auto_increment,//id字段自动维护一个自增的数字,从一开始,以1递增
username varchar(255)
);
外键约束
建立表格时 使用两张表,比如,一张班级表t_class,一张学生表t_student
t_student中的classno字段引用t_class表中的cno字段,学生表叫子表,t_class叫父表
顺序要求
删除数据,先删子表,再删父表
添加数据,添加父表,再加子表
创建表,先建父表,再子表
删除表,先子后父
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
cno int ,
cname varchar(255),
primary key(cno)
);
create table t_student(
sno int,
sname varhcar(255),
classno int,
foreign fey(classno) references t_class(cno)//这就是外键约束
);
外键可以为null
事务(transaction)
什么是事物:是一个完整的业务逻辑单元,不可再分
比如:银行账户转账,从a账户向b账户转账10000,需要执行两条update语句
update t_cat set balance=balance-10000 where actno='act-001';
update t_cat set balance=balance+10000 where actno='act-002';
以上的两条dml语句必须同时成功或者同时失败,那么就需要使用数据库的事务机制。
和事务有关的语句只有:dml语句
通常,一个事务需要多条dml语句共同联合而成
开启事务机制
执行insert语句-->insert(执行成功之后,把这个执行记录到数据库的操作历史当中,并不会向文件中保存一条数据,不会真正修改硬盘上的数据)
执行update语句-->update(这个执行也是记录一下历史操作不会真正修改硬盘上的数据)
执行delete语句-->这个执行也是记录一下历史操作不会真正修改硬盘上的数据
提交事务或者回滚事务
事务两个语句:commit(提交),rollback(回滚)
事务的特性:
A原子性:事务是最小的工作单元
C一致性:事务必须保证多条dml同时成功或者失败
I:隔离性:事务a与事务b之间具有隔离
D持久性:持久性说的是最终数据必须持久化到硬盘文件中,事务才算是成功的结束
关于事务之间的隔离性
第一级别:读未提交(read uncommitted)
对方事务还没有提交,我们当前事务可以读取对方未提交的数据
读未提交存在脏读现象dirty read 表示读到了脏的数据
第二级别:读已提交(read committed)
对方事务提交之后数据我方可以读到
取消了脏读现象,但是问题在于,不可以重复读
第三级别:可重复读 (repeatable read)
这种隔离级别解决了:不可重复读问题
问题在于:读取到的数据是幻象
第四级别:序列化读
解决了所有问题
效率低 需要事务排队
mysql数据库默认的隔离级别:可重复读
演示事务
mysql事务默认情况下自动提交(只要执行任意一条dml语句则提交一次)
怎么关闭自动提交
start transaction;
演示:
drop table if exists t_user
create table t_user(
id int primary key auto_increment,
username varchar(255)
);