You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
int 后面()中的数字,不代表占用空间容量。而代表最小显示位数。这个东西基本没有意义,除非你对字段指定 zerofill。mysql 会自动分配长度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。所以,建议在使用时,就用这些默认的显示长度就可以了。不用再去自己填长度(比如:int(10)、tinyint(1)之类的基本没用)。
浮点型
类型
字节
范围
用途
float(M,D)
4
23bit(约 6~7位 10进制数字)
单精度浮点数 值绝对能保证精度为 6~7位有效数字
double(M,D)
8
52bit(约 15~16位10 进制数字)
双精度浮点数值 精度为15~16位有效数字
decimal(M,D)
M+2
依赖于 M 和 D的值
定点型
M(精度),代表总长度(整数位和小数位)限制
D(标度),代表小数位的长度限制。
M 必需大于等于 D
单条修改
update 表名 set xx=xx,xxx=xx where xxx=xxx and xxx=xxx;
#多条修改update students
set name = case id # id 字段
when 1 then 'zhangsan'
when 2 then 'lisi'
when 3 then 'wangwu'
when 4 then 'zhaoliu'
end,
city = case id
when 1 then '2'
when 2 then '4'
when 3 then '1'
when 4 then '2'
end
where id in (1,2,3,4);
# 字段用','隔开,至少有一个字段,最终结果集按照这个这个顺序显示select 字段 1,字段 2... from 表名;
# *代表所有字段select*from 表名;
distinct(去重复)
# 去重后的结果,distinct 必须紧接在 select 后面select distinct 字段 from 表名;
# 统计不重复的个数selectcount(distinct 字段) from 表名;
where 子句
where子句适用于对记录的 删、改、查 操作
对记录进行过滤,如果没有指定 where子句,则显示所有记录
在 where表达式中,可以使用函数或运算符,运算符包括如下表:
类型
运算符
算术
+ - * / %
比较
> < >= <= != =
逻辑
or
提升优先级
( )
# 搜索 id<20的所以数据select*from students where id<20;
# 搜索 id 编号为偶数的数据select*from students where id%2=0;
where 条件关键字:
in : 查询一个集合的数据
# 搜索 id 在(1,3,7)之中的数据select*from students where id=1|| id=3|| id=7;
select*from students where id in(1,3,7);
# 一次删除多条记录deletefrom students where id=3|| id=15|| id=23;
deletefrom students where id in(3,15,23);
between...and...: 查询一个区间的数据
# 搜索 id 在 20-40之间的数据select*from students where id>20 && id<40;
select*from students where id between 20and40;
# 删除 id 在 20-40之间的数据deletefrom students where id between 20and40;
not : 排除
# 搜索 id 除了 20-40之间的数据select*from students where id not between 30and40;
like 子句
用于模糊查询 %:任意字符长度 _ :一个字符长度
# 搜索 name名字以 5 结尾的数据select*from students where name like'张%';
# 搜索 name名字包含字母 s 的数据select*from students where name like'%二%';
# 搜索 id 以 5结尾的两位数 数据select*from students where id like'_5';
limit 子句
控制查询记录条数,数据表中的记录,从 索引从 0 开始
select*from students limit2# 返回两条记录select*from students limit3,4# 从索引为 3的记录开始,返回 4条记录# php中的分页功能,偏移值的计算:(当前页-1) * 每页记录数select name from student limit4 offset 3# 还可以使用 offset(偏移):从索引为 3的记录开始,返回 4 条
group by (结果分组)
根据 给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表利用 group by分组信息进行统计,常见的是配合 max 等聚合函数筛选数据后分析。
select 指定的字段要么作为分组的依据(Group By 语句的后面),要么就要被包含在聚合函数中。
# 简单分组select sex from students group by sex;
+-----+
| sex |
+-----+
| m |
| w |
+-----+# 聚合函数分组selectcount(*),city from students group by city;
+----------+----------+
| count(*) | livecity |
+----------+----------+# 结果
| 7 | 1 |
| 8 | 2 |
| 1 | 3 |
| 3 | 4 |
| 2 | 5 |
+----------+----------+
CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE conditi
on;
参数说明:
viewname 为欲创建的视图名
columnname(s)为查询的列名
table_name 为查询的表名
condition 为查询条件。
修改视图
# ALTER 语句:ALTERVIEW view_name ASSELECT column_name(s) FROM table_name WHERE c
ondition;
# CREATE OR REPLACE 语句:ALTERVIEW view_name ASSELECT column_name(s) FROM table_name WHERE c
ondition;
删除视图
DROPview_name;
查询视图
SHOW TABLES;
SHOW TABLE STATUS;
这两个命令不仅可以显示表名及表信息,而且会显示出所有视图名称及视图信息。除此之外,使用 SHOW CREATE VIEW 命令可以查看某个视图的定义,格式如下:
RANGE分区:
RANGE即范围分区,根据区间来判断位于哪个分区。这些区间要连续且不能相互重叠,使用 VALUES LESS THAN 操作符来进行定义。
createtabletest(
id int DEFAULT null,
name char(30),
datedata date
)
PARTITION BY RANGE (year(datedata)) (
PARTITION part1 VALUES LESS THAN (1990) ,
PARTITION part2 VALUES LESS THAN (1995) ,
PARTITION part3 VALUES LESS THAN (2000) ,
PARTITION part4 VALUES LESS THAN MAXVALUE );
LIST 分区:
LIST 分区类似于按 RANGE 分区,区别在于 LIST 分区是基于列值匹配一个离
散值集合中的某个值来进行选择。
createtabletest1(
id intnot null,
name char(30),
career VARCHAR(30)
)
PARTITION BY LIST (id) (
PARTITION part0 VALUESIN (1,5) ,
PARTITION part1 VALUESIN (11,15) ,
PARTITION part2 VALUESIN (6,10) ,
PARTITION part3 VALUESIN (16,20)
);
CREATEtriggertri_stuInsert after insert
on student for each row
BEGIN
declare c int;
set c = (select stuCount from class where classID=new.classID);
update class set stuCount = c +1where classID =new.classID;
END
从需求我们可以得知,班内学生数的变化是在插入学生记录之后发生的,所以创建的触发器类型为 after insert 类型。
# concatinsert into tbl_name values( concat('abc','def') );
8.3 日期函数
year(date) : 返回日期 date的年份(1000~9999)
month(date) : 返回 date 的月份值(1~12)
day(date):返回 date 的日(1~31)
curdate() : 返回当前的日期
week(date) : 返回日期 date为一年中第几周(0~53)
now() : 返回当前的日期和时间
curtime() : 返回当前的时间
hour(time) : 返回 time的小时值(0~23)
minute(time) : 返回 time的分钟值(0~59)
8.3 聚合函数
count(col) : 统计记录的条数
sum(col) : 求和
avg(col) : 求平均值
max(col): 求最大值
min(col) : 求最小值
# count 统计总记录数selectcount(*) from tbl_name;
# sum 年龄总和selectsum(age) from tbl_name;
# avg 平均年龄selectavg(age) from tbl_name;
# 最大年龄selectmin(birthday) from tbl_name; # 日期最小的
@TOC
一、 MySQL 介绍
1.1 MySQL 简介
1.2 关系型数据库
关系型数据库以行和列的形式存储数据,这一系列的行和列被称为表,一组表组成了数据库。
表与表之间的数据记录有关系。
数据保存在表内,行(记录)用于记录数据,列(字段)用于规定数据格式
二、 MySQL 管理
2.1 MySQL 数据库管理
查看数据库
创建数据库
MySQL\data 目录下将自动生成一个对应名称的目录,目录内部有一个 db.opt 文件
显示数据库创建信息
show create database db_name; # db_name 即你的数据库名
删除数据库
进入/使用数据库
显示当前打开的数据库
select database();
2.2 MySQL 表结构管理
创建数据表
MySQL\data
目录下的数据库目录中将自动生成一个对应名称的.frm
文件删除数据表
查看数据表
查看表创建信息
查看数据表结构
desc 表名;
2.3 MySQL 用户管理
登录
MySQL 是基于C/S 架构,必须在客户端通过终端窗口,连接MySQL 服务器进行操作
用户管理
例如:
使用 create语句进行创建用户,语句格式如下:
参数说明:
删除用户使用drop 语句,语法格式为:
修改配置文件 my.ini
2.4 默认数据库
提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
mysql 5.5 版本 新增了一个性能优化的引擎
这个是 MySQL的核心数据库,主要负责存储数据库的用户、权限设置、关键字等 MySQL自己需要使用的控制和管理信息。不可以删除,也不要轻易修改这个数据库里面的表信息。
安装时候创建的一个测试用数据库,空数据库,没有任何表,可以删除(新版mysql 已取消)。
三、 SQL 基础语法
3.1 SQL 语句简介
SQL 语言
基本规范
注释
3.2 MySQL 基本数据类型
字段类型
数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储方式,代表了不同的信息类型。不同的数据库,数据类型有所不同,MySQL数据库有以下几种数据类型:
字符串型
注意
:char 和 和 varchar 需要指定长度,例如:char(10)整数型
很多人喜欢在定义数据时,这样写:
int
后面()
中的数字,不代表占用空间容量。而代表最小显示位数。这个东西基本没有意义,除非你对字段指定zerofill
。mysql 会自动分配长度:int(11)
、tinyint(4)
、smallint(6)
、mediumint(9)
、bigint(20)
。所以,建议在使用时,就用这些默认的显示长度就可以了。不用再去自己填长度(比如:int(10)
、tinyint(1)
之类的基本没用)。浮点型
值绝对能保证精度为 6~7位有效数字
精度为15~16位有效数字
M(精度),代表总长度(整数位和小数位)限制
D(标度),代表小数位的长度限制。
M 必需大于等于 D
日期型
列举与枚举
字段属性
3.3 数据的增删改查(简称:CURD)
数据的增删改
新增(增加/插入数据)
删除
修改
单条修改
update 表名 set xx=xx,xxx=xx where xxx=xxx and xxx=xxx;
四、数据的查询
查询比较繁杂,单拎出来
SELECT 语句用于从表中选取数据。结果被存储在一个结果表中(称为*结果集*)。
4.1 查询表达式
4.2 条件表达式
from 子句
distinct(去重复)
where 子句
where 条件关键字:
like 子句
用于模糊查询 %:任意字符长度 _ :一个字符长度
limit 子句
控制查询记录条数,数据表中的记录,从 索引从 0 开始
group by (结果分组)
根据 给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表利用 group by分组信息进行统计,常见的是配合 max 等聚合函数筛选数据后分析。
select 指定的字段要么作为分组的依据(Group By 语句的后面),要么就要被包含在聚合函数中。
order by( 结果排序)
按照给定的字段进行排序,asc:升序(默认) desc:降序
如果同时选择多个字段,先按第一个字段排序,如果第一个字段值相等,再尝试第二个字段,以此类推
查询语句的书写顺序
别名
4.3 多表查询
例如这里有三个表:

