目录

  • (1)mysql语法介绍
  • (2)多表连接
  • (3)子查询
  • (4)增删改语句
  • (5)数据类型
  • (6)常见约束介绍
  • (7)事务控制语句
  • (8)视图的介绍
  • (9)变量的介绍
  • (10)存储过程和函数
  • (终)流程控制结构

注意:本章可以根据自己不熟悉的地方练习,全部看完太多效率不高

(1)mysql语法介绍

语法顺序

1.select 分组函数,分组后的字段
2.from 表
3.where 筛选条件
4.group by 分组的字段
5.having 分组后的筛选
6.order by 排序列表

7.limit 索引,索引多少
(mysql处理顺序为2,3,4,5,1,6,7)

特点
分组前筛选:where 筛选的表:原始表 位置:group by的前面
分组后筛选:having 筛选的表:分组后的结果 位置:group by的后面

常见语法
1.起别名
select 字段名 as 别名 or select 字段名 别名(就是加空格)

2.去重
select distinct 字段名 from 表名;

3.判断某字段或表达式是否为null
select isnull(字段名)
(如果为null就是1,反之为0)
[补充]
select ifnull(字段,0) from 表名;
(判断是否为null,如果是返回指定值,反之)

4.模糊查询
like:一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符
betwenn 0 an 100
(比如0<x<100)

in(参数,参数)
(查找指定字符串或数字)

is null/is not null:用于判断null值

5.升序和降序
order by 排序列表 (默认升序)
1.asc:升序
2.desc:降序
(排序列表支持单个字段,多个字段,函数,表达式,别名)

6.limit 索引
用于查询列表里的指定索引字段,或分页查询
注:索引是从0开始
比如:limit 1,表示查找第一个(第一个不行默认为从第0开始)和limit 10,15表示从第10个开始查找到第25个

7.union联合
用于合并多条查询语句
举例:比如我想查询中国和美国表中男生的名字

select id,cname,csex from t_ca where csex='男'
union
select t_id,tname,tgender from t_ua where tgender='male'

8.if函数
功能:实现双分支
语法:select if(表达式1,表达式2,表达式3)#如果表达式1成立就返回2,反之3

字符函数
1.拼接字符
select concat(字符1,字符2,字符3,…);
2.截取子串
substr(‘str’,‘从哪里开始’,‘到哪里结束’)
注:(索引是从1开始的)
3.替换
replace(‘要被替换的名字’,‘替换成的名字’)
4.获取字节长度
length(‘str’)

数学函数
ceil:向上取整
round:四舍五入
mod:取模
floor:向下取整
truncate:截断
rand:获取随机数,返回0-1之间的小数

日期函数
now:返回当前日期+时间
date_format:将字符转换成日期
curdate:返回当前日期
str_to_date:将字符转换成日期
curtime:返回当前时间

流程控制函数
if(条件表达式,表达式1,表达式2):如果条件成立,返回表达式1,否则返回表达式2

case的2种用法
1.case 变量或表达式或字段
when 常量1 then 值1
when 常量2 then 值2
…**
2.case
when 条件1 then 值1
when 条件2 then 值2

分组函数
1.max 最大值
2.min最小值
3.sum 和
4.avg 平均值
5.count 计算个数
(count(*):统计结果集的行数)

(2)多表连接

特点
1.一般为表起别名
2.多表的顺序可以调换
3.n表连接至少需要n-1个连接条件
4.等值连接的结果是多表的交集部分

sql99语法

1.等值连接
案例1.查询员工名,部门名

select last_name,department_name
from employees e
inner join departments d
on e.'department_id'=d.'department_id';

案例2.查询员工名,部门名,工种名,并按部门名降序(添加三表连接)

select last_name,department_name,job_title
from employees e
inner join departents d
on e.'department_id'=d.'dppartment_id'
inner join jobs j on e.'job_id'=j.'job_id'
order by department_name desc;

2.非等值连接
案例1.查询员工的工资级别

select salary,grade_level
from employees e
#inner 可以省略不写
join job_grades g
on e.'salary' between g.'lowest_sal'and g.'highest_sal';

3.自连接
案例1.查询员工的名字,上级的名字

