高级

Mysql高级

一.关系

  • 建立成绩表scores,结构以下
    • id
    • 学生
    • 科目
    • 成绩
  • 思考:学生列应该存什么信息呢?
  • 答:学生列的数据不是在这里新建的,而应该从学生表引用过来,关系也是一条数据;根据范式要求应该存储学生的编号,而不是学生的姓名等其它信息
  • 同理,科目表也是关系列,引用科目表中的数据
  • 因此建立语句为:
    create table scores(
    id int primary key auto_increment,
    stuid int,
    subid int,
    score decimal(5,2)--最大五位数字,其中两位小数
    );

 二.外键

  • 思考:怎么保证关系列数据的有效性呢?任何整数均可以吗?
  • 答:必须是学生表中id列存在的数据,能够经过外键约束进行数据的有效性验证
  • 为stuid添加外键约束
alter table score add constraint stu_sco foreign key(stuid) references students(id);
  • 此时插入或者修改数据时,若是stuid的值在students表中不存在则会报错
  • 在建立表时能够直接建立约束
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(5,2),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id)
);

外键的级联操做sql

  • 在删除students表的数据时,若是这个id值在scores中已经存在,则会抛异常
  • 推荐使用逻辑删除,还能够解决这个问题
  • 能够建立表时指定级联操做,也能够在建立表后再修改外键的级联操做
  • 语法:
alter table scores add constraint stu_sco foreign key(stuid) reference students(id) on delete cascade;

级联操做的类型包括:数据库

  • restrict(限制):默认值,抛异常
  • cascade(级联):若是主表的记录删掉,则从表中相关联的记录都将被删除
  • set null:将外键设置为空
  • no action:什么都不作

三.链接查询

  • 链接查询分类以下:
    • 表A inner join 表B:表A与表B匹配的行会出如今结果中
    • 表A left join 表B:表A与表B匹配的行会出如今结果中,外加表A中独有的数据,未对应的数据使用null填充
    • 表A right join 表B:表A与表B匹配的行会出如今结果中,外加表B中独有的数据,未对应的数据使用null填充
  • 在查询或条件中推荐使用“表名.列名”的语法
  • 若是多个表中列名不重复能够省略“表名.”部分
  • 若是表的名称太长,能够在表名后面使用' as 简写名'或' 简写名',为表起个临时的简写名称

例如:查询学生姓名平均分:函数

select students.sname,avg(scores.score)
from scores
inner join students on scores.stuid=students.id
group by students.sname

四.内置函数

A.字符串函数

1).查看字符的ascii码值ascii(str),str是空串时返回0ui

select ascii('a');

2).查看ascii码值对应的字符char(数字)spa

select char(97);

3).接字符串concat(str1,str2...)rest

select concat(12,34,'ab');

4).包含字符个数length(str)code

select length('abc');

5).截取字符串orm

  • left(str,len)返回字符串str的左端len个字符
  • right(str,len)返回字符串str的右端len个字符
  • substring(str,pos,len)返回字符串str的位置pos起len个字符
select substring(‘abc123’,2,3);

6).去除空格blog

  • ltrim(str)返回删除了左空格的字符串str
  • rtrim(str)返回删除了右空格的字符串str
  • trim([方向 remstr from str)返回从某侧删除remstr后的字符串str,方向词包括both、leading、trailing,表示两侧、左、右
select trim('       deng     ');--删除两侧空格
select trim(leading 'x' FROM 'xxxdengxxx');--删除左侧的x
select trim(both 'x' FROM 'xxxdengxxx');--删除两侧的x
select trim(trailing 'x' FROM 'xxxdengxxx');--删除右侧的x

6).返回由n个空格字符组成的一个字符串space(n)事务

select space(10);

7).替换字符串replace(str,from_str,to_str)

select replace('abc123','123','def');

8).大小写转换,函数以下

  • lower(str)
  • upper(str)

B.数学函数

1).求绝对值abs(n)

select abs(-23);

2).求m除以n的余数mod(m,n),同运算符%

select mod(19,3);
select 19%3;

3).地板floor(n),表示不大于n的最大整数

select floor(2.3);

4).天花板ceiling(n),表示不小于n的最小整数

select ceiling(2.3);

5).求四舍五入值round(n,d),n表示原数,d表示小数位置,默认为0

select round(1.234,2);

6).求x的y次幂pow(x,y)

select pow(2,3);

7).随机数rand(),值为0-1.0的浮点数

select rand();

c.日期时间函数

1).获取子值,语法以下

  • year(date)返回date的年份(范围在1000到9999)
  • month(date)返回date中的月份数值
  • day(date)返回date中的日期数值
  • hour(time)返回time的小时数(范围是0到23)
  • minute(time)返回time的分钟数(范围是0到59)
  • second(time)返回time的秒数(范围是0到59)

2).日期计算,使用+-运算符,数字后面的关键字为year、month、day、hour、minute、second

select '2016-12-21' + interval 1 day;

3).日期格式化date_format(date,format),format参数可用的值以下

  • 获取年%Y,返回4位的整数
  • 获取年%y,返回2位的整数
  • 获取月%m,值为1-12的整数
  • 获取日%d,返回整数
  • 获取时%H,值为0-23的整数
  • 获取时%h,值为1-12的整数
  • 获取分%i,值为0-59的整数
  • 获取秒%s,值为0-59的整数
select date_format('2016-12-21','%Y %m %d');

4).当前日期current_date()

select current_date();

5).当前时间current_time()

select current_time();

6).当前日期时间now()

select now();

五.视图

对于复杂的查询,在对次使用后,维护时一件很是麻烦的事情,视图能够解决

视图本质就是对查询的一个封装

定义视图:

create view stuscore as
select students.*,scores.score from scores
inner join students on scores.stuid=students.id;

视图的用途就是查询

select * from stuscore;

六.事务

当一个业务逻辑须要多个sql完成时,若是其中某条sql语句出错,则但愿整个操做都退回

而使用事务能够完成退回的功能,保证业务逻辑的正确性

事务的四大特性(ACID):

  • 原子性(Atomicity):事务中的所有操做在数据库中是不可分割的,要么所有完成,要么均不执行
  • 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致
  • 隔离性(Isolation):事务的执行不受其余事务的干扰,事务执行的中间结果对其余事务必须是透明的
  • 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即便数据库出现故障

表的类型必须是innodb或bdb类型,才能够对此表使用事务

查看表的建立语句:

show create table student;

修改表的类型:

alter table '表名' engine=innodb;

事务语句:

begin开启;
commit提交;
rollback回滚;

示例:

begininsert into students (sname)values ('老细');
commit
相关文章
相关标签/搜索