MySQL语法

一、查找修改数据表结构

1、查看数据表的结构: DESC 表名;
2、查看创建数据表的语句: show create table 表名;
3、修改表名:

ALTER  TABLE  <旧表名>  RENAME  [TO]  <新表名>;
     ALTER  TABLE  员工表  RENAME  to  职工表;

4、修改字段的数据类型:

ALTER  TABLE 〈表名〉 MODIFY 〈字段名〉 〈数据类型〉
      ALTER  TABLE  职工表 MODIFY  姓名 varchar(10);

5、修改字段名:

ALTER  TABLE 〈表名〉 CHANGE 〈旧字段名〉 〈新字段名 >  <新数据类型>;
ALTER  TABLE 职工表 CHANGE 姓名 职工姓名  varchar(16);

6、添加字段:

ALTER  TABLE 〈表名〉 ADD 〈新字段名〉 〈数据类型〉 
[约束条件] [FIRST | AFTER已存在字段名];

FIRST”为可选参数,其作用是将新添加的字段设置为表的第一个字段;“AFTER”为可选参数,其作用是将新添加的字段添加到指定的“已存在字段名”的后面。如果语句中没有这两个参数,则默认将新添加的字段设置为数据表的最后列。

ALTER  TABLE  职工表  ADD 学历 char(10)  not null after 职工姓名;

7、 删除字段:ALTER TABLE <表名 > DROP <字段名>;

ALTER  TABLE 职工表  DROP  学历;

8、修改字段的排列位置:

ALTER  TABLE  <表名> MODIFY  <字段 1> <数据类型> FIRST | AFTER<字段2>;
ALTER  TABLE  职工表 MODIFY  职工姓名 varchar(16)  FIRST;

ALTER  TABLE  职工表 MODIFY  职工姓名 varchar(16)  after 员工ID;

9、 修改表的各类约束
添加主键约束的语法格式是:

ALTER  TABLE  <表名>  ADD  PRIMARY KEY(字段名1,字段名2,);

ALTER  TABLE  测试表  ADD  PRIMARY KEY(供应商ID);

删除主键约束的语法格式是:

ALTER  TABLE  <表名>  DROP  PRIMARY KEY;

ALTER  TABLE  测试表  DROP  PRIMARY KEY;

添加外键约束的语法格式是:

ALTER  TABLE  <表名>  ADD CONSTRAINT <外键约束名> FOREIGN KEY(外键字段) REFERENCES 关联表名(关联字段);

ALTER  TABLE  销售表  ADD CONSTRAINT FK1 FOREIGN KEY(货号) REFERENCES 商品表(货号);

10、使用语句删除数据表:

DROP  TABLE  [IF EXISTS]1,2,...表 n;
DROP  TABLE  IF EXISTS 测试表;

二、插入数据

基本语法格式是:

INSERT  INTO  <表名>  [(字段1,字段2,字段N)]  VALUES  (数据1,数据2,数据N);

插入一条完整的记录:

INSERT  INTO  职工表  values('123456','张三','男','1998-9-9','部门','2021-2-15',null);

插入一条不完整的记录:

INSERT  INTO  职工表(员工ID,出生日期,工作时间,部门,性别)  values('123456','1998-9-9','2021-2-15','销售部','男');

一次性插入多条记录:

INSERT  INTO  职工表  values

('123401','张三1','男','1998-9-9','部门','2021-2-15',null),

('123402','张三2','男','1998-9-9','部门','2021-2-15',null),

('123403','张三3','男','1998-9-9','部门','2021-2-15',null),

('123404','张三4','男','1998-9-9','部门','2021-2-15',null)

;

注意,使用该语句时字段列和数据值的数量必须相同。如果数据是字符型,必须使用单引号或者双引号将其引起来。

INSERT语句还可以将SELECT语句查询的结果插入到表中,其基本语法格式是:

INSERT INTO 插入数据表名 (输入字段列表) SELECT (查询字段列表) FROM 查询数据表名 WHERE (条件)

INSERT INTO  职工表 select * from 员工表;

三、更新数据

基本语法结构是:

UPDATE 表名 SET 字段1=1,字段2=2,,字段N=值N  [WHERE 条件]