select e.last_name,m.last_name
from employess e
join employess m
#在同表的情况下通过员工的id和上级的id来寻找
on e.'manager_id'=m.'employee_id';

4.外连接
特点:
1.外连接的查询结果为主表最后的所有记录
如果从表中有和它匹配的,则显示出匹配的值,反之为null
外连接查询结果=内连接结果+主表中有而从表中没有的记录

什么是主什么是从
利用主的关键连接id来查找对应从的字段名,最终结果一定是主

5.左外连接和右外连接
两者区别在于谁是主谁是从的关系,左外连接即from的字段名为主,而又外连接即from的字段名为从
左外连接语法:left join
右外连接语法;right join

(3)子查询

如果有编程一定基础的应该能明白,子查询的意思相当于包装起一个函数返回的return的值然后给where或having判断,比较灵活(比作把一些事情拆出来)

案例1:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资

1.拆分为先查询141号员工的job_id

select job_id
from employees
where employees_id =141

2.再拆分salary比143号员工多的员工

select salary
from employees
where employee_id=143

3.最后合并

select last_name,job_id,salary
from employees
where job_id=(
select job_id
from employees
where employees_id =141
)and salary>(
select salary
from employees
where employee_id=143
);

子查询的常用语法
in和not in:配合where或having使用,通常是等于列表中任意一个参数即可反之not in

案例
案例:查询员工姓名,要求部门号是1400或1700的部门编号

select last_name
from employees
#也可以写成=ANY相当于等于里面任意一个,如果是not in的话即不是里面的列表,也可以用<>ALL因为是比较多个
where department_id in(
#这里有个去重
select distinct departmen_id
from departments
where location_id in(1400,1700)
)

ANY:和子查询返回的某一个值比较
(比如说有很多返回值,返回的值和一个值比较,条件成立就打印出来)
案例1

案例1:返回其它部门中比job_id为’IT_PROG’部门任意工资低的员工的:工号,姓名,job_id以及salary

#首先我们要先拆分,先算出IT_PROG部门的工资
select salary
from employees
where job_id = 'IT_PROG'
SELECT last_name,job_id,salary,employee_id
FROM employees
#或是<IT_PROG的max(salary)
WHERE salary < ANY(
select salary
from employees
where job_id = 'IT_PROG
)AND job_id<>'IT_PROG'  ;

ALL:和子查询返回所有值比较

(相当于比较完一个后继续比较下一个直到全部)

案例2

案例2:返回其它部门中比job_id为’IT_PROG’部门所有工资都低的员工的:工号,姓名,job_id以及salary

SELECT last_name,job_id,salary,department_id
FROM employees
#或是<工资的ALL
WHERE salary < (
SELECT min(salary)
FROM employees
WHERE job_id = 'IT_PROG'
)
AND job_id<>'IT_PROG'

子查询练习

案例一:查询平均工资最低的部门信息

1.先查询部门平均工资最低的部门id

select department_id
from departments
group by department_id
order by avg(salary)
limit 1

2.获取了平均工资最低的部门id,去查找信息

select *
from departments
where department_id=(
select department_id
from departments
group by department_id
order by avg(salary)
limit 1;
);

案例二:各个部门中的最高工资中最低的部门的最低工资

1.先查询各个部门中的最高工资最低部门的id

SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY MAX(salary)
LIMIT 1

2.获取了最低部门id后,再获取该部门的最低工资

select min(salary)
from employees
where department_id=(
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY MAX(salary)
LIMIT 1
)

(4)增删改语句

创建语句: create
修改语句:alter,update
插入语句:insert
删除语句:drop和trucate还有delete和turncate

(trucate可以理解全部删除没有返回值)
use:转到哪个库
desc:查询表结构

show:查看有那些表
(show index from 表)
是查看表中所有的索引,包括主键,外键,唯一

delete用法:delete from 删除表
updata用法:update 表1 别名,表2 别名 set 列=值
insert用法:insert into 表() values()或set 列=值
(也可以用很多前面学的语句来灵活删除)

复制表结构操作

#复制book表的结构,命名为copy
create table copy like book;
#如果想复制数据和结构的操作,可以搭配很操作
create table copy
select * from book

创建一个books表

#可以加一个判断来判断是否有此表
create database if not exists books;

删除一个库

