- MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司。它是一个开源的关系型数据库管理系统,分为社区版和企业版。
- 启动与关闭MySQL服务,执行如下命令:
net start mysql
net stop mysql - 数据类型
整型:tinyint、smallint、mediumint、int、bigint
浮点型:float、double
日期时间类型:year、time、date、datetime、timestamp
字符型:char、varchar、tinytext、mediumtext、longtext、enum、set - 打开数据库
use {数据库名称};
显示打开的数据库:select database(); -
创建数据表
create table [if not exists] table_name (column_name data_type,....); - 查看数据表列表
show tables [from db_name] [like 'pattern' | where 'expr']; - 查看数据表结构
show columns from tbl_name; - 记录的插入与查找
insert [into] tbl_name [(col_name,...)] values(val,...);
注意:如果省略col_name,默认对所有列字段进行插入记录。
select expr,... from tbl_name; - 空值与非空值
null 字段可以为空,
not null 字段值禁止为空 -
自动编号 auto_increment
自动编号,且必须与主键组合使用
默认情况下,起始值为1,每次的增量为1 - 主键约束 primary key
每张数据表中只能存在一个主键
主键保证记录的唯一性
主键自动为not null
可以独立使用,不依赖其他属性,比如 auto_increment - 唯一约束 unique key
唯一约束可以保证记录的唯一性
唯一约束的字段可以为空值(null)
每张数据表可以存在多个唯一约束 - 默认约束 default
当前插入记录时,如果没有明确为字段赋值,则自动赋予默认值 - 约束
约束保证数据的完整性和一致性
约束分为表级约束和列级约束
约束类型包括:not null(非空约束)、primary key (主键约束)、unique key(唯一约束)、default (默认约束)foreign key (外键约束) - foreign key
父表和子表必须使用相同的存储引擎,而且禁止使用临时表。
数据表的存储引擎只能为InnoDB。
外键列和参照列必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同;而字符的长度可以不同。
外键列和参照列必须创建索引。如果外键列不存在索引的话,MySQL将自动创建索引。
default-storage-engine=InnoDB- 外键约束的参照操作
cascade:从父表删除或更新且自动删除或更新子表中匹配的行
set null:从父表删除或更新行,并设置子表中外键列为null。如果使用该选项,必须保证子表列没有指定 not null
restrict:拒绝对父表的删除或更新操作
no action :标准sql关键字,在MySQL中与restrict相同 - 表级约束与列级约束
对一个数据列建立的约束,称为列级约束
对多个数据列建立的约束,称为表级约束
列级约束既可以在列定义时声明,也可以在列定义后声明
表级约束只能在列定义后声明 - 修改数据表
添加单列
alter table tbl_name add [column] col_name column_definition [first|after col_name]
添加多列
alter table tbl_name add [column](col_name column_definition,...)
删除列
alter table tbl_name drop [column] col_name;
添加主键约束
alter table tbl_name add [constraint [symbol]] primary key index_type
添加唯一约束
alter table tbl_name add [constraint [symbol]] unique [index|key][index_name]index_type
添加外键约束
alter table tbl_name add [constraint [symbol]] foreign key [index_name] (index_col_name,...) reference_definition
添加/删除默认约束
alter table tbl_name alter [column] col_name {set default literal|drop default}
删除主键约束
alter table tbl_name drop primary key
删除唯一约束
alter table tbl_name drop {index|key} index_name
删除外键约束
alter table tbl_name drop foreign key fk_symbol
修改列定义
alter table tbl_name modify [column] col_name column_definition [first | after col_name]
修改列名称
alter table tbl_name change [column] old_col_name new_col_name column_definition [first|after col_name]
数据表更名
a、alter table tbl_name rename [to|as] new_tbl_name
b、rename table tbl_name to new_tbl_name [,tbl_name2 to new_tbl_name2] - 插入记录
a、insert [into] tbl_name [(col_name,...)] {values|value} ({expr|default},...),(...),...
b、insert [into] tbl_name set col_name={expr|default},...
c、insert [into ] tbl_name [(col_name,...)] select ... - 更新记录
update [low_priority] [ignore] table_reference set col_name={expr1|default} [, col_name2={expr2|default}]... [where
where_condition] - 删除记录
delete from tbl_name [where where_condition] - 查询表达式
select select_expr [,select_expr ...]
[ from table_references
[where where_condition]
[group by {col_name|position} [ASC|DESC],...]
[having where_condition]
[order by {col_name|expr|position} [ASC|DESC],...]
[limit {[offset,] row_count|row_count offset offset}]
]
每一个表达式表示想要的一列,必须有至少一个。
多个列之间以英文逗号分隔。
星号()表示所有列。
tbl_name. 可以表示命名表的所有列
查询表达式可以使用[AS] alias_name为其赋予别名
别名可用于group by order by或having字句 - 条件表达式
对记录进行过滤,如果没有指定where字句,则显示所有记录。
在where表达式中,可以使用MySQL支持的函数或运算符。 - 查询结果分组 group by
[group by {col_name|position} [ASC|DESC],...] - 分组条件
[having where_condition] - 对查询结果排序
[order by {col_name|expr|position} [ASC|DESC],...] - 限制查询结果返回的数量 limit
[limit {[offset,] row_count|row_count offset offset}] - 子查询
子查询是指出现在其他SQL语句内的select字句
子查询指嵌套在查询内部,且必须始终出现在圆括号内。
子查询可以包含多个关键字或条件,如distinct、group by 、order by、limit、函数等。
子查询的外层查询可以是 select、insert、update、set或do
子查询可以返回标量、一行、一列或子查询
使用比较运算符的子查询
=、>、<、>=、<=、<>、!=、<=>
语法结构
operand comparision_operator subquery
用any、some或all 修饰的比较运算符
operand comparison_operator any(subquery)
operand comparison_operator some(subquery)
operand comparison_operator all(subquery)
使用[not] in 的子查询
语法结构
operand comparison_operator [not] in (subquery)
= any 运算符与 in 等效
!=all 或 <> all 运算符与not in 等效
使用[not] exists 的子查询
如果子查询返回任何行,exists将返回true;否则返回false
将查询结果写入数据表
insert [into] tbl_name [(col_name,...)] select ...
多表更新
update table_references set col_name1={expr1|default}
[,col_name2={expr2|default}]...
[where where_condition]
创建数据表时将查询结果写入到数据表
create table [if not exists] tbl_name [(create_definition,...)]
select _statement
连接
MySQL在select语句、多表更新、多表删除语句中支持join操作
语法结构
table_reference
{[inner|cross] join|{left|right} [outer] join}
table)reference
on conditional_expr
数据表参照
table_reference
tbl_name [[as] alias] | table_subquery [as] alias
数据表可以使用tbl_name AS alias_name或者tbl_name alias_name 赋予别名。table_subquery可以作为子查询使用在from子句中,这样的子查询必须为其赋予别名
连接类型
inner join 内连接
在MySQL中,join、cross join和inner join是等价的。
left [outer] join 左外连接
right [outer] join 右外连接
连接条件
使用ON关键字来设定连接条件,也可以使用WHERE来代替
通常使用ON关键字来设定连接条件
使用WHERE关键字进行结果记录的过滤
内连接显示左表及右表符合条件的记录
左连接显示左表的全部记录及右表符合条件的记录
右连接显示右表的全部记录及左表符合条件的记录
多表连接是对外键的逆向操作
A left join b join_condition
数据表B的结果集依赖数据表A
数据表A结果集根据左连接条件依赖所有数据表(B表除外)
左连接条件决定如何检索数据表B(在没有指定where条件的情况下)
如果数据表A的某条记录复合where条件,但是在数据表B不存在,符合连接条件的记录,将生成一个所有列为空的额外的B行。
无限级分类表设计
自身连接
同一个数据表对其自身进行连接
多表删除
delete tbl_name[.] [,tbl_name[.]]...
from table_references
[where where_condition]
-字符函数
concat() ——字符连接
concat_ws() ——使用自定的分隔符进行字符连接
format() ——数字格式化
lower() ——转换成小写字母
upper() ——转换成大写字母
left() ——获取左侧字符
right() ——获取右侧字符
length() ——获取字符串长度
ltrim() ——删除前导空格
rtrim() ——删除后续空格
trim() ——删除前导和后续空格
substring() ——字符串截取
[not] like ——模式匹配
replace() ——字符串替换
-数值运算符与函数
ceil() ——进一取整
div ——整数除法
floor() ——舍一取整
mod ——取余数(取模)
power() ——幂运算
round() ——四舍五入
truncate ——数字截取
[not] between...and... ——[不]在范围内
[not] in() ——[不]在列出值范围内
is [not] null —— [不]为空
-日期时间函数
now() ——当前日期和时间
curdate() ——当前日期
curtime() ——当前时间
date_add() ——日期变化
datediff() ——日期差值
date_format ——日期格式化
-信息函数
connection_id() ——连接ID
database() ——当前数据库
last_insert_id() ——最后插入记录的ID号
user() ——当前用户
version() ——版本信息
-聚合函数
avg() ——平均值
count() ——计数
max() ——最大值
min() ——最小值
sum() ——求和
-加密函数
md5() ——信息摘要算法
password() ——密码算法
-自定义函数
用户自定义函数(UDF)是一种对MySQL扩展的途径,期用法与内置函数相同
两个必要条件:(1) 参数 (2) 返回值
函数可以返回任意类型的值,同样可以接受这些类型的参数,参数和返回值
之间没有必然的联系
创建自定义函数
create function function_name
returns
{string|integer|real|decimal}
routine_body
函数体
(1) 函数体由合法的SQL语句构成
(2) 函数体可以是简单的select或insert语句
(3) 函数体如果为复合结构则使用begin...end语句
(4) 复合结构可以包含声明,循环,控制结构
-存储过程
存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。优点如下:
增强SQL语句的功能和灵活性
实现较快的执行速度
减少网络流量
创建存储过程
create [definer = {user|current_user}]
procedure sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter: [in|out|inout] param_name type
in 表示该参数的值必须在调用存储过程时指定
out 表示该参数的值可以被存储过程改变,并且可以返回
inout 表示该参数的调用时指定,并且可以被改变和返回
过程体由合法SQL语句构成,可是任意的SQL语句,如果为复合结构则使用 begin...end语句,复合结构可以包含声明,循环,控制结构
调用存储过程
call sp_name([parameter[,...]])
call sp_name[()]
修改存储过程
alter procedure sp_name [characteristic ...]
comment 'string'
|{contains_sql| no sql|reads sql data | modifiles sql data}
|sql security {definer|invoker}
删除存储过程
drop procedure [if exists] sp_name
-存储引擎
MySQL可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎。
每一种存储引擎使用不同的存储机制,索引技巧、锁定水平,最终提供广泛且不同的功能。
MyISAM、InnoDB、Memory、CSV、Archive
并发控制
当多个连接对记录进行修改时保证数据的一致性和完整性
锁:共享锁、排他锁
事务
保证数据库的完整性,原子性、一致性、隔离性、持久性
- 外键约束的参照操作