MySQL 复习笔记,mysql复习笔记

创建表:

MySQL 复习笔记,mysql复习笔记

前言

本篇博客学习内容为视图、触发器、事务、存款和储蓄进程、函数、数据备份及流程序调节制。

1 create table 表名
2 {
3   //定义列名
4   id int identify(1,1) primary key,//自动编号:从1开始每次增长1,约束:主键约束
5   name nvarchar(50) not null      //非空约束
6 }

本文内容

  • SQL 语句
  • 始建数据库
  • 成立数据表
  • 数据完整性约束
  • 种种基本字符类型表达
  • SQL 基本语句
  • 类型调换函数
  • 日期函数
  • 数学函数
  • 字符串函数
  • 合并结果集 union
  • CASE 函数用法
  • IF ELSE 语法
  • WHILE 循环语法
  • 子查询
  • 表连接 join
  • 事务
  • 视图
  • 触发器
  • 储存进度
  • 分页存款和储蓄进度
  • 索引
  • 临时表

视图

 

1,SQL 语句


SQL 语言:结构化的询问语言(Structured Query
Language),是关周到据库管理连串的正统语言。是一种解释语言,写一句试行一句,无需完整编译试行。

语法特点:

  • 1.未曾“ ”,字符串使用‘ ’包括
  • 二.从未有过逻辑相等,赋值和逻辑相等都以=
  • 三.类型不再是最狠毒的。任何数据都足以涵盖在‘ ’以内
  • 四.不曾 bool 值的定义,不过在视图中得以输入true/false
  • 5.有提到运算符:> < >= <= = <> !=
    ,它回到四个bool值
  • 6.有逻辑运算符: !(not) &&(and) ||(or)
  • 七.不区分大小写

什么是视图?

视图是由一张表或多张表的查询结果构成的一张虚拟表,创立一张视图后会在数据库中保留二个以
frm 后缀结尾的文本,只保留了数量结果,全部的数码都出自 sql 语句。

表数据的增加和删除改查:
          

二,创制数据库


语法:

create database 数据库名称

on primary –私下认可在主文件组上

(

name=’逻辑名称_data’ ,
–当您意识它不是一句完整的sql语句,而单单是三个拍卖组织中的某一句的时候,就必要增添,

size=初步大小, –数值不含有在‘’以内

filegrowth=文件拉长 ,

maxsize=最大容积,

filename=’物理路径’

)

log on

(

name=’逻辑名称_log’ ,
–当你意识它不是一句完整的sql语句,而仅仅是一个拍卖组织中的某一句的时候,就须要增添,

size=初阶大小, –数值不带有在‘’以内

filegrowth=文件增进 ,

maxsize=最大体量, –一般的话日志文件不限制最大容积

filename=’物理路线’

)

示例:

 –展现具体班级的称呼

select StudentNo,StudentName,

case ClassId --如果case后面接有表达式或者字段,那么这种结构就只能做等值判断,真的相当于switch..case

when 1 then '一班'

when 2 then '2班'

when 3 then '3班'

when null then 'aa' --不能判断null值

else '搞不清白'

end,

sex

from Student

 

--2.做范围判断,相当于if..else,它可以做null值判断

--case --如果没有表达式或者字段就可实现范围判断

-- when 表达式 then 值 --不要求表达式对同一字段进行判断

-- when 表达式 then 值 

-- .....

--else 其它情况 

--end

select StudentNo,StudentName,

case

when BornDate>'2000-1-1' then '小屁孩'

when BornDate>'1990-1-1' then '小青年'

when BornDate>'1980-1-1' then '青年' 

--when Sex='女' then '是女的'

when BornDate is null then '出生不详'

else '中年'

end

from Student

 

--百分制转换为素质教育 90 -A 80--B 70 --C 60 --D <60 E NULL--没有参加考试

select StudentNo,SubjectId,

case

when StudentResult>=90 then 'A'

when StudentResult>=80 then 'B'

when StudentResult>=70 then 'C'

when StudentResult>=60 then 'D'

when StudentResult is null then '没有参加考试'

else 'E'

end 成绩,

ExamDate

from Result

缘何使用视图?