#可以加一个判断来判断是否有此表
drop database if exists books;
#如果想删除一个库
drop table 表名 or truncate table 表名;

创建books库的book表

create table book(
id INT ,#编号
name_book VARCHAR(20),#图书名
price DOUBLE,#价格
author_id INT,#作者编号
pubData DATETIME #出版时间
)

修改book表的pubData

#如果是修改类型就用modify,添加用all
alte table book modify column 表里的类型
#修改列名字
alter table book change column pubData pubDatae DATETIME;
#alter 也可以添加新列
alter table book add column annual double;
#也可以进行删除操作
alter table book drop column annual;
#还可以修改表名
alter table book rename to book_s

增删改案例

案例1.将departments中的数据插入新表dept2中

create table dept2
select department_id,department_name
#可以直接的使用其他库的表
from myemployees.departments;

案例2.创建多表连接的数据库

CREATE DATABASE IF NOT EXISTS s4db65;
USE s4db65;CREATE TABLE class(
#设置标识列,用于连接外键
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR (20)
);
INSERT INTO class SET title='全栈1班';
INSERT INTO class SET title='全栈2班'; CREATE TABLE class_student(
student_id INT UNIQUE NOT NULL,
student_name VARCHAR(20),
class_id INT,
FOREIGN KEY(class_id) REFERENCES class(id)
);
INSERT INTO class_student VALUE(1,'张英杰',1);
INSERT INTO class_student VALUE(2,'马飞飞',1);
INSERT INTO class_student VALUE(3,'卢本伟',2);CREATE TABLE class_teacher(
techer_id INT UNIQUE NOT NULL,
techerid_name VARCHAR(20),
class_id INT,
FOREIGN KEY(class_id) REFERENCES class(id)
);INSERT INTO class_teacher VALUE(1,'林海峰',1);
INSERT INTO class_teacher VALUE(2,'林狗',1);
INSERT INTO class_teacher VALUE(3,'苑日天',2);
SELECT title,techerid_name,student_name,student_id
FROM class c
INNER JOIN class_teacher t
ON t.`class_id`=c.`id`
INNER JOIN class_student s
ON s.`class_id`=c.`id`;#insert还可以使用此操作来添加,这样用title来指定,id是自增就可以不用写了
insert into class(title) value('全栈3班')

(5)数据类型

1.整型
tinyint(占1字节),smallint(占2字节),mediumint(占3字节),int(占4字节),bigint(占8字节)

特点:
1.都可以设置无符号和有符号,通过unsigned设置无符号
2.如果超出了范围,会报out or range异常,插入临界值(指定3位整数写成4位则临界值为999)
3.长度可以不指定,默认会有一个长度,长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号整型

2. 浮点型
定点数:decimal(M,D)
浮点数:float(M,D),double(M,D)

特点:
1.M代表整数部位+小数部位的个数,D代表小数部位
2.如果超出范围,则同整型一致,并且插入临界值
3.M和N都可以省略,但对于定点数,M默认为10,D默认为0
4.如果精度要求较高,则优先考虑使用定点数

3.字符型
char,varchar,binary,varbinary,enum,set,text,blob

char:固定长度的字符,写法为char(M),最大长度不能超过M,其中M可以省略,默认为1
varchar:可变长度的字符,写法为varchar(M),最大长度不能超过M,其中M不可以省略

4.日期型
year 年
date 日期
time 时间
datetime 日期+时间 (占8个字节)
timestamp 日期+时间(占4个字节)
(注:timestamp容易受时区,语法模式,版本的影响,能反应当前时区时间)

(6)常见约束介绍

一.列级约束语法即案例

语法:直接在字段名和类型后面追加 约束类型即可。
只支持:默认,非空,主键,唯一
案例

#转到哪个库中
use students
#添加列级约束
create table stuinfo(#一般列级和表级约束在语句后面添加空格就能继续写多个约束条件id int PRIMARY KEY,#主键stuName VARCHAR(20) NOT NULL,#非空gender CHAR(1) CHECK(gender='男' OR gender='女'),#检查seat INT UNIQUE,#唯一age INT DEFAULT 18,#默认约束#只是举个例子,让大家明白外键是啥,实际中用表级约束即可 majorID INT REFERENCES major(id)#外键
);
create table major(id INT PRIMARY KEY,majorName VARCHAR(20)
);