可以同时更新一个或多个字段。可以在 WHERE 子句中指定任何条件。

要保证UPDATE以WHERE子句结束,通过WHERE子句指定被更新的记录所需要满足的条件,如果忽略WHERE子句,MYSQL将更新表中所有的行。

UPDATE 职工表 SET 性别=‘男’ WHERE 员工ID=‘101004’;

注意:字段的各种约束。

1、主键约束;

2、外键约束;

3、唯一约束;

4、数据类型约束,特别是性别;

四、删除数据

增(insert into)、删(delete from)、改(update)、查(select)

但数据库对象(库,表,索引,等):

create(建立),drop(删除),alter(更改)

从数据表中删除数据使用DELETE语句,DELETE语句允许WHERE子句指定删除条件。DELETE语句基本语法格式如下:

DELETE  FROM  表名 [WHERE条件]

delete from 职工表 where 员工ID='123457';

如果没有指定WHERE子句,MYSQL表中的所有记录将被删除;可以在WHERE子句中指定任何条件;您可以在单个表中一次性删除记录。

附加内容:

外键约束

五、数据库存储即可视数据操作

1、使用MYSQLDUMP命令必须要有足够的权限。其基本语法格式是:

MYSQLDUMP [-H<IP地址>] –U <用户名> –P[数据库密码] --DATABASES 数据库1数据库2 … > [存储路径] 文件名.SQL

MYSQLDUMP –Uroot –P xsxt>D:/xsxt5.txt

上述语句:存储建表及插入数据的语句,没有建立数据库与进入数据库的语句,如查需要建库与进库的语句,加–databases参数

mysqldump -uroot -p xsxt --databases>d:\xsxt.txt

2、使用Source命令进行数据还原

语法:source 文件路径

这个命令是Mysql命令,需要进入Mysql才能运行。

3、可视化数据操作简介

六、数据查询语法

增、删、改、查

数据库管理系统的一个最重要的功能就是数据查询,数据查询不应只是简单查询数据库中存储的数据,还应该根据需要对数据进行筛选,以及确定数据以什么样的格式显示。

本项目将介绍如何使用SELECT语句查询数据表中的一列或多列数据、连接查询、子查询以及使用Navicat生成查询等。

基本查询语句,MySQL从数据表中查询数据的基本语句为SELECT语句。

1、SELECT语句的语法格式是:
SELECT --指定选择的列

{丨 <字段列表>} –,代表所有列