在开始展览多表查询的时候,sql 语句会非凡可怜长,比如

select t1.student_id from (select student_id,num from score where course_id = (select cid from course where cname = '物理')) as t1 join(select student_id,num from score where course_id = (select cid from course where cname = '生物')) as t2 on t1.student_id = t2.student_id where t1.num > t2.num;

看是否十分长,那还只是叁表查询,假使蒙受尤其复杂的表结构自然会越来越长,不过尔尔的话对表的保证困难也加大了。借使老是都编写制定需求获得同样数量的
sql 语句会是1件很劳碌的事,能够把平日索要查询的 sql
语句调换为视图就能够防止双重写 sql 语句的题材。

视图除了能够减掉 sql
语句的编辑次数,还是能够运用差别的视图来展示分歧数额的访问,那么给某个用户安装权限不就可以了啊?注意,设置的权位要么只美观某张表的1体多少,要么只美观某张表中的有些column
的数额,也正是列数据,列数据只是保存了字段名,举例说我要翻开自身的前段时期工钱,是索要查阅1行数据的,这样权限就帮不了忙了。(当然能够加
where 条件,在此间是介绍视图)

1 insert   into   表名 values()
2 delete   from   表名
3 update   表名   set 
4 select   *    from   表名
5 注:当删除表中所有数据还可使用truncate table 表名,它不能加where条件但是比delect所有表数据效率高,因为它通过释放数据页来删除数据,在事务日志中只记录数据页的释放;而且删除数据后计数器重置为定义的种子,如果没有定义种子,则使用默认值1。

13,IF ELSE 语法


1.不曾{},使用begin..end.如果后边惟有一句,能够不采纳begin..end包罗

贰.尚未bool值,只可以选用关系运算符表达式

叁.也足以嵌套和连串

四.if背后的()能够省略

示例:

      declare @subjectname nvarchar(50)='office' --科目名称

declare @subjectId int=(select Subjectid from Subject where [email protected]) --科目ID

declare @avg int --平均分

set @avg=(select AVG(StudentResult) from Result where [email protected] and StudentResult is not null) --获取平均分

print @avg

if @avg>=60

begin

print '成绩不错,输出前三名:'

select top 3 * from Result where [email protected] order by StudentResult desc

end

else

begin

print '成绩不好,输出后三名:'

select top 3 * from Result where [email protected] order by StudentResult 

end

运用方法

 

1肆,WHILE 循环语法


没有{},使用begin..end

尚无bool值,需求运用原则表明式

能够嵌套

也得以选取break,continue

示例:

go

declare @subjectName nvarchar(50)='office' --科目名称

declare @subjectId int--科目ID

declare @classid int =(select classid from Subject where [email protected]) --查询当前科目属于那一个班级

set @subjectId=(select SubjectId from Subject where [email protected]) --获取科目ID

declare @totalCount int --总人数 :那一个班级需要考试这一科目

set @totalCount=(select COUNT(*) from Student where [email protected])

print @totalcount --14

declare @unpassNum int --不及格人数

set @unpassNum=(select COUNT(distinct Studentno) from Result where [email protected] and StudentNo in(select StudentNo from Student where [email protected]) and StudentResult<60)

while(@unpassNum>@totalCount/2)

begin

--执行循环加分

update Result set StudentResult+=2 where [email protected] and StudentNo in(select StudentNo from Student where [email protected]) and StudentResult<=98

--重新计算不及格人数

set @unpassNum=(select COUNT(distinct Studentno) from Result where [email protected] and StudentNo in(select StudentNo from Student where [email protected]) and StudentResult<60)

end

go

declare @subjectName nvarchar(50)='office' --科目名称

declare @subjectId int--科目ID

declare @classid int =(select classid from Subject where [email protected]) --查询当前科目属于那一个班级

set @subjectId=(select SubjectId from Subject where [email protected]) --获取科目ID

declare @totalCount int --总人数

set @totalCount=(select COUNT(*) from Student where [email protected])

print @totalcount --14

declare @unpassNum int --不及格人数

while(1=1)

begin

set @unpassNum=(select COUNT(distinct Studentno) from Result where [email protected] and StudentNo in(select StudentNo from Student where [email protected]) and StudentResult<60)

if(@unpassNum>@totalCount/2) 

update Result set StudentResult+=2 where [email protected] and StudentNo in(select StudentNo from Student where [email protected]) and StudentResult<=98

else

break

end

创制视图

mysql> create [or replace] view 视图名 [(column_list)] as select_statement;

累加 or replace 时1旦已经存在一样视图则替换原有视图,column_list
钦定哪些字段要出以往视图中。专注:由于是一张虚拟表,视图中的数据实际上来源于其余表,所以在视图中的数据不会出现在硬盘上,相当于只会保留壹份数据结构。

修改表结构:

15,子查询


子查询,是2个询问中隐含其它叁个查询。

一.子查询的使用办法:使用()蕴涵子查询

二.子查询分类:

1)独立子查询:子查询可以平昔独立运营,举个例子:

查询比“王八”年龄大的学生新闻

select * from Student where BornDate<(select BornDate from Student where StudentName='王八')

贰)相关子查询:子查询利用了父查询中的结果

示例:

--子查询的三种使用方式

--1.子查询做为条件,子查询接在关系运算符后面 > < >= <= = <> !=,如果是接这关系运算符后面,必须保证 子查询只返回一个值

--查询六期班的学员信息

select * from Student where ClassId=(select ClassId from grade where classname='八期班')

 

--子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

select * from Student where ClassId=(select ClassId from grade)

 

--查询八期班以外的学员信息

--当子查询返回多个值(多行一列),可以使用in来指定这个范围

select * from Student where ClassId in(select ClassId from grade where classname<>'八期班')

 

--当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。如果是多行多列或者一行多列就需要使用exists

--使用 EXISTS 关键字引入子查询后,子查询的作用就相当于进行存在测试。外部查询的 WHERE 子句测试子查询返回的行是否存在

select * from Student where EXISTS(select * from grade)

select * from Student where ClassId in(select * from grade)

 

--2.子查询做为结果集--

select top 5 * from Student --前五条

 

--使用top分页

select top 5 * from Student where StudentNo not in(select top 5 studentno from Student)

 

--使用函数分页 ROW_NUMBER() over(order by studentno),可以生成行号,排序的原因是因为不同的排序方式获取的记录顺序不一样

select ROW_NUMBER() over(order by studentno),* from Student

 

--查询拥有新生成行号的结果集 注意:1.子查询必须的别名 2.必须为子查询中所有字段命名,也就意味着需要为新生成的行号列命名

select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where temp.id>0 and temp.id<=5

select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where temp.id>5 and temp.id<=10

select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where temp.id>10 and temp.id<=15

 

--3.子查询还可以做为列的值

select (select studentname from student where studentno=result.studentno),(select subjectname from subject where subjectid=result.SubjectId), StudentResult from Result

 

--使用Row_number over()实现分页

--1.先写出有行号的结果集

select ROW_NUMBER() over(order by studentno),* from Student

 

--2.查询有行号的结果集 子查询做为结果集必须添加别名,子查询的列必须都有名称

select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where id>0 and id<=5

 

--查询年龄比“廖杨”大的学员,显示这些学员的信息

select * from Student where BornDate<(select BornDate from Student where StudentName='廖杨')

 

--查询二期班开设的课程

select * from Subject where ClassId=(select ClassId from grade where classname='二期班')

 

--查询参加最近一次“office”考试成绩最高分和最低分

--1查询出科目 ID

select subjectid from Subject where SubjectName='office'

 

--2.查询出这一科目的考试日期

select MAX(ExamDate) from Result where SubjectId=(select subjectid from Subject where SubjectName='office')

 

--3,写出查询的框架

select MAX(StudentResult),MIN(StudentResult) from Result where SubjectId=() and ExamDate=()

 

--4.使用子查询做为条件

select MAX(StudentResult),MIN(StudentResult) from Result where SubjectId=(

select subjectid from Subject where SubjectName='office'

) and ExamDate=(

select MAX(ExamDate) from Result where SubjectId=(

select subjectid from Subject where SubjectName='office'

)

)

运用视图

视图是一张虚拟表,所以选取办法与普通表未有分别。

 1 alter table 表名
 2           add 列名 数据类型                 //增加一列
 3           drop column 列名                //删除一列
 4           alter column 表名 数据类型 not null       //修改一列,并添加非空约束
 5           add constraint PK_表名_列名 primary key(列名)      //添加主键约束
 6           add constraint UQ_表名_列名 unique(列名)         //添加唯一约束
 7           add constraint DF_表名_列名 default(值) for 列名   //添加默认约束
 8           add constraint CK_表名_列名 check(列的条件表达式)   //添加检查约束
 9           add constraint FK_表名_列名 foreign key(外键表的列名) references 主键表名(主键表的列名)      //添加外键约束
10           drop constraint 约束名1,约束名2............       //删除约束

16,表连接 join


--1.inner join :能够找到两个表中建立连接字段值相等的记录

--查询学员信息显示班级名称

select Student.StudentNo,Student.StudentName,grade.classname

from Student

inner join grade on Student.ClassId=grade.ClassId

 

--左连接: 关键字前面的表是左表,后面的表是右表

--左连接可以得到左表所有数据,如果建立关联的字段值在右表中不存在,那么右表的数据就以null值替换

select PhoneNum.*,PhoneType.*

from PhoneNum 

left join PhoneType on PhoneNum.pTypeId=PhoneType.ptId

 

--右连接: 关键字前面的表是左表,后面的表是右表

--右连接可以得到右表所有数据,如果建立关联的字段值在右左表中不存在,那么左表的数据就以null值替换

select PhoneNum.*,PhoneType.*

from PhoneNum 

right join PhoneType on PhoneNum.pTypeId=PhoneType.ptId

 

--full join :可以得到左右连接的综合结果--去重复

select PhoneNum.*,PhoneType.*

from PhoneNum 

full join PhoneType on PhoneNum.pTypeId=PhoneType.ptId

查看视图

  1. 翻看数据结构

mysql> desc view_name;
  1. 查阅成立语句

mysql> show create view view_name;

 

17,事务


事务处理,要么都能不负众望实施,要么都不实行。

政工的多少个特点 ACID:

  • A:原子性:业务必须是原子工作单元;对于其数量修改,要么全都试行,要么全都不实践。它是3个整机,不可能再拆分
  • C:一致性:作业在做到时,必须使具有的数量都保持一致状态。。某种程度的同样
  • I:隔离性:政工中隔开分离,每一个职业是独立的伸手将独自的管理,与其余业务未有涉及,互不影响
  • D:持久性:设若专门的学问①旦付出,就对数据的改动永恒保存

行使专门的学问:

将您须要操作的sql命令包括在专门的学业中

壹.在业务的拉开和作业的交付之间

二.在职业的敞开和事情的回滚之间

多少个首要语句:

拉开事务:begin transaction

交给业务:commit transaction

回滚事务:rollback transaction

  declare @num int =0 --记录操作过程中可能出现的错误号

  begin transaction

  update bank set cmoney=cmoney-500 where name='aa'

  set @[email protected][email protected]@ERROR

  --说明这一句的执行有错误 但是不能在语句执行的过程中进行提交或者回滚

  --语句块是一个整体,如果其中一句进行了提交或者回滚,那么后面的语句就不再属于当前事务,

  --事务不能控制后面的语句的执行

  update bank set cmoney=cmoney+500 where name='bb'

  set @[email protected][email protected]@ERROR

  select * from bank

  if(@num<>0 ) --这个@@ERROR只能得到最近一一条sql语句的错误号

  begin

  print '操作过程中有错误,操作将回滚'

  rollback transaction

  end

  else

  begin 

  print '操作成功'

  commit transaction 

  end

  --事务一旦开启,就必须提交或者回滚

  --事务如果有提交或者回滚,必须保证它已经开启

修改视图

mysql> alter view_name select_statement;

除去重复记录:

18,视图


视图是一张虚拟表,能够像使用子查询做为结果集同样使用视图

select * from vw_getinfo

选拔代码成立视图

语法:

create view vw_自定义名称