二.表级约束语法即案例

语法:在各个字段的最下面
constraint 约束名 约束类型(字段名)

CREATE TABLE stuinfo(id INT,stuname VARCHAR(20),gender CHAR(1),seat INT,age INT,majorid INT,#可以不起名字,有默认名CONSTRAINT pk PRIMARY KEY(id),#主键CONSTRAINT uq UNIQUE(seat),#唯一键CONSTRAINT ck CHECK(gender='男'or gender='女'),#检查CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外键
)

三.通用的写法

CREATE TABLE IF not EXISTS stuinfo(id INT PRIMARY KEY,stuname VARCHAR(20) NOT NULL,set CHAR(1),age INT DEFAULT 18,seat INT UNIQUE,majorid INT,#外键类的类型要求一致不过名字无要求CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
)

四.标识列语法即案例
标识列又称为自增长列,可以不用手动插入值,系统默认的序列值,一个表中只有一个标识列,而且设置的标识列必须是一个key,只能是数值型

#创建时设置自增长列
create table tab_identity(字段名 字段类型 约束 auto_increment
);
#修改表时添加设置自增长列
alter table 表 modify column 字段名 类型 约束 auto_increment
#删除自增长列
alter table 表 modify column 字段名 类型 约束
#或者直接insert into tab_identity(name) values('卢本伟')
insert into tab_identity values(null,'卢本伟')
#查看自增长,自增长的起始不能改变,不过每一次插入加多少可以改变,不过改变就是全改变
show VARIABLES LIKE '%auto_increment%';
#改变步长为3
set auto_increment_increment=3;
#如果不想从1开始索引可以把初始值直接打上索引的位置
insert into tab_identity(id,name) values(10,'卢本伟')
#先执行10,再执行null就可以实现
insert into tab_identity(id,name) values(NULL,'卢本伟')
#修改表时设置标识列
insert into tab_identity modify column id int primary key auto_increment;
#修改表时删除标识列
insert into tab_identity modify column id int

五.五大约束

NOT NULL:非空,用于保证该字段的值不能为空(比如姓名,学号等)
DEFAULT:默认,用于保证该字段有默认值(比如性别)
▲PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空(比如学号,员工编号)注:一个表中只能有一个,不过可以用组合主键不过不推荐

▲UNIQUE:唯一,用于保证该字段的值具有唯一性,并且能有空,不过只能有一个空,(比如座位表)注:一个表中能有多个,也可以用组合不过不推荐
▲FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值

添加与删除约束

添加列级约束:ALTER TABLE 表名 MODIFY COLUMN 列名 类型 新约束;
添加表级约束:ALTER TABLE 表名 ADD 约束类型(列名);
删除非空约束:ALTER TABLE 表名 MODIFY COLUMN 列名 类型 NULL
(也可以直接空格不写)或
ALTER TABLE 表名 DROP 删除的约束 约束名(有一些可以不用加约束名)

级联删除:在约束后面添加 on delete cascade
(一般可以在修改表时删除一些指定的外键)
级联置空:在约束后面添加 on delete set null
(一般用于删除的外键值赋null)
举例

#在创建表的时候添加外键
create table book(bid int primary key,#主键bname varchar(20) unique not null,#唯一键非空price float default 10,#默认值btypeId int,#外键keyforeign key(btypeId) references major(id)#在创建表添加外键
)
#在修改时添加非空和删除非空
alter table 表名 modify column 字段名 字段类型 not null
alter table 表名 modify column 字段名 字段类型
#在修改时添加主键和删除主键
alter table 表名 add primary key(字段名);
alter table 表名 drop primary key;
#在修改时添加唯一和删除唯一键
alter table 表名 add unique 字段名;
alter table 表名 drop index 字段名;
#在修改的时候添加外键
ALTER TABLE book add foreign KEY(btypeId) REFERENCES major(id);
#修改时删除外键
alter table book drop foreign key(btypeId)

(7)事务控制语句

事务:事务由单独单元的一个或多个sql语句组成,再这个单元中,每个mysql语句是相互依赖的,而整个单独单元作为一个不可分割的整体,如果单元中某条sql语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有sql语句均执行成功,则事物被顺利执行。