[

FROM <表1>,<表2>... --指定从哪些表中选择

[WHERE <表达式>] --指定选择什么样行

[GROUP BY ] --分组查询

[HAVING [{〈operator〉 }…]] --分组后再按条件筛选

[ORDER BY <order by definition〉] --排序

[LIMIT [,3 ] --指定查询的行数

]

(1)WHERE子句是可选项,如果选择该项,将限定查询行必须满足的查询条件。
(2)GROUP BY <字段〉,该子句告诉MySQL如何显示查询出来的数据,并按照指定的字段分组。
(3)[ORDERBY<字段 >],该子句告诉MySQL按什么样的顺序显示查询出来的数据,可以进行的排序有:升序(ASC)、降序(DESC)。
(4)[LIMIT [,] ],该子句告诉MySQL每次显示查询出来的数据条数。
2、基本查询语句
SELECT [字段1,字段2,…,字段n]

FROM [表或视图]

WHERE [査询条件];

其中,各条子句的含义如下:

 {*丨<字段列表>}包含星号通配符选择字段列表,表示查询的字段,其中字段列至少包含一个字段名称,如果要查询多个字段,多个字段之间用逗号隔开,最后一个字段后不要加逗号。

 FROM <表1>,<表2〉…表1和表2表示查询数据的来源,可以是单个或者多个。

6.1按列查询

1、检索所有列
在SELECT语句中使用星号(* )通配符查询所有字段

SELECT查询记录最简单的形式是从一个表中检索所有记录,实现的方法是使用星号(*) 通配符指定查找所有列的名称。语法格式如下:

SELECT * FROM 表名;

select * from 员工表;

2、检索指定列

SELECT 字段1,字段2,...,字段n FROM 表名;
SELECT 姓名,性别,出生日期 FROM 员工表;

3、为字段取别名的基本语法形式为
(1)本身字段名为英文,但需要显示中文

(2)列做了运算(包括函数)

字段名 [AS] 字段别名

“字段名”为表中字段定义的名称,“字段别名”为字段新的名称,AS关键字为可选。

6.2按行查询

where 字段名 操作符 具体值----条件值

  1. 查询指定记录
    在这里插入图片描述
  2. 带IN,not in 关键字的查询

• IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号的合法值,语法格式为:

SELECT字段名1,字段名2,字段名n FROM表名 WHERE字段名 IN (1,2,);

例:查询联系人为’李东平’或’王辉’,或’刘芳的进货商的信息;

select * from 供应商表 where 联系人='李东平' or 联系人='王辉' or 联系人='刘芳' ;

select * from 供应商表 where 联系人 in ('李东平','王辉', '刘芳' );

in查询主要用在子查询中。

例:查询有销售记录的员工信息。

 select * from 员工表 where 员工ID in (select  distinct 销售员ID from 销售表);

例:查询没有销售记录的商品信息;

select * from 商品表 where 货号 not in (select 货号 from 销售表);
  1. 带BETWEEN AND的范围查询

• BETWEEN AND用来查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束值,如果字段值满足指定的范围查询条件,则这些记录被返回, BETWEEN匹配范围中所有值,包括开始值和结束值。语法格式为:

SELECT字段名1,字段名2,字段名n FROM表名 WHERE字段名 BETWEEN1 AND2;

• BETWEEN AND操作符前可以加关键字NOT,表示指定范围之外的值,如果字段值不满足指定的范围内的值,则这些记录被返回。

例:查询销售参考价格在6000到7500之间的商品信息。

select * from 商品表 where 参考价格>=6000 and 参考价格<=7500

select * from 商品表 where 参考价格 between 6000 and 7500
  1. 带LIKE的字符匹配查询

• 如果要查找所有的姓“刘”的员工信息,该如何查找呢?简单的比较操作在这里已经行不通了,在这里,需要使用通配符进行匹配查找,通过创建查找模式对表中的数据进行比较。执行这个任务的关键字是LIKE,语法格式为:

• SELECT字段名1,字段名2,字段名n FROM表名 WHERE字段名LIKE 条件

• 通配符是一种在SQL的WHERE条件子句中拥有特殊意思的字符,SQL语句中支持多种通配符,可以和LIKE—起使用的通配符有‘%’和‘_’。

• 1) 百分号通配符(%)

• 通配符(%),匹配任意长度的字符,甚至包括零字符,通配符可以在搜索模式中的任意位置使用,并且可以使用多个通配符。

• 2) 下划线通配符(_)

• 通配符(),该通配符的用法和‘%’相同,区别是‘%’可以匹配多个字符,而‘’只能匹配任意单个字符,如果要匹配多个字符,则需要使用相同个数的‘_’。

查询姓名:

姓刘:‘刘_%’

名字中间有一个‘飞’字,且是三个字的姓名: ‘

  1. 查询空值 ‘’ “”

• 数据表创建的时候,设计者可以指定某列中是否可以包含空值(NULL)。空值不同于0, 也不同于空字符串。空值一般表示数据未知、不适用或将在以后添加数据。在SELECT语句中使用IS NULL子句,可以查询某字段内容为空的记录。语法格式为:

• SELECT字段名1,字段名2,字段名n FROM表名 WHERE 字段名 IS NULL;

where 个人简历=“NULL"

where 个人简历=“"

where 个人简历=0

where 个人简历=NULL

where 个人简历 is null

  1. 带AND的多条件查询

• 使用SELECT查询时,可以增加查询的限制条件,这样可以使查询的结果更加精确。 MYSQL在WHERE子句中使用AND操作符限定只有满足所有查询条件的记录才会被返回。 可以使用AND连接两个甚至多个查询条件,多个条件表达式之间用AND分开。语法格式为:

• SELECT字段名1,字段名2,字段名n FROM表名 WHERE 条件1 AND 条件2…;

  1. 带OR的多条件查询