as

查询命令

go

  --查询所有学员信息

  if exists(select * from sysobjects where name='vw_getAllStuInfo')

  drop view vw_getAllStuInfo

  go --上一个批处理结果的标记

  create view vw_getAllStuInfo

  as

  --可以通过聚合函数获取所以记录数

  select top (select COUNT(*) from Student) Student.StudentNo,Student.StudentName,grade.ClassId,grade.classname from Student

  inner join grade on Student.ClassId=grade.ClassId order by StudentName --视图中不能使用order by

  --select * from grade --只能创建一个查询语句

  --delete from grade where ClassId>100 --在视图中不能包含增加删除修改

  go

  --使用视图。。就像使用表一样

  select * from vw_getAllStuInfo

  --对视图进行增加删除和修改操作--可以对视图进行增加删除和修改操作,只是建议不要这么做:所发可以看到:如果操作针对单个表就可以成功,但是如果 多张的数据就会报错:不可更新,因为修改会影响多个基表。

  update vw_getAllStuInfo set classname='asdas' ,studentname='aa' where studentno=1

除去视图

mysql> drop view view_name;
1 select distinct .... from 表名 ......     //对查询的结果集去重(针对每一列都相同的情况)

19,触发器


触发器:实行2个方可更动表数据的操作(扩大删除和修改),会自行触发此外一名目大多(类似于储存进度中的模块)的操作。

语法:

create trigger tr_表名_操作名称

on 表名 after|instead of 操作名称

as

go

  if exists(select * from sysobjects where name='tr_grade_insert')

  drop trigger tr_grade_insert

  go

  create trigger tr_grade_insert

  on grade for insert ---为grade表创建名称为tr_grade_insert的触发器,在执行insert操作之后触发

  as

  declare @cnt int

  set @cnt = (select count(*) from student)

  select * ,@cnt from student

  select * from grade

  go

  --触发器不是被调用的,而是被某一个操作触 发的,意味着执行某一个操作就会自动触发 触发器

  insert into grade values('fasdfdssa')

  ---替换触 发器:本来需要执行某一个操作,结果不做了,使用触 发器中的代码语句块进行替代

  if exists(select * from sysobjects where name='tr_grade_insert')

  drop trigger tr_grade_insert

  go

  create trigger tr_grade_insert

  on grade instead of insert ---为grade表创建名称为tr_grade_insert的触发器,在执行insert操作之后触发

  as

  declare @cnt int

  set @cnt = (select count(*) from student)

  select * ,@cnt from student

  select * from grade

  go

  insert into grade values('aaaaaaaaaaaa')

  go

  ---触 发器的两个临时表:

  --inserted: 操作之后的新表:所有新表与原始的物理表没有关系,只与当前操作的数据有关

  --deleted:操作之前的旧表:所有新表与原始的物理表没有关系,只与当前操作的数据有关

  if exists(select * from sysobjects where name='tr_grade_insert')

  drop trigger tr_grade_insert

  go

  create trigger tr_grade_insert

  on grade after insert

  as

  print '操作之前的表:操作之前,这一条记录还没有插入,所以没有数据'

  select * from deleted

  print '操作之后的表:已经成功插入一条记录,所有新表中有一条记录'

  select * from inserted 

  go

  --测试:

  insert into grade values('aaaaa')

  if exists(select * from sysobjects where name='tr_grade_update')

  drop trigger tr_grade_update

  go

  create trigger tr_grade_update

  on grade after update

  as

  print '操作之前的表:存储与这个修改操作相关的没有被修改之前的记录'

  select * from deleted

  print '操作之后的表:存储这个操作相关的被修改之后 记录'

  select * from inserted 

  go

  --测试

  update grade set classname=classname+'aa' where ClassId>15

  if exists(select * from sysobjects where name='tr_grade_delete')

  drop trigger tr_grade_delete

  go

  create trigger tr_grade_delete

  on grade after delete

  as

  print '操作之前的表:存储与这个修改操作相关的没有被删除之前的记录'

  select * from deleted

  print '操作之后的表:存储这个操作相关的被删除之后 记录--没有记录'

  select * from inserted 

  go

  --测试

  delete from grade where ClassId>15