事务的特性:
ACID
原子性:一个事务不可再分割,要么都执行要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性:一个事务的执行不受到其他事务的干扰

数据库的隔离级别:
脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。
不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新提交了该字段。之后T1再次读取同一个字段,值就不同了。
幻读:对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行。
持久性:一个事务一旦提交,则会永久的改变数据库的数据

查看事务是否打开(默认是开启):show varlables like’autocommit’
查看事务隔离级别:select @@tx_isolation;
设置隔离级别:set session | global transaction isolation level 隔离级别;
事务的隔离级别:脏读 不可重复读 幻读

read uncommitted: √ √ √
read committed: × √ √
repeatable read: × × √
serializable × × ×
mysql默认第三个
oracle默认第二个

查看存储引擎:show engines;

commit;提交事务
rollback;回滚事务
savepoint 节点名; 设置保存点

事务的语法步骤

set autocommit=0;
start transaction;#可选的
#步骤2:编写事务中的sql语句(select insert update delete)
delete from account where id=25;
#保存点命名为a
savepoint a;
delete from account where id=28;
#回滚到保存点出
rollback to a;
#最后的结果就是删除了id为25的保存了id为28的了
#truncate和delete的区别
set autocommit=0;
start transaction
#这一种是回滚查找后能得到之前没删除的结果
delete from account
#这个就算回滚也不能回到之前没删除的结果
truncate table account
rollback;

(8)视图的介绍

视图是什么?
视图是一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图的动态生成的,只保存了sql逻辑,不保存查询结果。(类似封装)

创建视图的语法:create view 视图名 as 查询语句;
修改视图语法:create or replace view as 查询语句; 视图名
或者alter view as 查询语句;

删除视图语句:drop view 视图
视图的常见使用语法:insert,update,delete,select
举个例子:查询平均工资最低的部门名和工资

#创建视图
CREATE or replace VIEW myv1
AS
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1;
#可以包装2层使用
CREATE OR REPLACE VIEW myv2
AS
SELECT d.*,myv1.`avg(salary)`
FROM myv1
INNER JOIN departments d
ON myv1.`department_id`=d.`department_id`
#修改视图
create or replace view myv2
as
select * from employees;
#或者
alter view myv2
as
select * from employees;
#删除视图
drop view myv2

具备以下特点的视图不允许更新:
1.包含以下关键字的sql语句:分组函数,distinct,group by,having,union或者union all
常量视图:
select中包含子查询
join
from一个不能更新的视图
where子句的子查询引用了from子句中的表
所以视图一般是用来查询的,而不是更新的

视图和表的对比
视图相对于表有更好的封装,能让多条语句直接执行,面向对象,且占用较小,视图一般用于查询,而表一般用于增删改查

(9)变量的介绍

系统变量
说明:变量由系统提供,不是用户定义,属于服务器层面
(系统变量分为全局变量和会话变量)
使用的语法:
1.查看所有的系统变量
show global | session variables;
(注意:global代表全局变量session或不写默认代表会话,会话即在当前用户操作,全局是在多个领域操作,不过全局不能跨重启)
2.查看满足条件部分的系统变量
show global | session variables like ‘%包含什么字符%’;

3.查看指定的某个系统变量的值
select @@global.系统变量名 或者 select session.系统变量名==(session也可以默认不写)==;

4.为某个系统变量赋值

set global | 可选(session) 系统变量名=值 或 set@@ global | 可选(session) .系统变量名=值

自定义变量
说明:变量是用户自定义的,不是由系统的
使用步骤:
声明
赋值
使用(查看,比较,运算等)
(自定义变量分为用户变量和局部变量)
(1)用户变量
作用域:针对于当前会话(连接)有效,同于会话变量的作用域
1.声明并初始化
set @用户变量名=值;或 set @用户变量名:=值; 或 select @用户变量名:=值;
(如果用select就只能用上面那种方法,因为编译器会分辨不出)
2.赋值
select 字段 into 变量名
from 表;(没有查看的表可以不写) 或

3.案例

#声明初始化
set @name='john';
set @name=100;
set @count=1;
#赋值
select count(*) into @count
from employees;
#查看
select @count