• AND相反,在WHERE声明中使用OR操作符,表示只需要满足其中一个条件的记录即可返回。OR也可以连接两个甚至多个查询条件,多个条件表达式之间用OR分开。语法格式为:

• SELECT字段名1,字段名2,字段名n FROM表名 WHERE 条件1 OR 条件2…;

• OR可以和AND—起使用,但是在使用时要注意两者的优先级,由于AND的优先级高于OR,因此先对AND两边的操作数进行操作,再与OR中的操作数结合。

  1. 查询不同的值

• SELECT语句返回所有匹配的行,如果不希望每个值每次都出现,该怎么办呢?例如,你想检索员工表所有部门的名称,按以往的方法,部门字段中的所有行的数据都会显示出来,有些部门名称有雷同,为此,可以使用DISTINCT关键字,返回数据的不同值。语法格式为:

SELECT DISTINCT 字段名1,字段名2,字段名n FROM表名;

• 注意:DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。

  1. 显示前N行

• SELECT返回所有匹配的行,有可能是表中所有的行,如仅仅需要返回第一行或者前几行,使用LIMIT关键字,语法格式为:

• SELECT DISTINCT 字段名1,字段名2,字段名n FROM表名 LIMIT[位置偏移量,] 行数;

• 注意:第一个被检索的行是第0行,而不是第1行。

select * from xs limit 5;

select * from xs limit 1,5;

6.3查询结果排序

是对最终结果排序。

从表中查询出来的数据是无序的,或者其排列顺序不是用户期望的。为了使查询结果满足用户的要求,可以使用ORDER BY对查询结果进行排序,其语法格式为:

SELECT字段名1,字段名2,字段名n FROM表名 ORDER BY 字段名1[ASC|DESC],字段名2[ASC|DESC]…;

在上面的语法格式中,指定的字段名1、字段名2等是对查询结果排序的依据。参数ASC表示按升序进行排序,DESC表示按照降序进行排序。默认情况下,按照ASC方式进行排序。

按学生的总学分进行降序排列。

select * from xs order by 总学分 desc;

select * from xs order by 总学分 desc,出生时间 desc;

6.4查询的分组与汇总

• 有时候并不需要返回实际表中的数据,而只是对数据进行总结。MySQL提供一些查询功能,可以对获取的数据进行分析和报告。这些函数的功能有:计算数据表中记录行数的总数、 计算某个字段列下数据的总和,以及计算表中某个字段下的最大值、最小值或者平均值。这些聚合函数的名称和作用如表所示。
在这里插入图片描述
2. 分组查询

• 分组查询是对数据按照某个或多个字段进行分组,MySQL中使用GROUP BY关键字对数据进行分组,基本语法形式为:

• [GROUP BY 字段名][HAVING <条件表达式>]

分组查询的列:只能出现分组字段及聚集函数

• 字段名为进行分组时所依据的列名称;“HAVING <条件表达式>”指定满足表达式限定 条件的结果将被显示。

• 1) 创建分组

• 分组是使用SELECT语句的GROUP BY子句建立的。GROUP BY关键字通常和集合函数一起使用,例如:MAX()、MIN()、COUNT()、SUM()、 AVG()。例如,要返回员工表中每个部门的员工人数,这时就要在分组过程中用到COUNT() 函数,把数据分为多个逻辑组,并对每个组进行集合计算。

select 分组字段,聚集函数

from 表名

group by 分组字段

统计每个专业的学生人数;

• 2) 过滤分组

• GROUP BY可以和HAVING—起限定显示记录所需满足的条件,只有满足条件的分组才会被显示。

• HAVING关键字与WHERE关键字都是用来过滤数据,HAVING支技所有WHERE操作符,两者有什么区别呢?其中重要的一点是,HAVING在数据分组之后进行过滤来选择分组,而WHERE在分组之前用来选择记录。另外WHERE排除的记录不再包括在分组中。

• 3) 分组中使用WITH ROLLUP

• 使用WITH ROLLUP关键字之后,在所有查询出的分组记录之后增加一条记录,该记录 计算查询出的所有记录的总和,即统计记录数量。

• 4) 多字段分组