切切实举办使

 

20,存款和储蓄进程


参数,重临值,参数暗中同意值,参数:值的格局调用

在调用的时候有七个料理:类型对应,数量对应,顺序对应

创设语法:

create proc usp_用户自定义名称

对应方法的形参 –(int age, out string name)

as

对应方法体:创制变量,逻辑语句,扩展删除修改和查询..return重返值

go

调用语法:

Exec 存储进度名称 实参,实参,实参 …

示例:

  --获取所有学员信息

  if exists(select * from sysobjects where name='usp_getAllStuInfo')

  drop proc usp_getAllStuInfo

  go

  create procedure usp_getAllStuInfo

  as

  select * from Student

  go

  --调用存储过程,获取的有学员信息

  execute usp_getAllStuInfo

  --exec sp_executesql 'select * from Student'

  --查询指定性别的学员信息

  go

  if exists(select * from sysobjects where name='usp_getAllStuInfoBySex')

  drop proc usp_getAllStuInfoBySex

  go

  create procedure usp_getAllStuInfoBySex

  @sex nchar(1) --性别 参数不需要declare

  as

  select * from Student where [email protected]

  go

  --调用存储过程,获取指定性别的学员信息

  Exec usp_getAllStuInfoBySex '女'

  --创建存储过程获取指定班级和性别的学员信息

  go

  if exists(select * from sysobjects where name='usp_getAllStuInfoBySexandClassName')

  drop proc usp_getAllStuInfoBySexandClassName

  go

  create procedure usp_getAllStuInfoBySexandClassName

  @classname nvarchar(50), --班级名称

  @sex nchar(1)='男'--性别 有默认的参数建议写在参数列表的最后

  as

  declare @classid int ---班级ID

  set @classid=(select classid from grade where [email protected]) --通过参数班级名称获取对应的班级ID

  select * from Student where [email protected] and [email protected]

  go

  --执行存储过程获取指定班级和性别的学员信息

  --exec usp_getAllStuInfoBySexandClassName '八期班'

  exec usp_getAllStuInfoBySexandClassName default, '八期班' --有默认值的参数可以传递default

  exec usp_getAllStuInfoBySexandClassName @classname='八期班' --也可以通过参数=值的方式调用

  exec usp_getAllStuInfoBySexandClassName @classname='八期班' ,@sex='女'

  exec usp_getAllStuInfoBySexandClassName @classname='八期班',@sex='女'

  --创建存储过程,获取指定性别的学员人数及总人数

  go

  if exists(select * from sysobjects where name='usp_getCountBySexandClassName')

  drop proc usp_getCountBySexandClassName

  go

  create procedure usp_getCountBySexandClassName

  @cnt int=100 output, --output标记说明它是一个输出参数。output意味着你向服务器请求这个参数的值,那么在执行的时候,服务器发现这个参数标记了output,就会将这个参数的值返回输出

  @totalnum int =200output, --总人数

  @className nvarchar(50), --输入参数没有默认值,在调用的时候必须传入值

  @sex nchar(1)='男'--输入参数有默认值,用户可以选择是否传入值

  as

  declare @classid int ---班级ID

  set @classid=(select classid from grade where [email protected]) --通过参数班级名称获取对应的班级ID

  select * from Student where [email protected] and [email protected]

  set @cnt= (select COUNT(*) from Student where [email protected] and [email protected]) --获取指定班级和性别的总人数

  set @totalnum=(select COUNT(*) from Student) ----获取总人数

  go

  --调用存储过程,获取指定性别的学员人数及总人数

  declare @num int,@tnum int

  exec usp_getCountBySexandClassName @[email protected] output ,@[email protected] output , @className='八期班'

  print @num

  print @tnum

  print '做完了'

  ---获取指定班级的人数

  if exists(select * from sysobjects where name='usp_getCount')

  drop proc usp_getCount

  go

  create procedure usp_getCount

  @className nvarchar(50)='八期班'

  as

  declare @classid int=(select classid from grade where [email protected])

  declare @cnt int

  set @cnt =(select COUNT(*) from Student where [email protected])

  --return 只能返回int整数值

  --return '总人数是'+cast(@cnt as varchar(2))

  return @cnt

  go

  --调用存储过程,接收存储过程的返回值

  declare @count int

  --set @count=(exec usp_getCount)

  exec @count=usp_getCount '八期班'

  print @count

  if exists(select * from sysobjects where name='usp_getClassList')

  drop proc usp_getClassList

  go

  create procedure usp_getClassList

  as

  select classid,classname from grade

  go

