数据库基本操作
查看基本信息
- 显示服务器版本
SELECT VERSION(); - 显示当前日期时间
SELECT NOW(); - 显示当前用户
SELECT USER();
修改数据库存储引擎
- my.ini 文件中配置 default-storage-engine=INNODB
创建数据库
CREATE {DATABASE | SCHEMA} [IF NOT EXIST] db_name [DEFAULT] CHARACTER SET [=] UTF8
修改数据库
ALTER {DATABASE | SCHEMA } [DB_NAME] [DEFAULT] CHARACTER SET [=] CHARSET_NAME
删除数据库
DROP {DATABSE | SCHEMA} [IF EXISTS] DB_NAME
数据类型
-
整型
TINYINT < SMALLINT < MEDIUMINT < INT < BIGINT -
浮点型
FLOAT[(M,D)](常用) < DOUBLE[(M,D)] -
日期
YEAR < TIME <DATE < DATETIME < TIMESTAMP -
字符型
CHAR < VARCHAR < TINYTEXT < TEXT < MEDIUMTEXT < LONGTEXT < ENUM('VAL','VAL') < set(val, val2)
创建数据表
- UNSIGNED 无符号位(即不要负数,节省存储空间)
create table t1(
username varchar(20),
age tinyint UNSIGNED,
salary float(8, 2) UNSIGNED
)
NULL 与 NOT NULL (设置字段可不可以为空)
查看数据表
SHOW TABLES [FORM DB_NAME] [LIKE 'PATTERN' | WHERE expr]
查看数据表结构
show columns from table_name
插入记录
insert [into] tb_name [col_name, ... ] values (val, ...)
insert [into] tb_name set col_name = {expr|dafault},...
insert [into] tb_name [col_Name] select...
insert user(username) select username from user2 where age >30;
查找记录
select * from tb
primary key 主键约束
- 每张表只有一个主键
- 常与 auto_increment 一起使用
- 自动为 NOT NULL
UNIQUE KEY
- 与主键类似,区别在于主键在一张表中只能有一个
DEFAULT 默认约束
create table tb(
id smallint unsigned auto_increment primary key,
username varchar(20) not null unique key,
sex enum('male', 'female') DEFAULT 'male'
)
FOREIGN KEY 外键约束
- 父子表使用相存储引擎,InnoDB
- 外键列与参照列必须有相似数据类型
- 若外键列不存在索引,则自动创建
外键约束的参照操作
- cascade: 从父表删除或更新时自动删除或更新子表中匹配的项
- set null: 从父表删除或更新行,并设置子表中外键列为 null.
若使用该选项,必须保证字表列没有指定 not null - restrict: 拒绝对父表的删除或更新操作。
- no action: 标准 sql 关键字,在 mysql 中与 restrict 相同
create table user1(
id smallint unsigned primary key auto_increment,
username varchar(10) not null,
pid smallint unsigned,
foreign key (pid) references province(id) on delete cascade
)
修改数据表
添加单列
alter table tb_name add [column] col_name col_definition [first |after col_name]
删除列
alter table tb_name drop [column] col_name
添加主键约束
alter table tb_name add [constraint [symbol]] primary key [index_type] (index_col_name, ...)
alter table user2 add constraint pk_user_id primary key (id);
删除主键约束
alter table tb_name drop primary key;
添加唯一约束
alter table tb_name add [constraint [symbol]] unique [index|key] [index_name] [index_type] (index_col_name,..)
alter table user2 add unique (username)
删除唯一约束
alter table tb_name drop {index|key} index_name;
alter table user2 drop index username;
添加外键约束
alter table tb_name add [constraint [symbol]] foreign key [index_name] (index_col_name, ...) reference definition
alter table user2 add foreign key (pid) references province(id)
删除外键约束
alter table tb_name drop foreign key fk_symbol
添加/删除默认约束
alter table tb_name alter [column] col_name {set default literal | drop default}
alter table user2 alter age set default 15;
alter table user2 alter age drop default;
修改列定义
alter table tb_name modify [column] col_name column_definition [first | after col_name]
<!-- 将 id 字段放到第一列 -->
alter table user modify id smallint not null first;
修改列名称
alter table tb_name change [column] old_col_name new_col_name column_definition [first | after col_name];
alter table user change pid p_id unsigned not null;
数据表重命名
alter table tb_name rename [to|as] new tb_name;
rename table tb1_name to new_name
更新记录(单表更新)
update [low_priority] [ignore] tb_reference set col_name = {expr|default} [,col_name2={e|d},...] [where where_condition]
update users set age=age+5;
update users set age = age -id, sex = 0;
update users set age = age + 10 where id % 2 = 0;
删除记录(单表删除)
delete from tb_name [where where_condition]
delete from users where id=6;
查找记录
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 {[offsetm] row_count | row_count offset}]
]
select id,username from users group by id;
<!-- group 分组 -->
select sex,age from users group by age having age > 5;
<!-- count()聚合函数,还有max(),min()等 -->
select sex from users group by 1 having count(id) > 2;
<!-- order:排序 -->
select * from users order by age, id desc;
<!-- limit 可用于分页操作-->
select * from users limit 2,2; //获得第 3,4 条数据(sql 从 0编号)
<!-- as 使用别名 -->
select id as username from users;
子查询: select 中 select
select * from t1 where col1 = (select col2 from t2)
使用比较运算符的子查询
- 语法结构
operand comparison_operator subquery
any、some、all 修饰比较运算符
operand comparison_operator any(subquery)
operand comparison_operator some(subquery)
operand comparison_operator all(subquery)
> any(subquery) 返回大于子查询结果中最小的值
> all(subquery) 返回大于子查询结果中最大的值
in 和 NOT in 的子查询
operand comparison_operator [not] in (subquery)
=any 与 in 等效
!=all 或 <>all 与 NOT in 等效
exists 与 NOT exists 的子查询
exists 则返回 true
insert...select
- 将查询结果写入数据表
insert [into] tb_name [(col_name,...)] select ...
insert into tdb_goods_cates(cate_name) select goods_cate from tdb_goods group by goods_cate
create...select
- 创建数据表的同时将查询结果写入到数据表
create table [if not exists] tb_name [(create_defineition,...)] select_statement
create table tdb_goods_brands(
brand_id smallint unsigned primary key auto_increment,
brand_name varchar(40) not null
) select brand_name from tdb_goods group by brand_name;
多表更新
update table_references
set col_name={expr|default}
[, col_name2={expr|default}]
[where where_condition]
update tdb_goods inner join tdb_goods_cates on goods_cate = cate_name
set goods_cate = cate_id;
连接类型
-
inner join 内连接
在 mysql 中,join, cross join 和 inner join 是等价的。
left [outer] join, 左外连接
right [outer] join, 右外连接 -
on 设置连接条件
内连接:两个表的交集
select goods_id, goods_name, cate_name from tdb_goods inner join tdb_goods_cates on tdb_goods.cate_id = tdb_goods_cates.cate_id;
-
left join: 左表中的全部和右表中符合条件的
-
right join: 右表中的全部和左表中符合条件的
多表连接
select goods_id, goods_name, cate_name, brand_name, goods_price from tdb_goods as g
inner join tdb_goods_cates as c on g.cate_id = c.cate_id
inner join tdb_goods_brands as b on g.brand_id = b.brand_idG;
自身连接
- 同一个数据表对自身进行连结。
select c.type_id, c.type_name, p.type_name
from tdb_goods_types as c
left join tdb_goods_types as p
on c.parent_id = p.type_id;
多表删除
delete tb_name [.*] [,tb_name[.*]]...
from table_references
[where where_condition]
//删除表中重复数据,id 号较大的
delete t1 from tdb_goods as t1
left join
(select goods_id, goods_name from tdb_goods
group by goods_name having count(goods_name) >=2) as t2 on t1.goods_name = t2.goods_name where t1.goods_id > t2.goods_id;
函数
字符函数
- concat()
select concat('first_name', 'last_name')as fullname from user
; - concat_ws()
select concat_ws('|', 'a', 'b')
//'a|b' - format()
select format(12560.75, 1)
12560.8 - lower()
- upper()
- left()
select left('mysql', 2)
//my - right()
select right('mysql', 3)
//sql - length()
- ltrim()
- rtrim()
- trim()
select trim(both '?' from '??my??sql????'
- substring()
- [not] like
select 'mysql' like 'm*'
- % 表示任意字符 _ : 表示任意一个字符
- like '%1%%' escape '1' //表示 1 后的字符不需匹配
- replace()
replace('ab?c', '?','')
数值运算符与函数
- ceil()
- floor()
- div 3 div 4
- mod 5 mod 3
- power() 幂运算
- round() round(3,62, 0) //4
- truncate() 数值截取
- [not] between ... and ...
select 34 between 1 and 22
- [not] in()
select 13 in(5,10,15,20)
- is [not] null
select null is null;
时间日期函数
- now() 当前日期和时间
- curdate() 当前日期
- curtime() 当前时间
- date_add()
select date_add('2018-8-10', interval 3 week);
select date_add('2018-8-10', interval 1 year);
- datediff() 日期差值计算
datediff('2013-3-12', '2014-03-12')
- date_format() 日期格式化
date_format('2014-3-2', '%m/%d/%Y')
信息函数
- connection_id() 连接id
- datebase()
- last_insert_id() 新写入记录的 id 号
- user()
- version()
聚合函数
- avg()
- count()
- max()
- min()
- sum()
加密函数
- md5() 信息摘要算法
select md5('admin')
- password() 密码算法
set password = password('heiha')
函数
自定义函数两个必要条件
- 参数
- 返回值
创建自定义函数
create function function_name
returns
{string|integer|real|decimal}
routine_body //函数体
//不带参数的函数 指定返回类型
create function f1() returns varchar(30)
return date_format(now(), '%Y年%m月%d日 %H点:%i分:%s秒');
//带参数
create function f2(num1 smallint unsigned, num2 smallint unsigned)
returns float(10, 2) unsigned
return (num1 + num2)/2
<!-- 复合结构的函数体 -->
delimiter //
create function adduser(username varchar(20))
returns int unsigned
<!-- 具有复合结构的函数体必须包含在 begin...end 之间 -->
begin
insert test(username) values (username);
return last_insert_id();
end
//
select adduser('rose')
- 修改结束符
delimiter //
mysql 存储
存储过程
sql命令 -> mysql 引擎(分析) -> 语法正确 -> 可识别的命令(执行) -> 结果 -> (返回给)客户端
存储过程是 sql 语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理,下次再次访问时直接读取缓存,不用再编译
创建存储过程
create
[define = {user|current_user}]
procedure sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[in|out|inout] param_name type
- in: 表示该参数的值必须在调用存储过程时指定
- out: 表示该参数值可以被存储过程改变,并且可以返回
- inout: 表示该参数调用时指定,并可被改变和返回
过程体
- 由合法 sql 语句组成
- 可以使任意(CRUD)sql语句
- 若是复合结构则使用 begin...end
- 可包含声明,循环,控制结构
创建不带参数的存储过程
create procedure sp1() select version();
<!-- 调用 -->
call sp1;
call sp1();
delimiter //
create procedure removeUserById(in p_id int unsigned)
<!-- 传参的 命名id 不能和 where 后的 id 相同,否则会全部删除 -->
delete from users where id = p_id;
end
//
<!-- 调用 -->
delimiter ;
call removeUserById(3);
delimiter //
create procedure removeUserAndReturnUserNums(in p_id int unsigned, out userNums int unsigned)
begin
delete from users where id = p_id;
select count(id) from users into userNums;
end
//
<!-- -->
delimiter ;
select count(id) from users;
call removeUserAndReturnUserNums(27, @nums);
删除存储过程
drop procedure [if exists] removeUserById
局部变量与用户变量
begin
//局部变量
declare ...
end
set @i = 7; //用户变量
mysql支持的存储引擎
- 存储引擎
- myisam (适用于事务处理不多的情况,支持索引,表级锁定,数据压缩,存储 256TB)
- innodb(只有innodb 支持事务,外键;行级锁定,存储限制:64TB)
- memory
- csv
- archive
-
并发控制
当多个连接对记录进行修改时保证数据的一致性和完整性. -
锁
- 共享锁(读锁)
- 排它锁(写锁)
- 事务
- 用于保证数据库的完整性
修改存储引擎
创建时指定
create table tb_name(
) ENGINE = engine;
修改引擎
alter table t1 ENGINE = engine;