• 使用GROUP BY可以对多个字段进行分组,GROUP BY关键字后面跟需要分组的字段, MySQL根据多字段的值来进行层次分组,分组层次从左到右,即先按第1个字段分组,然后在第1个字段值相同的记录中,再根据第2个字段的值进行分组…依次类推。

• 5) GROUP BY 和ORDER BY 一起使用

• 某些情况下需要对分组进行排序,在前面的介绍中,ORDER BY用来对查询的记录排序, 如果和GROUP BY—起使用可以完成对分组的排序。

• 注意:当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序。即ROLLUP和ORDERBY是互相排斥的。

6.5多表连接查询

多表连接查询
• 连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。通过连接运算符可以实现多个表查询。在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当查询数据时,通过连接操作查询出存放在多个表中的不同实体的信息。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。

查询有销售记录的员工姓名与部门;

  1. 交叉连接查询

• 交叉连接查询返回的结果是被连接的两个表中所有数据行的笛卡儿积,也就是返回第一个表中符合查询条件的数据行乘以第二个表中符合查询条件的数据行数,例如,员工表有中13个员工,销售表中11条销售记录,那么交叉连接的结果就有13*11=143条数据,其语法格式为:

• SELECT * FROM 表名1 CROSS JOIN 表名2;

  1. 内连接查询

• 内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新记录,也就是说,在内连接查询中,只有满足条件的记录才能出现在结果关系中,其语法格式为:

• SELECT查询字段FROM表名1 [INNER] JOIN 表名2 on 表名1.关系字段=表名2.关系字段;

• 在上述语法格式中,INNER JOIN用于连接两个表,ON来指定连接条件,其中INNER可以省略。

• 用户也可以使用WHERE子句来实现多表连接查询,其语法格式为:

• SELECT查询字段FROM表名1,表名2… WHERE 表名1.关系字段=表名2.关系字段 [AND 连接条件…];

• 使用WHERE子句定义连接条件比较简单明了,而INNER JOIN语法是ANSI SQL的标准规范,使用INNER JOIN连接语法能够确保不会忘记连接条件,而且,WHERE子句在某些时候会影响查询的性能。

有销售记录的员工姓名与部门;

select 姓名,部门 from 员工表 inner join 销售表 on 员工ID=销售员ID;

没有销售记录的员工姓名与部门;

select 姓名,部门 from 员工表 left join 销售表 on 员工ID=销售员ID where 客户名称 is null ;

select 姓名,部门 from 销售表 right join 员工表 on 员工ID=销售员ID where 客户名称 is null ;

  1. 外连接查询

• 外连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中的仅是符合 查询条件和连接条件的行。但有时候需要包含没有关联的行中数据,即返回查询结果集合 中的不仅包含符合连接条件的行,而且还包括左表(左外连接或左连接)、右表(右外连接或右连接)或两个连接表(全外连接)中的所有数据行。外连接分为左外连接或左连接 和右外连接或右连接:

LEFT JOIN (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。

RIGHT JOIN (右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。

• 1) LEFT JOIN (左连接)

• 左连接的结果包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果行中,右表的所有选择列表列均为空值,其语法格式为:

• SELECT查询字段FROM表名1 LEFT OUTER JOIN 表名2 表名1.关系字段=表名2.关系字段;

• 2) RIGHT JOIN (右连接)

• 右连接是左连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,左表将返回空值,其语法格式为:

• SELECT查询字段FROM表名1 RIGHT OUTER JOIN 表名2 表名1.关系字段=表名2.关系字段;

6.6子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询。

在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。

子查询中常用的操作符有ANY (SOME)、ALL、IN、EXISTS。 子查询可以添加insert、UPDATE和DELETE语句中,而且可以进行多层嵌套。

子查询中也可以使用比较运算符,如“<”、“<=”、“>”、“>=”和“!=”等。

带IN关键字的子查询

SELECT 查询字段 FROM 表名 WHERE 字段名 [NOT] IN (SELECT语句);

例:查询有销售记录的员工姓名与部门

   select 销售员ID from 销售表  

  select 姓名,部门 from 员工表 where 员工ID in (select 销售员ID from 销售表)

查询没有销售记录的员工姓名与部门

 select 姓名,部门 from 员工表 where 员工ID  not in (select 销售员ID from 销售表)