案例1:简化多表 sql 语句

# 准备数据mysql> create database db02 charset utf8;mysql> use db02;mysql> create table student(       s_id int,       name varchar,       math float,       chinese float);mysql> insert into student values(1,'tom',80,70),(2,'jack',80,80),(3,'rose',60,75);mysql> create table stu_info(       s_id int,       class varchar,       addr varchar;mysql> insert into stu_info values(1,'二班','安徽'),(2,'二班','湖南'),(3,'三班','黑龙江');# 创建视图包含编号、学生姓名、班级mysql> create view stu_v  as select student.s_id,student.name,stu_info.class from student,stu_info where student.s_id = stu_info.s_id;# 查看视图中的数据mysql> select * from stu_v;

排序:

二壹,分页存款和储蓄进程


if exists(select * from sysobjects where name='usp_getPageData')

drop proc usp_getPageData

go

create procedure usp_getPageData

@totalPage int output,--总页数

@pageIndex int =1 ,--当前页码,默认是第一页

@pageCount int =5 --每一页显示的记录数

as

select * from (select ROW_NUMBER() over(order by studentno) id,* from Student) temp where temp.id>(@pageindex-1)*@pagecount and temp.id<=(@pageindex*@pagecount)

set @totalPage=CEILING((select COUNT(*) from Student)*1.0/@pageCount)

go

案例贰:隔开分离数据

# 创建工资表mysql> create table salarys(       id int primary key,       name char,       salary double,       dept char;mysql> insert into salarys values       (1,'刘强东',800000,'市场'),       (2,'马云',899990,'市场'),       (3,'李彦宏',989090,'市场'),       (4,'马化腾',88889999,'财务');# 创建市场部视图mysql> create view dept_sc as select * from salarys where dept = '市场';mysql> select * from dept_sc;

注意:对视图数据的 insert update delete
会同步到原表中,但由于视图可能是一对字段,多数时候会失利。

计算:mysql
能够分摊程序中的部分逻辑,但那样1来后续的维护会变得更麻烦。如若供给改表结构,这表示视图也急需相应的退换,未有一贯在程序中修改
sql 来的有利。

1 select * from 表名 order by 列名 desc      //按照列名降序排序,默认为asc升序排序
2 注:order by语句必须放在整个sql语句的后面。

澳门新萄京,22,索引


  select * from sysindexes

  --create index IX_Student_studentName

  --on 表名(字段名)

  --clustered index:聚集索引 nonclustered index--非聚集索引

  if exists(select * from sysindexes where name='IX_Student_studentName')

  drop index student.IX_Student_studentName

  go

  create clustered index IX_Student_studentName

  on student(studentname)

  --如果是先创建主键再创建聚集索引就不可以,因为主键默认就是聚集索引

  --但是如果先创建聚集索引,那么还可以再创建主键,因为主键不一定需要是聚集的

触发器

 

23,临时表


  --创建局部临时表

  create table #newGrade

  (

  classid int ,

  classname nvarchar(50)

  )

  ---局部临时表只有在当前创建它的会话中使用,离开这个会话临时表就失效.如果关闭创建它的会话,那么临时表就会消失

  insert into #newGrade select * from grade

  select * from #newGrade

  select * into #newnewnew from grade

  select * into newGrade from #newgrade

  --创建全局临时表:只要不关闭当前会话,全局临时表都可以使用,但是关闭当前会话,全局临时表也会消失

  create table ##newGrade

  (

  classid int ,

  classname nvarchar(50)

  )

  drop table ##newGrade

  select * into ##newGrade from grade

  select * from ##newGrade

  --创建表变量

  declare @tb table(cid int,cname nvarchar(50))

  insert into @tb select * from grade

  select * from @tb