(2)局部变量
作用域:仅仅在定义begin end中才有效
(而且是只能在begin end的中的第一句在奏效)

1.声明
declare 变量名 类型;
declare 变量名 类型 default 值;
set 局部变量名= or := 值;
select @局部变量名:=值;
2.赋值
select 字段 into 局部变量名
from 表;#没有用表可以不写

(10)存储过程和函数

含义:一组预先编译好的sql语句的集合,理解成批处理语句
1.提高代码的重用性
2.简化操作
3.减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
(存储过程为2种分别为空参列表和带参列表)
存储过程与函数的区别
函数的返回只能有一次,而存储过程可以有多次

1.创建语法
create procedure 存储过程名(参数列表)
begin 存储过程体(一组合法的sql语句)
end注意:
1.参数列表包含三部分
参数模式 参数名 参数类型
举例:
in stuname varchar(20)
参数模式:
in:该参数可以作为输入,也就是该参数需要调用方传入值
out:该参数可以作为输出,也就是该参数可以作为返回值
inout:结合以上2中参数,可输出输入,需要传入值,又可以返回值
delimiter 结束标记 比如 delimiter $ 停止标记为$(注:存储过程体中每条sql语句的结尾需要分号
如果只有一条,可以省略begin end
结尾可以使用delimiter重新设置)2.调用语法
call 存储过程名(实参列表);3.删除语法
drop procedure 存储过程名(一次只能删除一个)4.查看存储过程的信息
show create procedure 存储过程名

空参列表

案例:插入到admin表中五条记录
select *from admin;
#设置结束为$
delimiter $
#创建一个空参存储
create procedure myp1()
begininsert into admin(username,'password') values('卢本伟','29'),('马飞','13'),('pdd','1')
end $
#调用
call myp1() $

带参列表

(1)创建带in模式参数的存储过程

案例1:创建存储过程实现 根据女神名,查询对应的男神信息
#创建带参列表
create procedure myp2(in beautyName varchar(20))
beginselect bo.*from boys boright join beauty b on bo.id=b.boyfriend_idwhere b.name=beautyName;
end $#如果字符集有问题就输入
set names gbk$
#调用
call myp2('uu')$案例2:创建存储过程实现,用户是否登录成功
create procedure myp3(in username varchar(20),in password varchar(20))
begin declare result int default 0;#声明并初始化#这里用个数去查找,因为账号和密码对了就会出现值就有个数1select count(*) into result#赋值from adminwhere admin.username=usernameand admin.passwoid=password;select if(result>0,'成功','失败')#使用end $
#调用账号密码
call myp3('112233','123456')$

(2)创建带out模式的存储过程

案例1:根据女神名,返回对应的男神名
create procedure myp4(in beautyName varchar(20),out boyName varchar(20))
begin#给boyName赋值,因为是out所以参数不需要指定值select bo.boyName into boyNamef#赋值from boys bo#连接inner join beauty b on bo.id = b.boyfriend_idwhere b.name=beautyName; end $
#调用
call myp4('uu',@bName)$
select @bName$

(3)创建带inout模式参数的存储过程

案例1:传入a和b两个值,最终a和b都翻倍并返回
create procedure myp5(inout a int,inout b int)
begin set a=a*2;set b=b*2;
end $set @n=20;
set @m=10;
#调用
call myp5(@n,@m)$
select @n,@m$

函数的语法

1.创建语法
delimiter $
create function 函数名(参数列表) returns 返回类型
begin declare 变量 类型 约束(default 0)#默认为0 ;函数体最后要加return 返回值
end $
2.调用语法
select 函数名(参数列表)
3.查看函数
show create function 函数;
4.删除函数
drop function 函数;

(终)流程控制结构

流程控制结构分为3种:
顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码