带EXISTS关键字的子查询

SELECT 查询字段 FROM 表名 WHERE [NOT] EXISTS (SELECT语句);

判断: [NOT] EXISTS (SELECT语句)–where子句后面的值是否为真还是为假;

执行逻辑:执行父查询的每条记录,就检查子查询的结果是否存在,如果存在,就显示父查询的该条记录,反之就不显示。

带ANY、SOME关键字的子查询

SELECT查询字段 FROM 表名 WHERE 字段名 比较运算符 ANY|SOME (SELECT语句);

比较运算符:“<”、“<=”、“>”、“>=”和“!=”

带ALL关键字的子查询

SELECT 查询字段 FROM 表名 WHERE 字段名 比较运算符 ALL (SELECT语句);

七、创建与使用视图

7.1、创建试图

视图中包含了 SELECT查询的结果,因此视图的创建基于SELECT语句和已存在的数据 表。视图可以建立在一张表上,也可以建立在多张表上。在MySQL中,创建视图使用CREATE VIEW 语句,其基本语法格式如下:

CREATE [OR REPLACE] View Viewname

AS

select_statement

[WITH CHECK OPTION ]

建立一个销售部门员工信息的视图,取名V1

create or relace view V1 as select * from 员工表 where 部门=‘销售部’ WITH CHECK OPTION;

注意:

视图建好以后,看起来,查询时,是好前面的表一样的使用,但是视图是一个虚表,它本身并不存储数据,它的数据都是来自于实表中。

建一个视图V1(兼容可以修改的),在学生成绩管理数据库中,学生成绩总分高于200分的学生信息。

7.2修改视图

ALTER [OR REPLACE] VIEW view_name

AS

select_statement

[WITH CHECK OPTION ]

alter view v1 as select * from 员工表 where 部门=‘办公室’;

create or replace view v1 as select * from 员工表 where 部门=‘销售部’;

7.3删除视图

DROP VIEW [IF EXISTS] view_name

删除视图V1

drop view if exists v1;

1、视图是一个虚拟表,其中没有数据。当对视图进行更新、插入、删除时,其实就是对实表的数据进行更新、插入、删除。

2、建视图时,加了 With check option后,那么当你对视图进入更新、插入、删除时,就必须遵守当时建视图时的Where条件。

八、存储过程

1、存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句块,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它,存储过程能重复使用,这样可以大大减少数据库开发人员的工作量。

2、DELIMITER命令:更改MySQL语句的默认结束符“;"。

delimiter $$

delimiter ;

3、创建简单存储过程:

CREATE PROCEDURE 存储过程名()—形参

BEGIN

 <存储过程体>

END

4、查看存储过程:SHOW PROCEDURE STATUS

5、调用简单存储过程:CALL 存储过程名();

6、删除存储过程:DROP PROCEDURE if exists <存储过程名>;

PL/SQL判断语句
1、IF…THEN…ELSE语句:

IF <条件> THEN

<语句块1>

[ ELSE

<语句块3> ]

END IF ;

2、CASE语句

① 简单CASE语句

简单CASE语句用于将某个表达式与一组简单表达式进行比较以确定其返回值,其语法格式如下:

CASE <测试表达式>

 WHEN  <表达式1>  THEN  <SQL语句1> 

 WHEN  <表达式2>  THEN  <SQL语句2> 

 ……

 [  ELSE  < SQL语句n+1>  ]

END CASE ;

② 搜索CASE语句

搜索CASE语句用于计算一组逻辑表达式以确定返回结果,其语法格式如下:

CASE

 WHEN  <逻辑表达式1>  THEN  <SQL语句1>  

 WHEN  <逻辑表达式2>  THEN  <SQL语句2>

 ……

 [  ELSE  <SQL语句n+1>  ]

END CASE ;

3、选择语句(函数)在查询语句中使用

if函数;

case语句;
PL/SQL循环语句
1、WHILE循环语句(当型循环),语法格式如下:

[begin_label:]

WHILE <条件> DO

<语句块>

END WHILE [end_label] ;

2、REPEAT循环语句(直到型循环),语法格式如下:

[begin_label:]

REPEAT

<语句块>