从姓名表中查询为id为6,成绩表中他课程号为4,科目表中id为4的所有信息:
表连接
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行

join
内连接
4.4 子查询
子查询(subquery)是指出现在其他 SQL语句内的 select 子句(嵌套在查询内部,且必须始终出现在圆括号内)
五、视图与事务
5.1 视图
数据库中视图是一个重要的概念,其优势在于:
创建视图
修改视图
删除视图
查询视图
这两个命令不仅可以显示表名及表信息,而且会显示出所有视图名称及视图信息。除此之外,使用 SHOW CREATE VIEW 命令可以查看某个视图的定义,格式如下:
关系数据库表是用于存储和组织信息的数据结构,数据结构的不同,直接影响操作数据的效率和功能,对于 MySQL来说,它提供了很多种类型的存储引擎,可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用 MySQL强大的功能。
5.2 事务
MyISAM 引擎
MyISAM 表是独立于操作系统的,这说明可以轻松地将其从 Windows 服务器移植到 Linux 服务器,建立一个 MyISAM 引擎的 tb_Demo 表,就会生成以下三个文件:
MyISAM 无法处理事务 ,特别适合以下几种情况下使用:
InnoDB 引擎
InnoDB是一个健壮的事务型存储引擎,InnoDB还引入了外键约束,在以下场合下,使用 InnoDB是最理想的选择:
事务处理
以银行转账业务为例,张三→李四转账 100 元,这是一个完整事务,需要两步操作:
如果在 1步完成后,操作出现错误(断电、操作异常等),使 2步没有完成,此时,张三减去了 100元,而张三却没有收到 100 元
为了避免这种情况的发生,就将整个操作定义为一个事务,任何操作步骤出现错
误,都会回滚到上一次断点位置,避免出现其他错误。
语法:
六、 索引约束分区
6.1 索引
索引是帮助 MySQL高效获取数据的数据结构
数据库在保存数据之外,还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。索引可以大大提高 MySQL的检索速度。
在 MySQL中,对于一个 Primary Key的列,MySQL已经自动对其建立了
Unique
和Index
。创建索引
显示索引
删除索引
6.2 约束
约束保证数据的完整性和一致性,根据约束的字段数目的多少,约束又分为表级约束和列级约束
约束类型包括:
唯一(unique)约束
注意
: 每个表可以有多个 unique约束,但是每个表只能有一个 primary key 约束。默认(default)约束
用于约束对应列中的值的默认值(除非默认为空值,否则不可插入空值)
主键(primary key)约束
每张数据表只能存在一个主键,主键保证记录的唯一性,主键自动为 not null(同时作为表的索引)。
外键(foreign key) 约束
外键约束是为了保持数据一致性,完整性,实现一对一或一对多关系
innoDB
。6.3 删除约束
删除 primary key
删除 index
删除外键约束
6.4 索引与约束的关系
索引是面向数据库本身的,用于查询优化等操作。约束则更多的是业务上的关系。
通常,创建唯一约束就自动获取唯一索引,是因为数据库认为对数据库进行唯一检查时,如果该字段上有索引会很快,所以创建唯一约束就默认创建唯一索引。同样,常见的主键即是唯一性的约束,也是个索引。但对于 not null 这样的约束,数据库是不会创建索引的。
6.5 分区
如果一张表的数据量太大,不仅查找数据的效率低下,而且难以找到一块集中的存储来存放。为了解决这个问题,数据库推出了分区的功能。MySQL 表分区主要有以下四种类型:
RANGE即范围分区,根据区间来判断位于哪个分区。这些区间要连续且不能相互重叠,使用 VALUES LESS THAN 操作符来进行定义。
LIST 分区类似于按 RANGE 分区,区别在于 LIST 分区是基于列值匹配一个离
散值集合中的某个值来进行选择。
HASH分区基于用户定义的表达式返回值来选择分区,该表达式对要插入到表的行中列值进行 Hash 计算。
KEY分区类似 HASH,但是 HASH允许用户使用自定义表达式,而 KEY分区不允许,它需要使用 MySQL服务器提供的 HASH 函数,同时 HASH 分区只支持整数分区,而 KEY分区支持除 BLOB 和 TEXT类型外其他列。
七、 存储过程 & 触发器
7.1 存储过程
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。(
*
)存储过程是为了完成特定功能的 SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
优点:
缺点:
存储过程的创建和调用
存储过程就是具有名字的一段代码,用来完成一个特定的功能。
创建的存储过程保存在数据库的数据字典中。
语法:
实例:
查询,修改与删除
查询
查看所有存储过程状态:
查看对应数据库下所有存储过程状态:
查看名称包含 Student 的存储过程状态:
查询存储过程详细代码:
修改
删除
==注意:不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程。==
调用存储过程
MySQL存储过程用 call 和过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数调用,格式如下:
7.2 触发器
触发器(trigger),也叫触发程序,是与表有关的命名数据库对象,是 MySQL中提供给程序员来保证数据完整性的一种方法,它是与表事件 INSET、UPDATE、DELETE相关的一种特殊的存储过程,它的执行是由事件来触发,比如当对一个表
进行 INSET、UPDATE、DELETE 事件时就会激活它执行。因此,删除、新增或者修改操作可能都会激活触发器,所以不要编写过于复杂的触发器,也不要增加过多的触发器,这样会对数据的插入、修改或者删除带来比较严重的影响,同时也会带来可移植性差的后果,所以在设计触发器的时候一定要有所考虑。
创建触发器
参数说明:
或者用BEGIN 和 END 包含的多条语句,与存储过程类似。
触发事件类型:
我们想要使班级表中的班内学生数随着学生的添加自动更新,则采用触发器来实现
最为合适,创建触发器如下:
从需求我们可以得知,班内学生数的变化是在插入学生记录之后发生的,所以创建的触发器类型为 after insert 类型。
查看触发器
删除触发器
触发器执行顺序
日常开发中创建的数据库通常都是 InnoDB 数据库,在数据库上建立的表大都是事务性表,也就是事务安全的,这时触发器的执行顺序主要是:
如果是对数据库的非事务表进行操作,当触发器执行顺序中的任何一步执行出错,那么就无法回滚了,数据可能会出错。
八、 MySQL 函数
8.1 运算函数
8.2 字符串函数
8.3 日期函数
8.3 聚合函数
FOUND_ROWS()
FOUND_ROWS 函数配合 SQL_CALC_FOUND_ROWS 用于获取总记录数(忽略limit)
第一个 sql 里面的 SQL_CALC_FOUND_ROWS 不可省略,它表示需要取得结果数,也是后面使用 FOUND_ROWS()函数的铺垫。
FOUND_ROWS()返回的结果是临时的。如果程序往后会用到这个数字,必须提前它保存在一个变量中待用。
FOUND_ROWS()与 count()的区别:
1、当 SQL限制条件太多时, count()的执行效率不是很高,最好使用 FOUND_RO
WS()
2、当 SQL查询语句没有 where等条件限制时,使用 count()函数的执行效率较高。
九、 数据库备份
9.1 备份数据
9.2 恢复数据
..................
The text was updated successfully, but these errors were encountered: