MySQL 基础知识
一、数据库相关概念 1、数据库的好处 1.持久化数据到本地 2.可以实现结构化查询,方便管理 2、数据库相关概念 1、DB:数据库,保存一组有组织的数据的容器 2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理 DB 中的数据 3、SQL:结构化查询语言,用于和 DBMS 通信的语言 3、数据库存储数据的特点 1、将数据放到表中,表再放到库中 2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。 3、表具有一些特性,这些特性定义了数据在表中如何存储,类似 java 中 “类”的设计。 4、表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似 java 中的”属性” 5、表中的数据是按行存储的,每一行类似于 java 中的“对象”。 二、初始化 MYSQL 1、MySQL 产品的介绍和安装 2、MySQL 服务的启动和停止 1 2 3 4 方式一:计算机——右击管理——服务 方式二:通过管理员身份运行 net start 服务名(启动服务) net stop 服务名(停止服务)
3、MySQL 服务的登录和退出 1 2 3 4 5 6 7 8 9 方式一:通过mysql自带的客户端 只限于root用户 方式二:通过windows自带的客户端 登录: mysql 【- h主机名 - P端口号 】- u用户名 - p密码 退出: exit或ctrl+ C
4、MySQL 的常见命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1. 查看当前所有的数据库show databases;2. 打开指定的库 use 库名3. 查看当前库的所有表show tables;4. 查看其它库的所有表show tables from 库名;5. 创建表create table 表名( 列名 列类型, 列名 列类型, 。。。 );6. 查看表结构desc 表名;
1 2 3 4 5 6 7 7. 查看服务器的版本 方式一:登录到mysql服务端select version(); 方式二:没有登录到mysql服务端 mysql 或 mysql
5、MySQL 的语法规范 1.不区分大小写,但建议关键字大写,表名、列名小写 2.每条命令最好用分号结尾 3.每条命令根据需要,可以进行缩进 或换行 4.注释 单行注释:#注释文字 单行注释:– 注释文字 多行注释:/_ 注释文字 _/
SQL 的语言分类 1 2 3 4 5 6 7 8 DQL(Data Query Language ):数据查询语言 select DML(Data Manipulate Language ):数据操作语言 insert 、update 、delete DDL(Data Define Languge):数据定义语言 create 、drop 、alter TCL(Transaction Control Language ):事务控制语言 commit 、rollback
SQL 的常见命令 1 2 3 4 5 6 7 8 9 10 11 show databases; 查看所有的数据库 use 库名; 打开指定 的库show tables ; 显示库中的所有表show tables from 库名;显示指定库中的所有表create table 表名( 字段名 字段类型, 字段名 字段类型 ); 创建表desc 表名; 查看指定表的结构select * from 表名;显示表中的所有数据
五、DQL 语言的学习 1、基础查询 1 2 3 4 5 6 7 8 语法:SELECT 要查询的东西 【FROM 表名】; 类似于Java中 :System.out.println(要打印的东西); 特点: 通过select 查询完的结果 ,是一个虚拟的表格,不是真实存在 要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数
2、条件查询 条件查询:根据条件过滤原始表的数据,查询到想要的数据
语法:
1 2 3 4 5 6 select 要查询的字段| 表达式| 常量值| 函数from 表where 条件 ;
1、条件表达式 示例:salary>10000 条件运算符:
< >= <= = != <>
2、逻辑表达式 示例:salary>10000 && salary<20000
逻辑运算符:
and(&&):两个条件如果同时成立,结果为 true,否则为 false or(||):两个条件只要有一个成立,结果为 true,否则为 false not(!):如果条件成立,则 not 后为 false,否则为 true
3、模糊查询 示例:last_name like ‘a%’
3、排序查询 1 2 3 4 5 6 7 8 9 语法:select 要查询的东西from 表where 条件order by 排序的字段| 表达式| 函数| 别名 【asc | desc 】
4、常见函数 1、单行函数 1、字符函数 concat 拼接 substr 截取子串 upper 转换成大写 lower 转换成小写 trim 去前后指定的空格和字符 ltrim 去左边空格 rtrim 去右边空格 replace 替换 lpad 左填充 rpad 右填充 instr 返回子串第一次出现的索引 length 获取字节个数 2、数学函数 round 四舍五入 rand 随机数 floor 向下取整 ceil 向上取整 mod 取余 truncate 截断 3、日期函数 now 当前系统日期+时间 curdate 当前系统日期 curtime 当前系统时间 str_to_date 将字符转换成日期 date_format 将日期转换成字符 4、流程控制函数 if 处理双分支:if(表达式 1,表达式 2,表达式 3):即三目运算符 case 语句:处理多分支 case 变量或表达式 when 常量 1 then 值 1 when 常量 2 then 值 2 when 常量 3 then 值 4 …
5、其他函数 version 版本 database 当前库 user 当前连接用户 password(‘字符’):返回该字符的加密形式 md5(‘字符):md5 加密 2、分组函数 sum 求和 max 最大值 min 最小值 avg 平均值 count 计数 特点:
1、以上五个分组函数都忽略 null 值,除了 count(*)
2、sum 和 avg 一般用于处理数值型 max、min、count 可以处理任何数据类型
3、都可以搭配 distinct 使用,用于统计去重后的结果
4、count 的参数可以支持:必须非空 字段、*、常量值,一般放 1、
效率上: MyISAM:count()最高 InnoDB:count( ) & count(1) > count(字段) 6、和分组函数一同查询的字段,要求是 group by 后出现的字段
5、分组查询 where 筛选条件 group by 分组的字段 having 分组后的筛选 order by 排序列表 特点:
1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、分组筛选 针对的表 位置 关键字 分组前筛选: 原始表 group by 的前面 where 分组后筛选: 分组后的结果集 group by 的后面 having
4、可以按多个字段分组,字段之间用逗号隔开
5、可以支持排序
6、having 后可以支持别名
6、多表连接查询 笛卡尔乘积:如果连接条件省略或无效则会出现,导致多个表所有行完全连接
解决办法:添加上有效连接条件
1、sql92 等值连接 1 2 3 4 5 6 7 8 9 select 查询列表from table1,table2where table1.key1 = table2.key2 {and 筛选条件group by 分组字段having 分组后的筛选order by 排序字段 }
特点:
1、一般为表起别名,简化 sql
2、n 表连接至少需要 n-1 个有效连接条件
3、多表顺序可以调换
4、等值连接的结果是多表的交集部分
非等值连接 1 2 3 4 5 6 7 8 9 select 查询列表from table1,table2where 非等值的连接条件 {and 筛选条件group by 分组字段having 分组后的筛选order by 排序字段 }
自连接 1 2 3 4 5 6 7 8 9 select 查询列表from table t1,table t2where table1.key1 = table2.key2 {and 筛选条件group by 分组字段having 分组后的筛选order by 排序字段 }
t1 和 t2 都是一样的表,只是为了方便
部分外连接(oracle、sqlserver) 2、sql99(推荐使用) sql92 和 sql99 对比
给你:sql99 功能更多
可读性:sql99 实现连接条件和筛选条件的分离,可读性更好
1、内连接 1 2 3 4 select 查询列表from table1 alias1inner join table2 alias2on 连接条件
特点
1、添加排序,分组,筛选
2、inner 可以省略
3、筛选条件放在 where 后,连接条件放在 on 后面,提高分离性,便于阅读
4、inner join 连接和 sql92 语法中的等值连接效果是一样的
1 2 3 4 select e.salary, j.grade_levelfrom employees ejoin job_grades jon e.salary between j.lowest_sal and j.highest_sal
1 2 3 4 5 eg:查询员工的名字,上级的名字select e.last_name,m.last_namefrom employees ejoin employees mon e.manager_id = m.employee_id
2、外连接 结果= 主表中所有的行,其中从表和他匹配的将现实匹配行,如果从表没有匹配的则显示 null left:左边的就是主表,right:右边的就是主表
左外连接:left + outer(可选) 右外连接:right + outer(可选) 1 2 3 4 5 6 7 8 9 select 查询列表from table1 alias1 [连接类型:left / right / full + outer (可选)]join table2 alias2on 连接条件 {where 筛选条件group by 分组having 筛选后条件 }
特点:
1、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示器匹配的值
如果表中没有和他匹配的,则显示 null
外连接查询结果=内连接结果+主表中有而从表没有的记录
2、左外连接:left 左边的是主表
右外连接:right join 的右边是主表
3、左外和右外交换表顺序,可以得到相同结果
全外连接(mysql 不支持): full + outer(可选) 特点:
1、全外连接=内连接+表 1 有表 2 没有+表 2 有表 1 没有
3、交叉连接 1 2 3 select b.* , bo.* from beauty bcross join boys bo
7、子查询 1 2 3 定义: 一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询 在外面的查询语句,称为主查询或外查询
分类:
按子查询出现的位置
select 后面:仅仅支持标量子查询
from 后面:支持表子查询
*where 或 having 后面:标量子查询 列子查询 行子查询
exists 后面
结果集的行列数不同:
标量子查询(结果只有一行一列)
列子查询(结果只有一列多行)
行子查询(结果集有多行多列)
表子查询(结果集)
1 2 3 4 5 6 7 8 # 行子查询 # 查询员工编号最小并且工资最高的员工信息select * from employeeswhere (employee_id, salary) = ( select MIN (employee_id), MAX (salary) from employees );
1 2 3 4 5 6 7 # 查询每个部门的员工个数select d.* ,( select count (* ) from employees e where e.department_id = d.department_id ) 个数from departments d
where 或 having 后面的特点:
1、子查询都放在小括号内
2、子查询可以放在 from 后面、select 后面、where 后面、having 后面,但一般放在条件的右侧
3、子查询优先于主查询执行,主查询使用了子查询的执行结果
4、子查询根据查询结果的行数不同分为以下两类:
单行子查询
结果集只有一行
一般搭配单行操作符使用:> < = <> >= <=
非法使用子查询的情况:
a、子查询的结果为一组值
b、子查询的结果为空 多行子查询
结果集有多行
一般搭配多行操作符使用:any、all、in、not in
in/not in: 属于子查询结果中的任意一个就行
all:和子查询返回的所有值比较
any|some:和子查询返回的某一个值比较
8、分页查询 应用场景:- 实际的 web 项目中需要根据用户的需求提交对应的分页查询的 sql 语句 1、语法: 1 2 3 4 5 6 7 select 字段| 表达式,...from 表 【where 条件】 【group by 分组字段】 【having 条件】 【order by 排序的字段】 limit 【起始的条目索引,】条目数;
特点:
1.起始条目索引从 0 开始
2.limit 子句放在查询语句的最后
3.公式:select _ from 表 limit (page-1)_sizePerPage,sizePerPage 假如: 每页显示条目数 sizePerPage
要显示的页数 page
1 2 3 4 5 6 7 8 9 10 # 查询语句中所有的关键字顺序select 查询列表from table1 连接类型 join table2on 连接条件where 筛选条件group by 分组列表having 分组后的筛选order by 排序列表 limit 偏移,条目数
9、联合查询 引入:union 联合、合并
作用:
1、将多条查询语句的结果合并成一个结果
2、避免手动创建临时表,将多条语句查询结果联合在一起
1 2 3 4 5 6 7 语法: select 字段| 常量| 表达式| 函数 【from 表】 【where 条件】 union 【all 】 select 字段| 常量| 表达式| 函数 【from 表】 【where 条件】 union 【all 】 select 字段| 常量| 表达式| 函数 【from 表】 【where 条件】 union 【all 】 ..... select 字段| 常量| 表达式| 函数 【from 表】 【where 条件】
特点:
1、多条查询语句的查询的列数必须是一致的
2、多条查询语句的查询的列的类型几乎相同
3、union 代表去重,union all 代表不去重
六、DML 语言的学习 1、插入 1 2 3 4 5 6 7 8 9 10 11 # 语法: # 方法一 # 可以插入多行insert into 表名(字段名,...)values (值1 ,...),(值2. ..),(值3. ..); # 支持子查询insert into beautyselect 26 ,'宋茜' ,'1196898339' ; # 方法二:只能插入一行,不支持子查询insert into 表名(字段名,...)set 列名1 = 值1 ,列名2 = 值2 ,...
特点:
字段类型和值类型一致或兼容,而且一一对应 可以为空的字段,可以不用插入值,或用 null 填充 不可以为空的字段,必须插入值 字段个数和值的个数必须一致 字段可以省略,但默认所有字段,并且顺序和表中的存储顺序一致 字符型的用单引号引起来 2、修改 1、修改单表语法 1 2 3 update 表名set 字段= 新值,字段= 新值where 条件
2、修改多表语法 1 2 3 4 5 6 7 8 9 10 11 12 # sql92语法update 表1 别名1 ,表2 别名2 set 字段= 新值,字段= 新值where 连接条件and 筛选条件 # sql99语法update table1 alias1inner | left | right join table2 alias2on 连接条件set 列= 值where 筛选条件
1 2 3 4 5 6 # eg:修改张无忌的女朋友的手机号为114 update boys boinner join beauty bon bo.id = b.boyfriend_idset b.phone = '114' where bo.boyName = '张无忌'
3、删除 1、delete 语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 单表的删除:delete from 表名where 筛选条件 # 多表的删除: # sql92语法delete 别名1 ,别名2 from 表1 别名1 ,表2 别名2 where 连接条件and 筛选条件; # sql99语法delete table1_alias, table2_aliasfrom table1 alias1inner | left | right table2 alias2on 连接条件where 筛选条件
2、truncate 语句 1 2 # 使用时间:清空表truncate table 表名
delete 和 truncate 的区别【面试题】
truncate 不能加 where 条件,而 delete 可以加 where 条件 truncate 的效率高一丢丢 truncate 删除带自增长的列的表后,如果再插入数据,数据从 1 开始 delete 删除带自增长列的表后,如果再插入数据,数据从上一次的断点处开始 truncate 删除不能回滚,delete 删除可以回滚 truncate 删除没有返回值,delete 删除有返回值 3、DDL 语句 1、库和表的管理 1 2 3 4 5 # 库的管理: # 1 、创建库create database 库名 # 2 、删除库drop database 库名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 表的管理: # 1 、创建表CREATE TABLE IF NOT EXISTS stuinfo( stuId INT , stuName VARCHAR (20 ), gender CHAR , bornDate DATETIME ); # 查看表结构DESC studentinfo; # 2 、修改表 alter ALTER TABLE 表名 ADD | MODIFY| DROP | CHANGE COLUMN 字段名 【字段类型】; # 修改字段名ALTER TABLE studentinfo CHANGE COLUMN sex gender CHAR ; # 修改表名ALTER TABLE stuinfo RENAME [TO ] studentinfo; # 修改字段类型和列级约束ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ; # 添加字段ALTER TABLE studentinfo ADD COLUMN email VARCHAR (20 ) first ; # 删除字段ALTER TABLE studentinfo DROP COLUMN email; # 3 、删除表DROP TABLE [IF EXISTS ] studentinfo; # 4 、表的复制 # 1 、仅复制表结构create table copy like author # 2 、复制表结构和数据create table copy2select * from author; # 3 、只复制部分数据create table copy3select id,au_namefrom authorwhere nation = '中国' ; # 4 、只复制表字段create table copy3select id,au_namefrom authorwhere 1 = 2 ;
2、常见类型 数值型整型: 小数:定点数:最大取值范围与 double 相同,给的 decimal 的有效范围由 M 和 D 决定DEC(M,D): M+2 字节 DECIMAL(M,D):M+2 字节 浮点数 字符型(串数据) Enum 型:枚举类型,插入值必须是列表中指定值之一列表成员为 1 ~ 255,需要 1 个字节存储 列表成员为 255 ~ 65535,需要 2 个字节存储 Set 类型:可以保存 0 ~ 64 个成员与 set 区别:set 一次可选取多个成员,enum 一次只能选一个 (成员数,字节数)=(18,1),(916,2),(1724,3),(2532,4),(3364,8),(18,1), 日期型 字节数 最小值 最大值date 4 1000-01-01 9999-12-31 datetime 8 1000-01-01 00:00:00 9999-12-31 23:59:59 timestamp 4 19700101080001 2038 年某时刻 time 3 -838:59:59 838:59:59 year 1 1901 2155 timestamp 和实际时区有关,更能反映实际日期,datetime 反映插入式的当地时区 timestamp 的属性受 mysql 版本和 sqlmode 的影响很大 M:整数位数 + 小数位数 N:小数位数 如果超过范围,插入临界值 M,D 可省略 默认值分别为 10,0 float 和 double 根据插入数值的精度来缺点精度 定点型精度更高,要求插入的数值的精度较高如货币使用定点型 原则: 所选精度越简单越好,能保存数值的类型越小越好 char 和 varchar 比较 写法 M 的意思 特点 空间消耗 效率 char cahr(M) 最大字符数,可省略 固定长度 较高 高
varchar varchar(M) 最大字符数,不可省略 可变长度 较低 低
3、常见约束 1、基本约束 NOT NULL:非空 DEFAULT:默认值,比如性别 UNIQUE:唯一性,可以为空 CHECK:检查约束,mysql 不支持 PRIMARY KEY:主键,保证该字段唯一性 FOREIGN KEY:外键,限制两个表的关系,保证该字段的值必须来自于主表关联列的值, 在从表添加外键约束,用于引用主表中某列的值 eg:学生专业编号,员工表部门编号,员工表工种编号 2、约束详解 添加约束的时机 约束添加分类列级约束六大约束都支持,但外键没有效果,除了外键都支持,不可以起约束名。可以追加多个,中间逗号隔开,没有顺序要求 表级约束除了 not null,default,其他的都支持,可以起约束名,对主键无效 3、约束添加例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 # 添加表级约束create database if not exists students; use studemts;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 ) ); # 添加表级约束create table stuinfo( id int , stuName varchar (20 ), gender char (1 ), seat int , age int default 18 , majorId int , constraint pk primary key (id), constraint uq unique (seat), constraint ck check ( gender = '男' or gender = '女' ), constraint fk foreign key (majorId) references major(id) ) # 通用写法create table if not exists stuinfo( id int primary key , stuName varchar (20 ) not null , gender char (1 ), age int default 18 , seat int unique , majorId int , constraint fk_stuinfo_major foreign key (majorId) references major(id)
主键和唯一的区别: 主键 唯一性 不允许为空 至多一个 可以组合(不推荐)
唯一 唯一性 允许为空 可以多个 可以组合(不推荐
外键: 要求在从表设置外键
从表的外键列的类型必须跟主表的类型一直或兼容,名称无要求
从表的关联列必须是一个 key,一般是主键或唯一
插入数据时,先主表再从表;删除数据时,先从表再主表
添加列级约束 alter table tableName modify column 字段名 字段类型 新约束
添加表级约束
alter table 表名 add constraint 约束名 约束类型(字段名) 外键的引用
1 2 3 4 5 6 7 # 创建表时设置自增create table table1( int id auto_increment ) # 修改表时设置自增长列alter table table1 modify column 字段名 字段类型 约束 auto_increment
自增长列 不用手动插入值,可以自动提供序列值,默认从 1 开始,步长为 1
如果要更改起始值,手动插入值;要更改步长,修改系统设置
auto_increment_increment=步长
一个表至多有一个自增长列,仅支持数值型
必须为一个 key(mysql 要求)
七、数据库事务 含义:通过一组逻辑操作单元(一组 DML——sql 语句),将数据从一种状态切换到另外一种状态 特点:ACID)
原子性(Atomicity):要么都执行,要么都回滚
一致性(Consistency):保证数据的状态操作前和操作后保持一致
隔离性(Lsolation):多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰
持久性(Durability):一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改
1 2 3 4 相关步骤: 1. 开启事务 2. 编写事务的一组逻辑操作单元(多条sql语句) 3. 提交事务或回滚事务
1、事务的分类: 1、隐式事务:没有明显的开启和结束事务的标志 insert、update、delete 语句本身就是一个事务 2、显式事务:具有明显的开启和结束事务的标志 1 2 3 4 5 6 7 8 9 10 11 12 # 1 、开启事务set autocommit = 0 ;# 取消自动提交事务的功能start transaction;# 可选的 # 2 、编写事务的一组逻辑操作单元(多条sql 语句) # 仅增删改查insert update delete truncate 不支持rollback 3. 提交事务或回滚事务,两者选一commit ; # 提交rollback ; # 回滚
###使用到的关键字
set autocommit=0; start transaction; commit; rollback;
savepoint 断点 commit to 断点 rollback to 断点
3、事务的隔离级别: 事务并发问题如何发生?
当多个事务同时操作同一个数据库的相同数据时
事务的并发问题有哪些?
脏读:一个事务读取到 了另外一个事务未提交的数据
不可重复读:同一个事务中,多次读取到的数据不一致
幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据
1 2 3 4 5 # 如何避免事务的并发问题? # 设置隔离级别:set session| global transaction isolation level 隔离级别名; # 查看隔离级别:select @@transaction _isolation;
脏读 不可重复读 幻读 ORACLE 支持 MYSQL 支持 READ_UNCOMMITTED Y Y Y Y Y READ_COMMITTED N Y Y N Y REPEATABLE_READ:一把行锁 N N Y N Y SERIALIZABLE:表锁 N N N Y Y
1 2 3 4 5 6 7 8 9 # savepoint 的使用set autocommit = 0 ;start transaction ;delete from account where id = 25 ; # 设置保存点savepoint a;delete from account where id = 20 ; # 回滚到保存点rollback to a;
八、视图 理解成一张虚拟的表,mysql-5.0.1 新特性
1 2 3 4 视图和表的区别: 关键字 使用方式 占用物理空间 使用 视图 view 完全相同 不占用,仅仅保存的是sql逻辑 一般用于查询 表 table 完全相同 占用,保存实际数据 增删改查
视图的好处:
sql 语句实现了封装性,提高重用性,效率高 和表实现了分离,提高了安全性 保护数据,提高安全性 简化复杂 sql,不必知道其查询细节 1、视图的创建 1 2 3 4 5 CREATE VIEW 视图名AS select stuName,majorId;from stuinfo sinner join major m on s.majorId = m.id
2、视图的增删改查 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 1 、查看视图的数据 ★SELECT * FROM my_v4;SELECT * FROM my_v1 WHERE last_name= 'Partners' ; # 2 、插入视图的数据INSERT INTO my_v4(last_name,department_id) VALUES ('虚竹' ,90 ); # 3 、修改视图的数据UPDATE my_v4 SET last_name = '梦姑' WHERE last_name= '虚竹' ; # 4 、删除视图的数据DELETE FROM my_v4; # 5 、视图结构的查看DESC test_v7;SHOW CREATE VIEW test_v7;
3、某些视图不能更新 1 2 3 4 5 6 7 包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all 常量视图 Select中包含子查询 join from一个不能更新的视图 where子句的子查询引用了from子句中的表 用到了不可更新的视图
4、视图逻辑的更新 1 2 3 4 5 6 7 8 9 10 11 #方式一:CREATE OR REPLACE VIEW test_v7AS SELECT last_name FROM employeesWHERE employee_id100; #方式二:ALTER VIEW test_v7AS SELECT employee_id FROM employees;SELECT * FROM test_v7;
九、变量 1、变量分类 系统变量全局变量:针对于所有会话(连接)有效,但不能跨重启 会话变量:针对于当前会话(连接)有效 自定义变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 # 系统变量 # 1 、查看所有系统变量show global | session(default ) variables; # 2 、查看满足条件的变量show global | session variables like 'char' ; # 3 、查看某个具体的变量select @@系统变量名 # 4 、为某个系统变量赋值set global | session 系统变量名 = 值set @@global | session.系统变量名 = 值 # 自定义变量 # 用户变量 # 声明并初始化:SET @变量名= 值;SET @变量名:= 值;SELECT @变量名:= 值; # 赋值 # 方式一:一般用于赋简单的值SET 变量名= 值;SET 变量名:= 值;SELECT 变量名:= 值; # 方式二:一般用于赋表 中的字段值SELECT 字段名或表达式 INTO 变量FROM 表; # 使用:select @变量名; # 局部变量 # 声明:declare 变量名 类型 【default 值】; # 赋值: # 方式一:一般用于赋简单的值SET 变量名= 值;SET 变量名:= 值;SELECT 变量名:= 值; # 方式二:一般用于赋表 中的字段值SELECT 字段名或表达式 INTO 变量FROM 表; # 使用: select 变量名 作用域 定义位置 语法 用户变量 当前会话 会话的任何地方 加@符号,不用指定类型 局部变量 定义它的BEGIN END 中 BEGIN END 的第一句话 一般不用加@,需要指定类型
十、存储过程和函数 存储过程 含义:一组经过预先编译的 sql 语句的集合,类似于 java 的方法
1 2 3 4 5 好处: 1、提高了sql语句的重用性,减少了开发程序员的压力 2、提高了效率 3、减少了传输次数
分类 1、无返回无参 2、仅仅带 in 类型,无返回有参 3、仅仅带 out 类型,有返回无参 4、既带 in 又带 out,有返回有参 5、带 inout,有返回有参 注意:in、out、inout 都可以在一个存储过程中带多个 创建存储过程 1 2 3 4 create procedure 存储过程名(in | out | inout 参数名 参数类型,...)begin 存储过程体end
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 类似于方法: 修饰符 返回类型 方法名(参数类型 参数名,...){ 方法体; } 注意 1、需要设置新的结束标记 delimiter 新的结束标记 示例: delimiter $ CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...) BEGIN sql语句1; sql语句2; END $ 2、存储过程体中可以有多条sql语句,每条末尾必须加;如果仅仅一条sql语句,则可以省略begin end 3、参数前面的符号的意思 in:该参数只能作为输入 (该参数不能做返回值) out:该参数只能作为输出(该参数只能做返回值) inout:既能做输入又能做输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # 创建存储过程 delimiter $create procedure mypl()begin insert into admin(username, password) values ('john1' ,'lqs' ),('john1' ,'lqs' ),('john1' ,'lqs' ),('john1' ,'lqs' );end $call mypl()$select * from admin$ # 创建带in 模式参数带存储过程 delimiter $create procedure myp2(in beauty varchar (20 ))begin select bo.* from boys bo right join beauty b on bo.id = b.boyfriend_id where b.name = beautyName;end $call myp2('小昭' )create procedure myp3(in username varchar (20 ), in password varchar (20 ))begin declare result varchar (20 ) default '' ; # 声明并初始化 select count (* ) into result from admin where admin.username = username and admin.password = password select result ;end $
函数 学过的函数:LENGTH、SUBSTR、CONCAT 等
1 2 3 4 5 6 7 # 创建函数CREATE FUNCTION 函数名(参数名 参数类型,...) RETURNS 返回类型BEGIN 函数体END ###调用函数SELECT 函数名(实参列表)
函数和存储过程的区别 关键字 调用语法 返回值 应用场景 函数 FUNCTION SELECT 函数() 只能是一个 一般用于查询结果为一个值并返回时,当有返回值而且仅仅一个 存储过程 PROCEDURE CALL 存储过程() 可以有 0 个或多个 一般用于更新
流程控制结构 ###分支 一、if 函数 语法:if(条件,值 1,值 2) 特点:可以用在任何位置
二、case 语句
语法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 情况一:类似于switchcase 表达式when 值1 then 结果1 或语句1 (如果是语句,需要加分号)when 值2 then 结果2 或语句2 (如果是语句,需要加分号) ...else 结果n或语句n(如果是语句,需要加分号)end 【case 】(如果是放在begin end 中需要加上case ,如果放在select 后面不需要) 情况二:类似于多重ifcase when 条件1 then 结果1 或语句1 (如果是语句,需要加分号)when 条件2 then 结果2 或语句2 (如果是语句,需要加分号) ...else 结果n或语句n(如果是语句,需要加分号)end 【case 】(如果是放在begin end 中需要加上case ,如果放在select 后面不需要)
特点: 可以用在任何位置
三、if elseif 语句
语法:
if 情况 1 then 语句 1; elseif 情况 2 then 语句 2; … else 语句 n; end if; 特点: 只能用在 begin end 中!!!!!!!!!!!!!!! 三者比较: 应用场合 if 函数 简单双分支 case 结构 等值判断 的多分支 if 结构 区间判断 的多分支 ###循环
语法: 【标签:】WHILE 循环条件 DO 循环体 END WHILE 【标签】;
特点: 只能放在 BEGIN END 里面 如果要搭配 leave 跳转语句,需要使用标签,否则可以不用标签 leave 类似于 java 中的 break 语句,跳出所在循环!!!