UNTIL <条件>

END REPEAT [end_label] ;

3、LOOP循环语句,语法格式如下:

[begin_label:]

LOOP

<语句块>

END LOOP [end_label];

4、跳出循环控制循环语句:leave,其语法格式如下:

LEAVE <标签>;

5、跳出本次循环,然后直接进入下一次循环语句-ITERATE,其语法格式如下:

ITERATE <标签>;

创建带参数的存储过程
创建存储过程的语法格式如下:

CREATE PROCEDURE 存储过程名([形参列表])

BEGIN

 <存储过程体>

END;

说明:

存储过程可以不使用参数,也可以带1个或多个参数。

如果有多个参数,各个参数之间使用半角逗号分隔。参数的定义格式如下:

[In|Out|InOut] <参数名> <参数类型>

In:仅输入

Out:仅输出

InOut:可输入可输出

调用存储过程

存储过程创建完成后,可以在程序、触发器或者其他存储过程中被调用,其语法格式如下:

CALL 存储过程名([<实参列表>]);

说明:如果定义存储过程时使用了参数,那么调用该存储过程时,也要使用参数,并且参数个数和顺序必需一一对应。

事物
一、事务的ACID特性

1、原子性

一个事务(transaction)中的所有操作,要么全部执行,要么全部不执行。

2、一致性

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。

3、隔离性

MySQL数据库允许多个并发事务,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

4、持久性

事务处理结束后,对数据的修改就是永久的。

二、事务控制语句

1、开始事务

开始事务的语法格式如下:

START TRANSACTION;

2、提交事务

提交事务的语法格式如下:

COMMIT;

3、撤销事务

撤销事务的语法格式如下:

ROLLBACK;

触发器

创建触发器
创建触发器CREATE TRIGGER的语法格式如下:

CREATE TRIGGER 触发器名 触发时刻 触发事件 ON 表名 FOR EACH ROW

        触发器动作;

说明:

① 触发器名

触发器名在当前数据库中必须具有唯一性,如果是在某个特定数据库中创建,在触发器名前加上数据库的名称。

② 触发时刻

触发时刻有两个选择:BEFORE或AFTER。

③ 触发事件

触发事件是指激活触发器执行的语句类型,可以是INSERT、DELETE、APDATE。

④ 表名

⑤ FOR EACH ROW

行级触发器,是指受触发事件每影响一行都会执行一次触发程序。

⑥ 触发器动作

触发器激活时将要执行的语句,如果要执行多条语句使用BEGIN…END复合语句。

触发器动作中可以使用NEW关键字与OLD关键字,在触发程序中可以使用OLD关键字表示更新前的旧记录、使用NEW关键字表示更新后的新记录。

insert 的记录用NEW代替。

注意:在MySQL触发器中不能直接在客户端界面返回结果,所以在触发器动作里不要使用SELECT语句,还有不能在一个表上同时创建2个相同类型的触发器,因此在一个表上最多创建6个触发器。

触发器实例
1、用触发器实现,每销售一件商品,其商品的库存量相应地减少。

insert into 销售表(销售日期,客户名称,货号,单价,数量,销售员ID) values(now(),‘kf’,‘1002’,5300,100,‘101004’);

delimiter $$

create or replace trigger xs_insert_after after insert on 销售表 for each row

begin

update 商品表 set 库存量=库存量-new.数量 where 货号=new.货号;

end$$

delimiter ;

2、用触发器实现,当销售一件商品时,先判断其商品的库存量是否充足,如果库存量不充足,则提示库存量不多,不能销售该商品,否则销售该商品。

delimiter $$

create or replace trigger xs_insert_before before insert on 销售表 for each row

begin

declare num int;

select 库存量 into num from 商品表 where 货号=new.货号;

if num<new.数量 then

signal sqlstate ‘AB123’ set message_text=‘库存量不够,不能销售该商品’;

end if;

end$$

delimiter ;

显示触发器:

show triggers;

删除触发器:

drop trigger if exists xs_insert_before;

其他

了解MySQL权限表
MySQL通过权限表来控制用户对数据库的访问,MySQL数据库在安装时会自动安装多个数据库。MySQL权限表存放在名称为MySQL的数据库中。常用的权限表有user、db、host、table_priv、columns_priv和procs_priv。

