MySQL初级

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 --version

mysql --V

5、MySQL 的语法规范

1.不区分大小写,但建议关键字大写,表名、列名小写 2.每条命令最好用分号结尾 3.每条命令根据需要,可以进行缩进 或换行 4.注释
单行注释:#注释文字
单行注释:– 注释文字
多行注释:/_ 注释文字  _/

SQL 的语言分类

1
2
3
4
5
6
7
8
DQL(Data Query Language):数据查询语言
select
DML(Data Manipulate Language):数据操作语言
insertupdatedelete
DDL(Data Define Languge):数据定义语言
createdropalter
TCL(Transaction Control Language):事务控制语言
commitrollback

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,table2
where 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,table2
where 非等值的连接条件
{
and 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序字段
}

自连接

1
2
3
4
5
6
7
8
9
select 查询列表
from table t1,table t2
where 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 alias1
inner join table2 alias2
on 连接条件

特点

1、添加排序,分组,筛选

2、inner 可以省略

3、筛选条件放在 where 后,连接条件放在 on 后面,提高分离性,便于阅读

4、inner join 连接和 sql92 语法中的等值连接效果是一样的

  • 非等值连接
1
2
3
4
select e.salary, j.grade_level
from employees e
join job_grades j
on e.salary between j.lowest_sal and j.highest_sal
  • 自连接
1
2
3
4
5
eg:查询员工的名字,上级的名字
select e.last_name,m.last_name
from employees e
join employees m
on 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 alias2
on 连接条件
{
where 筛选条件
group by 分组
having 筛选后条件
}

特点:

1、外连接的查询结果为主表中的所有记录

如果从表中有和它匹配的,则显示器匹配的值

如果表中没有和他匹配的,则显示 null

外连接查询结果=内连接结果+主表中有而从表没有的记录

2、左外连接:left 左边的是主表

右外连接:right join 的右边是主表

3、左外和右外交换表顺序,可以得到相同结果

  • 全外连接(mysql 不支持): full + outer(可选)

特点:

1、全外连接=内连接+表 1 有表 2 没有+表 2 有表 1 没有

3、交叉连接

  • cross:笛卡尔乘积
1
2
3
select b.*, bo.*
from beauty b
cross join boys bo

7、子查询

1
2
3
定义:
一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询
在外面的查询语句,称为主查询或外查询

分类:

按子查询出现的位置

select 后面:仅仅支持标量子查询

from 后面:支持表子查询

*where 或 having 后面:标量子查询   列子查询     行子查询

exists 后面

结果集的行列数不同:

标量子查询(结果只有一行一列)

列子查询(结果只有一列多行)

行子查询(结果集有多行多列)

表子查询(结果集)

1
2
3
4
5
6
7
8
# 行子查询
# 查询员工编号最小并且工资最高的员工信息
select *
from employees
where (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 table2
on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by排序列表
limit 偏移,条目数

9、联合查询

引入:union 联合、合并

作用:

1、将多条查询语句的结果合并成一个结果

2、避免手动创建临时表,将多条语句查询结果联合在一起

1
2
3
4
5
6
7
语法:

select 字段|常量|表达式|函数 【from 表】 【where 条件】 unionall
select 字段|常量|表达式|函数 【from 表】 【where 条件】 unionall
select 字段|常量|表达式|函数 【from 表】 【where 条件】 unionall
.....
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 beauty
select 26,'宋茜','1196898339';
# 方法二:只能插入一行,不支持子查询
insert into 表名(字段名,...)
set 列名1=1,列名2=2,...

特点:

  1. 字段类型和值类型一致或兼容,而且一一对应
  2. 可以为空的字段,可以不用插入值,或用 null 填充
  3. 不可以为空的字段,必须插入值
  4. 字段个数和值的个数必须一致
  5. 字段可以省略,但默认所有字段,并且顺序和表中的存储顺序一致
  6. 字符型的用单引号引起来

2、修改

1、修改单表语法

1
2
3
update 表名
set 字段=新值,字段=新值
where 条件

2、修改多表语法

1
2
3
4
5
6
7
8
9
10
11
12
# sql92语法
update1 别名1,表2 别名2
set 字段=新值,字段=新值
where 连接条件
and 筛选条件

# sql99语法
update table1 alias1
inner |left | right join table2 alias2
on 连接条件
set=
where 筛选条件
1
2
3
4
5
6
# eg:修改张无忌的女朋友的手机号为114
update boys bo
inner join beauty b
on bo.id = b.boyfriend_id
set 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
from1 别名1,表2 别名2
where 连接条件
and 筛选条件;

# sql99语法
delete table1_alias, table2_alias
from table1 alias1
inner | left | right table2 alias2
on 连接条件
where 筛选条件

2、truncate 语句

1
2
# 使用时间:清空表
truncate table 表名

delete 和 truncate 的区别【面试题】

  1. truncate 不能加 where 条件,而 delete 可以加 where 条件
  2. truncate 的效率高一丢丢
  3. truncate 删除带自增长的列的表后,如果再插入数据,数据从 1 开始
    delete 删除带自增长列的表后,如果再插入数据,数据从上一次的断点处开始
  4. truncate 删除不能回滚,delete 删除可以回滚
  5. 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 copy2
select * from author;

# 3、只复制部分数据
create table copy3
select id,au_name
from author
where nation = '中国';

# 4、只复制表字段
create table copy3
select id,au_name
from author
where 1=2;

2、常见类型

  • 数值型
    • 整型:
    • 小数:
      • 定点数:最大取值范围与 double 相同,给的 decimal 的有效范围由 M 和 D 决定
        • DEC(M,D): M+2 字节
        • DECIMAL(M,D):M+2 字节
      • 浮点数
        • float: 4 字节
        • double:8 字节
  • 字符型(串数据)
    • 较短文本:
      • char
      • varchar
    • 较长文本:
      • text
      • blob(较长二进制数据)
  • 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 的影响很大
  1. M:整数位数 + 小数位数
    N:小数位数
    如果超过范围,插入临界值
  2. M,D 可省略
    默认值分别为 10,0
    float 和 double 根据插入数值的精度来缺点精度
  3. 定点型精度更高,要求插入的数值的精度较高如货币使用定点型
  4. 原则:
    所选精度越简单越好,能保存数值的类型越小越好
  5. char 和 varchar 比较
    写法        M 的意思             特点       空间消耗 效率

char     cahr(M)     最大字符数,可省略   固定长度   较高     高

varchar  varchar(M) 最大字符数,不可省略 可变长度   较低     低

  • binary 和 varbinary 类型相似

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)
  1. 主键和唯一的区别:

主键 唯一性 不允许为空 至多一个   可以组合(不推荐)

唯一 唯一性 允许为空   可以多个   可以组合(不推荐

  1. 外键:

要求在从表设置外键

从表的外键列的类型必须跟主表的类型一直或兼容,名称无要求

从表的关联列必须是一个 key,一般是主键或唯一

插入数据时,先主表再从表;删除数据时,先从表再主表

  1. 添加列级约束

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 开始,步长为 1

如果要更改起始值,手动插入值;要更改步长,修改系统设置

auto_increment_increment=步长

一个表至多有一个自增长列,仅支持数值型

必须为一个 key(mysql 要求)

七、数据库事务

  • 含义:通过一组逻辑操作单元(一组 DML——sql 语句),将数据从一种状态切换到另外一种状态

特点:ACID)

原子性(Atomicity):要么都执行,要么都回滚

一致性(Consistency):保证数据的状态操作前和操作后保持一致

隔离性(Lsolation):多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰

持久性(Durability):一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改

1
2
3
4
相关步骤:
1. 开启事务
2. 编写事务的一组逻辑操作单元(多条sql语句)
3. 提交事务或回滚事务
1
show engines # 查看存储引擎

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_UNCOMMITTEDYYYYY
READ_COMMITTEDNYYNY
REPEATABLE_READ:一把行锁NNYNY
SERIALIZABLE:表锁NNNYY
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 完全相同 占用,保存实际数据 增删改查

视图的好处:

  1. sql 语句实现了封装性,提高重用性,效率高
  2. 和表实现了分离,提高了安全性
  3. 保护数据,提高安全性
  4. 简化复杂 sql,不必知道其查询细节

1、视图的创建

1
2
3
4
5
CREATE VIEW  视图名
AS
select stuName,majorId;
from stuinfo s
inner 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_v7
AS
SELECT last_name FROM employees
WHERE employee_id100;

#方式二:
ALTER VIEW test_v7
AS
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 ENDBEGIN 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
情况一:类似于switch
case 表达式
when1 then 结果1或语句1(如果是语句,需要加分号)
when2 then 结果2或语句2(如果是语句,需要加分号)
...
else 结果n或语句n(如果是语句,需要加分号)
endcase】(如果是放在begin end中需要加上case,如果放在select后面不需要)

情况二:类似于多重if
case
when 条件1 then 结果1或语句1(如果是语句,需要加分号)
when 条件2 then 结果2或语句2(如果是语句,需要加分号)
...
else 结果n或语句n(如果是语句,需要加分号)
endcase】(如果是放在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 语句,跳出所在循环!!!

  • 已看完 p-166

MySQL初级
https://polarisink.github.io/20220813/yuque/MySQL初级/
作者
Areis
发布于
2022年8月13日
许可协议