一.分支结构
1.if函数与elseif(只能应用与begin end中)
create function 函数名(变量名 类型) returns char
beginif 条件1 and 条件2 then return 'A';elseif  条件1 then return 'B';else return 'D';end if;
二.循环结构
分类:
while,loop,repeat#类似与编程中的while 简单死循环 do while
循环控制:
iterate 类似于 continue
leave 类似于 break 跳出1.while 语法
a:while 循环条件 do循环体;
end while a;
2.lopp语法(模拟死循环)
a:loop循环体;
end loop a;3.repeat语法
a:repeat循环体;
until 结束循环条件
end repeat a4.leave 和iterate 用法
create procedure test(in insertCount int)
begindeclare i int default 1;a:while i<insertCount DOif i>=20 then leave a;end if;set i=i+1;end while a;
end $
案例:向该表插入指定个数的,随机的字符串
drop table if exists string
create table string(id int primary key auto_increment,content varchar(20)
);
delimiter $
#创建索引
create procedure test(in insertCount int)
begindeclare i int default 1;declare str varchar(26) default 'abcdefghijklmnopqrstuvwxyz' while i <= insertCount DOset startIndex=floor(rand()*26+1);#1到26个随机set len=floor(rand()*(20-startIndex+1)+1)#1到(20-前面索引的值+1)set i=i+1;insert into string(content) values(substr(str,starIndex,len));end while;
end $

mysql学习记录一个小总结相关推荐

  1. mysql存储过程的一个小例子

    目录标题 mysql存储过程的一个小例子 mysql存储过程的一个小例子 1.首先创建一张表来供我们学习存储过程 三个字段,分别为:id.name.age 其中 id为自增字段,name与age不能为 ...

  2. MySQL学习记录 (五) ----- 存储函数、存储过程和触发器

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  3. MySQL学习记录 (三) ----- SQL数据定义语句(DDL)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  4. MySQL学习记录 (四) ----- SQL数据管理语句(DML)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  5. MySQL学习记录 (二) ----- SQL数据查询语句(DQL)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  6. MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  7. MySQL学习记录04where条件子句、联表查询、子查询

    文章目录 MySQL学习记录04where条件子句.联表查询.子查询 4.1DQL 4.2指定查询字段 4.3where条件子句 4.4联表查询 4.5分页和排序 4.6子查询 MySQL学习记录04 ...

  8. Mysql学习记录(6)

    Mysql学习记录(1) Mysql学习记录(2) Mysql学习记录(3) Mysql学习记录(4) Mysql学习记录(5) Day06 12.变量 12.1系统变量 12.1.1全局变量 12. ...

  9. EfficientNet v2网络学习记录--更小更快

    论文地址:2021 CVPR --Google <EfficientNetV2: Smaller Models and Faster Training> 亮点: 使用训练感知神经结构搜索和 ...

最新文章

  1. git切换到指定tag
  2. oracle+olh+hive,hadoop+hive+hbase的简单安装 | YallonKing
  3. leetcode55 跳跃游戏 秒杀所有答案
  4. pandas读取Excel文件
  5. 揭秘全球最大网站 Facebook 背后应用软件
  6. MonoDevelop 0.14 on Ubuntu
  7. 修正版 疯狂代码 写给WEB2.0的站长
  8. matlab程序及C语言实现一维多元离散信源熵
  9. c++和opencv小知识:openCV中convertTo的用法
  10. 强贴---不用VBA实现Excel单元格连动下拉选择
  11. 国际快递中常见的国家省份名称中英文对照表
  12. 如何关闭 Win 10 系统自动更新
  13. 机房管理系列之电话交换机
  14. JavaScript(订单的增删改)
  15. 4.3 将千克转换成磅
  16. atlas mysql怎么用,MySQL —— Atlas 使用
  17. Spring之BeanDefinition详解
  18. 一种基于改进的LeNet-5 CNN模型通过图像监控雾度的方法
  19. 关于字符串比较不能用“==”,用什么?
  20. react umi.js echars.js ie9兼容性问题

热门文章

  1. 【Python爬虫】Python request 实现壁纸爬虫 一键批量下载高清壁纸
  2. 2级计算机证书有用吗,计算机2级证书有用吗
  3. css正确居中方法,CSS居中方法
  4. 输入阻抗的仿真方法(TINA软件)
  5. 动态代理原理解析 (一):Proxy
  6. Nginx 代理 TCP协议 MySQL连接
  7. 海鸥表表带太长了怎么拆_「表带太长怎么拆」表带太长了,怎么拆解和安装?...
  8. 算法设计与分析基础 第五章谜题
  9. 多边形颜色渐变填充C语言,画并填充一个多边形
  10. Springboot项目中遇到的NullPointException