user权限表

db、host权限表

table_priv权限表

columns_priv权限表

procs_priv权限表

操作User权限表
1、查看用户;

select user,host,password,select_priv from user;

2、插入用户;

假如我现在要建立一个网络访问的用户,用户名:amdin,主机:%,密码:123456,先不分配权限;

insert into user(user,host,password) values(‘admin’,‘%’,password(‘123456’));

3、删除用户;

delete from user where user=‘admin’;

4、修改用户;

修改用户Admin的密码

update user set password=password(‘654321’) where user=‘admin’;

修改用户Admin的select_priv权限

update user set select_priv=‘Y’ where user=‘admin’;

用户管理
1、添加用户

CREATE USER <‘用户名’>@<‘主机’> [IDENTIFIED BY [PASSWORD] [<‘密码’>]];

例:建立本地服务器用户aa,密码为空。

    create user  'aa'@'localhost'

2、修改用户的名称

RENAME USER <‘旧的用户名’>@<‘主机’> TO <‘新的用户名’>@<‘主机’>;

例:将aa用户名改为bb

rename user ‘aa’@‘localhost’ to ‘bb’@‘localhost’;

3、修改用户的密码

(1)SET PASSWORD语句的语法格式如下:

SET PASSWORD [FOR <‘用户名’>@<‘主机’>]=PASSWORD(<‘新密码’>);

说明:

SET PASSWORD语句可以修改用户的密码,语句中如果不加“[FOR <‘用户名’>@<‘主机’>]”可选项则修改当前用户

set password for ‘bb’@‘localhost’=password(‘123456’);

(2)mysqladmin命令修改用户密码的命令格式如下:

mysqladmin -u <用户名> [-h <主机>] -p password [<新密码>];

说明:

“mysqladmin”是一条外部命令,必需在服务器端的“命令提示符”下执行。

mysqladmin -ubb -p password 654321

4、删除用户

drop user <‘旧的用户名’>@<‘主机’>

权限管理
1、授予用户权限

GRANT语句不仅是授权语句,还可以修改用户密码的作用。

GRANT语句的语法格式如下:

GRANT <权限名称>[(字段列表)] ON <对象名> TO <‘用户名’>@<‘主机’>

         [IDENTIFIED BY [PASSWORD] <'新密码'>] [WITH GRANT OPTION];

说明:

① “权限名称”中常用的权限例如:

ALL [PRIVILEGES]:除GRANT OPTION之外的所有简单权限。

② “对象名”有以下权限级别:

全局权限:适用于一个给定服务器中的所有数据库,可以用“.”来表示。

数据库权限:适用于一个给定数据库中的所有数据库对象,可以用“数据库名.*”来表示。

表权限:适用于一个给定表中的所有列,可以用“数据库名.表名”来表示。

列权限:适用于一个给定表中的单一列,如:SELECT(员工ID,姓名)。

子程序权限:适用于给定存储过程或函数,可以用“PROCEDURE|FUNCTION 数据库名.过程名”来表示。

③ “<‘用户名’>@<‘主机’>”中如果“用户名”不存在则添加用户。 “[IDENTIFIED BY [PASSWORD] <‘新密码’>]”可选项可以设置新用户的密码,如果“用户名”已经存在则此可选项可以修改用户的密码。

④ “[WITH GRANT OPTION]”可选项表示允许用户将获得的权限授予给其他用户。

例:

create user ‘u1’@‘localhost’;

grant a on . to ‘u1’@‘localhost’ identified by ‘123’ WITH GRANT OPTION;

grant select(员工ID,姓名) on xsxt. 员工表 to ‘u1’@‘localhost’ identified by ‘123’ WITH GRANT OPTION;

2、查看用户权限

SHOW GRANTS FOR <‘用户名’>@<‘主机’>

SHOW GRANTS FOR ‘u1’@‘localhost’;

3、回收用户权限

REVOKE <权限名称>[(字段列表)] ON <对象名> FROM <‘用户名’>@<‘主机’>;

revoke select(员工ID,姓名) on xsxt.员工表 from ‘u1’@‘localhost’;

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值