复习笔记,mysql复习笔记 本文内容 SQL 语句
创造数据库 创造数量表 数据完整性约束 八种基本字符类型表达 SQL 基本语句
类型转变函数…

如何是触发器?

触发器是一段与表有关的 mysql
程序,当这一个表在有个别时刻点发出了某种事件时,将会自行实践相应的触发器程序。

  

什么时候使用触发器

当大家想要在一个表记录被更新时做一些操作时就足以说选取触发器,可是完全可以在
python 中来成功那个事情。

询问数据前某些条:

创办触发器

1 select top 
2        值                              //如:5,则表示查询该表前5条
3        (表达式)                           //如:(2*2),则表示查询该表的前4条
4        值 percent                        //如:30 percent,则表示查询该表的前30%
5              * from 表名

语法

mysql> create trigger t_name t_time t_event on table_name for each rowbeginstmts...end

协理的年月点:事件时有发生在此之前和今后 before|after

支撑的轩然大波:update、insert、delete

在触发器中能够访问到将被修改的那壹行数据,依据事件分裂能访问的也不及,update
可用 old 访问旧数据,new访问新数据,insert 可用 new 访问新数据,delete
可用 old 访问旧数据。

能够将 new 和 old 看做一个目标,在那之中封装了修改的数据的全数字段。

 

使用触发器

破绽百出查询:
    通配符:_ 表示任意的单个字符 

案例

有 cmd 表和不当日志表,必要:在 cmd
奉行倒闭时自动将新闻存储到错误日志表中。

# 准备数据mysql> create table cmd(       id int primary key auto_increment,       user char,       priv char,       cmd char,       sub_time datetime, # 提交时间       success enum('yes','no')); # 0代表执行失败# 错误日志表mysql> create table errlog(       id int primary key auto_increment,       err_cmd char,       err_time datetime);# 创建触发器mysql> delimiter //mysql> create trigger trigger1 after insert on cmd for each rowbeginif new.success = 'no' then    insert into errlog values(null,new.cmd,new.sub_time);end if;end //delimiter;# 往表 cmd 中插入记录,触发触发器,根据 if 条件决定是否需要插入错误日志mysql> insert into cmd(       user,       priv,       cmd,       sub_time,       success) values       ('thales','0755','ls-l /etc',now,       ('thales','0755','cat /etc/password',now,       ('thales','0755','user ass xxx',now,       ('thales','0755','ps aux',now;# 查看错误日志表中的记录是否有自动插入mysql> select * from errlog;

delimiter用来修改暗中认可的行停止符,由于在触发器中有多条 sql
语句供给使用分号来甘休,不过触发器是一个1体化,所以须要先转移暗中同意的结束符(这里修改的只是客户端的终止符,服务端依旧以总部截至),在触发器编写完后再讲得了符设置回分号

只顾:外键不能够接触事件,主表删除了有个别主键,从表也会相应的去除数据,不过并不会施行触发器,并且触发器中无法选取工作,相同时间点的等同事件的触发器,不能同时设有。

1 例如:select * from 表名 where 列名 like '张_'            //表示查询出 张字开头,单个任意字符结尾 的数据

除去触发器

 

语法

mysql> drop trigger trigger_name;# 删除上面创建的触发器mysql> drop trigger trigger1;

        % 匹配任意多少个字符 

事务

1 例如:select * from 表名 where 列名 like '%张%'           //表示查询出 包含张字 的数据

怎么是业务?

mysql
事务首要用于拍卖操作量大,复杂度高的多寡。举例说,在人口管理连串中,你剔除1个人口,你即要求删除职员的基本资料,也必要删除和该职员相关的音信,如信箱、文章等,那样,那些数据库操作就组成1个职业。事务是逻辑上的壹组操作,要么都工作有成,要么都未果。

  • 在 mysql 中只有应用了 InnoDB 数据库引擎的数据库或表才帮忙专业;
  • 事务管理可以用来保险数据库的完整性,保证成批的 sql
    语句要么都实践,要么都不施行;
  • 业务用来治本 insert、update、delete语句

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图