启动和连接MySQL服务
服务端启动
1、查看MySQL状态
sudo /etc/init.d/mysql status
sudo /etc/init.d/mysql start | stop | restart
客户端连接
1、命令格式
mysql -h主机地址 -u用户名 -p密码
mysql -hlocalhost -uroot -p
2、本地连接可省略 -h 选项
mysql -uroot -p
基本SQL命令
库的管理
查看已有库
show databases;
创建库(指定字符集)
create database 库名 [character set utf8];
查看创建库的语句(字符集)
show create database 库名;
查看当前所在库
select database();
切换库
use 库名;
查看库中已有表
show tables;
删除库
drop database 库名;
表的管理
创建表(指定字符集)
create table 表名(
字段名 数据类型,
字段名 数据类型,
...
字段名 数据类型
);
查看已有表的字符集
show create table 表名;
查看表结构
desc 表名;
删除表
drop table 表名;
表的复制
1、语法
create table 表名 select .. from 表名 where 条件;
2、示例
1、复制test表的全部记录和字段,test2
create table test2
select * from test;
2、复制test表的前3条记录,test3
create table test3
select * from test limit 3;
3、复制test表的id,name,country三个字段的前5条记录,test4
create table test4
select id,name,country from test limit 5;
3、复制表结构
create table 表名 select * from 表名 where false;
4、注意
复制表的时候不会把原表的 键(key) 属性复制过来
表记录管理
插入(insert)
1、insert into 表名 values(值1),(值2),...;
2、insert into 表名(字段1,...) values(值1),...;
查询(select)
1、select * from 表名 [where 条件];
2、select 字段1,字段名2 from 表名 [where 条件];
查看tab中所有记录
select * from tab;
查看tab表中所有人的姓名和年龄
select name,age from tab;
查看tab表中年龄大于20的信息
select * from tab where age>20;
删除表记录
1、delete from 表名 where 条件;
2、注意
delete语句后如果不加where条件,所有记录全部清空
更新表记录
1、update 表名 set 字段1=值1,字段2=值2,... where 条件;
2、注意
必须加where条件
表字段的操作
语法
alter table 表名 执行动作;
添加字段(add)
alter table 表名 add 字段名 数据类型;
alter table 表名 add 字段名 数据类型 first;
alter table 表名 add 字段名 数据类型 after 字段名;
删除字段(drop)
alter table 表名 drop 字段名;
修改数据类型(modify)
alter table 表名 modify 字段名 新数据类型;
表重命名(rename)
alter table 表名 rename 新表名;
运算符操作
数值比较/字符比较
1、数值比较 := != > >= < <=
2、字符比较 := !=
逻辑比较
1、and (两个或多个条件同时成立)
2、or (任意一个条件成立即可)
范围内比较
1、between 值1 and 值2
2、where 字段名 in(值1,值2,...)
3、where 字段名 not in(值1,值2,...)
匹配空、非空
1、空 :where name is null
2、非空:where name is not null
3、注意
1、NULL :空值,只能用 is 或者 is not 去匹配
2、"" :空字符串,用 = 或者 != 去匹配
模糊比较
1、where 字段名 like 表达式
2、表达式
1、_ : 匹配单个字符
2、% : 匹配0到多个字符
数据类型
数值类型
整型
1、int 大整型(4个字节)
取值范围 :2**32 - 1(42亿多)
2、tinyint 微小整型(1个字节)
1、有符号(signed默认) : -128 ~ 127
2、无符号(unsigned) : 0 ~ 255
age tinyint unsigned,
3、smallint 小整型(2个字节)
4、bigint 极大整型(8个字节)
浮点型
1、float(4个字节,最多显示7个有效位)
1、用法
字段名 float(m,n) m->总位数 n->小数位位数
float(5,2)取值范围? -999.99 ~ 999.99
2、decimal(最多显示28个有效位)
1、decimal(m,n)
2、存储空间(整数、小数分开存储)
规则:将9的倍数包装成4个字节
余数 字节
0 0
1-2 1
3-4 2
5-6 3
7-9 4
字符类型
1、定长 char(15) : 浪费存储空间,性能高
2、边长 varchar(20) : 节省存储空间,性能低
字符类型宽度和数值类型宽度的区别
1、数值类型宽度为显示宽度,只用于select查询显示,和占用存储无关,可用zerofill查看效果
2、字符类型的宽度超过之后则无法存储
枚举类型
1、单选(enum) :字段名 enum(值1,值2,...)
2、多选(set) :字段名 set(值1,值2,...)
日期时间类型
1、date :"YYYY-MM-DD"
2、time :"HH:MM:SS"
3、datetime :"YYYY-MM-DD HH:MM:SS"
4、timestamp :"YYYY-MM-DD HH:MM:SS"
5、注意
1、datetime :不给值默认返回NULL值
2、timestamp :不给值默认返回系统当前时间
日期时间函数
1、now() 返回服务器当前时间
2、curdate() 返回当前日期
3、curtime() 返回当前时间
4、year(date) 返回指定时间的年份
5、date(date) 返回指定时间的日期
6、time(date) 返回指定时间的时间
日期时间运算
语法格式
select * from 表名
where 字段名 运算符 (时间-interval 时间间隔单位);
时间间隔单位:
1 day | 2 hour | 1 minute | 2 year | 3 month
SQL查询
总结
1、where ...
2、group by ...
3、select ...聚合函数 from 表名
4、having ...
5、order by ...
6、limit ...;
order by
1、给查询结果进行排序
2、... order by 字段名 ASC/DESC
3、升序:ASC(默认)
降序:DESC
limit (永远放在SQL语句的最后写)
1、作用 :限制显示查询记录的个数
2、用法
1、limit n -> 显示 n 条记录
2、limit m,n
m 表示 从第m+1条记录开始显示,显示 n 条
limit 2,3 : 第 3、4、5 三条记录
分页
每页显示5条记录,显示第4页的内容
第1页 :limit 0,5 # 1 2 3 4 5
第2页 :limit (2-1)*5,5 # 6 7 8 9 10
第3页 :limit (3-1)*5,5 # 11 12 13 14 15
第4页 :limit (4-1)*5,5 # 16 17 18 19 20
每页显示n条记录,显示第m页 :limit (m-1)*n,n
聚合函数
分类:
avg(字段名) : 求该字段平均值
sum(字段名) : 求和
max(字段名) : 最大值
min(字段名) : 最小值
count(字段名) : 统计该字段记录的个数
执行顺序
3、select ...聚合函数 from 表名
1、where ...
2、group by ...
4、having ...
5、order by ...
6、limit ...
group by
1、作用 :给查询结果进行分组
2、示例
计算每个人的平均分
select class,avg(score) from chenjibiao
group by class;
3、注意
1、group by之后的字段名必须要为select之后的字段名
2、如果select之后的字段名和group by之后的字段不一致,则必须对该字段进行聚合处理(聚合函数)
having语句
1、作用
对查询的结果进行进一步筛选
2、注意
1、having语句通常和group by语句联合使用,过滤由group by语句返回的记录集
2、where只能操作表中实际存在字段,having可操作由聚合函数生成的显示列
distinct
1、作用 :不显示字段重复值
2、注意
1、distinct和from之间所有字段都相同才会去重
2、distinct不能对任何字段做聚合处理
查询表记录时做数学运算
1、运算符
+ - * / %
约束
1、作用 :保证数据的完整性、一致性、有效性
2、约束分类
1、默认约束(default)
1、插入记录,不给该字段赋值,则使用默认值
2、非空约束(not NULL)
1、不允许该字段的值有NULL记录
sex enum(“M”,“F”,“S”) not null defalut “S”
索引
定义
对数据库表的一列或多列的值进行排序的一种结构(Btree方式)
优点
加快数据检索速度
缺点
1、占用物理存储空间
2、当对表中数据更新时,索引需要动态维护,降低数据维护速度
索引示例
1、开启运行时间检测 :set profiling=1;
2、执行查询语句
select name from test where name="b222";
3、查看执行时间
show profiles;
4、在name字段创建索引
create index name on test(name);
5、再执行查询语句
select name from test where name="b222";
6、查看执行时间
show profiles;
索引
1、普通索引(index)
1、使用规则
1、可设置多个字段
2、字段值无约束
3、key标志 :MUL
2、创建index
1、创建表时
create table 表名(...
index(字段名),index(字段名));
2、已有表
create index 索引名 on 表名(字段名);
create index name on test(name);
3、查看索引
1、desc 表名; --> KEY标志为:MUL
2、show index from 表名\G;
4、删除索引
drop index 索引名 on 表名;
2、唯一索引(unique)
1、使用规则
1、可设置多个字段
2、约束 :字段值不允许重复,但可为 NULL
3、KEY标志 :UNI
2、创建
1、创建表时创建
unique(字段名),
unique(字段名)
2、已有表
create unique index 索引名 on 表名(字段名);
3、查看、删除 同 普通索引
3、主键索引(primary key)
自增长属性(auto_increment,配合主键一起使用)
1、使用规则
1、只能有一个主键字段
2、约束 :不允许重复,且不能为NULL
3、KEY标志 :PRI
4、通常设置记录编号字段id,能唯一锁定一条记录
2、创建
1、创建表时
(id int primary key auto_increment,
)auto_increment=10000;##设置自增长起始值
已有表添加自增长属性:
alter table 表名 modify id int auto_increment;
已有表重新指定起始值:
alter table 表名 auto_increment=20000;
2、已有表
alter table 表名 add primary key(id);
3、删除
1、删除自增长属性(modify)
alter table 表名 modify id int;
2、删除主键索引
alter table 表名 drop primary key;
4、外键索引
嵌套查询(子查询)
1、定义 :把内层的查询结果作为外层的查询条件
2、语法格式
select … from 表名 where 条件(select …);
多表查询
1、两种方式
1、select 字段名列表 from 表名列表; (笛卡尔积)
t1 : name -> “A1” “A2” “A3”
t2 : name -> “B1” “B2”
select * from t1,t2;
±-----±------+
| name | name2 |
±-----±------+
| A1 | B1 |
| A1 | B2 |
| A2 | B1 |
| A2 | B2 |
| A3 | B1 |
| A3 | B2 |
±-----±------+
2、… where 条件;
连接查询
内连接
1、语法格式
select 字段名 from
表1 inner join 表2 on 条件
inner join 表3 on 条件;
外连接
左连接
1、以 左表 为主显示查询结果
2、select 字段名 from
表1 left join 表2 on 条件
left join 表3 on 条件;
右连接
用法同左连接,以右表为主显示查询结果
数据相关
数据导入
1、作用 :把文件系统的内容导入到数据库中
2、语法
load data infile "/var/lib/mysql-files/文件名"
into table 表名
fields terminated by "分隔符"
lines terminated by "\n";
数据导出
1、作用
将数据库中表的记录导出到系统文件里
2、语法格式
select ... from 表名
into outfile "/var/lib/mysql-files/文件名"
fields terminated by "分隔符"
lines terminated by "\n";
数据备份(mysqldump,在Linux终端中操作)
1、命令格式
mysqldump -u用户名 -p 源库名 > ~/***.sql
2、源库名的表示方式
--all-databases 备份所有库
库名 备份单个库
-B 库1 库2 库3 备份多个库
库名 表1 表2 表3 备份指定库的多张表
数据恢复
1、命令格式(Linux终端)
mysql -uroot -p 目标库名 < ***.sql
2、从所有库备份中恢复某一个库(--one-database)
mysql -uroot -p --one-database 目标库名 < all.sql
mysql -uroot -p --one-database db4 < all.sql
3、注意
1、恢复库时如果恢复到原库会将表中数据覆盖,新增表不会删除
2、数据恢复时如果恢复的库不存在,则必须先创建空库
外键(foreign key)
定义 :
让当前表字段的值在另一个表的范围内选择
语法
foreign key(参考字段名)
references 主表(被参考字段名)
on delete 级联动作
on update 级联动作
使用规则
1、主表、从表字段数据类型要一致
2、主表被参考字段 :主键
删除外键
alter table 表名 drop foreign key 外键名;
外键名 :show create table 表名;
级联动作
1、cascade
数据级联删除、更新(参考字段)
2、restrict(默认)
从表有相关联记录,不允许主表操作
3、set null
主表删除、更新,从表相关联记录字段值为NULL
已有表添加外键
alter table 表名 add
foreign key(参考字段) references 主表(被参考字段)
on delete ...
on update ...
MySQL的用户账户管理
1、开启MySQL远程连接
1、sudo -i
2、cd /etc/mysql/mysql.conf.d/
3、subl mysqld.cnf
#bind-address = 127.0.0.1 ctrl + s保存
4、/etc/init.d/mysql restart 2、添加授权用户
1、用root用户登录mysql
mysql -uroot -p123456
2、授权
grant 权限列表 on 库.表 to “用户名”@"%"
identified by “密码” with grant option;权限列表:all privileges 、select 、insert 库.表 : *.* 所有库的所有表
存储引擎(处理表的处理器)
基本操作
1、查看所有存储引擎
mysql> show engines;
2、查看已有表的存储引擎
mysql> show create table 表名;
3、创建表指定
create table 表名(...)engine=myisam;
4、已有表
alter table 表名 engine=innodb;
锁
1、目的 :解决客户端并发访问的冲突问题
2、锁分类
1、锁类型
1、读锁(共享锁)
select :加读锁之后别人不能更改表记录,但可以进行查询
2、写锁(互斥锁、排他锁)
insert、delete、update
加写锁之后别人不能查、不能改
2、锁粒度
1、表级锁 :myisam
2、行级锁 :innodb
3、常用存储引擎特点
1、InnoDB特点
1、共享表空间
表名.frm :表结构和索引文件
表名.ibd :表记录
2、支持行级锁
3、支持外键、事务操作
2、MyISAM特点
1、独享表空间
表名.frm :表结构
表名.myd :表记录 mydata
表名.myi :索引文件 myindex
2、支持表级锁
4、如何决定使用哪个存储引擎
1、执行查操作多的表用 MyISAM(使用InnoDB浪费资源)
2、执行写操作多的表用 InnoDB
MySQL调优
1、选择合适的存储引擎
1、读操作多 :MyISAM
2、写操作多 :InnoDB
2、创建索引
在 select、where、order by常涉及到的字段建立索引
3、SQL语句的优化
1、where子句中不使用 != ,否则放弃索引全表扫描
2、尽量避免 NULL 值判断,否则放弃索引全表扫描
优化前 :
select number from t1 where number is null;
优化后 :
在number列上设置默认值0,确保number列无NULL值
select number from t1 where number=0;
3、尽量避免 or 连接条件,否则放弃索引全表扫描
优化前 :
select id from t1 where id=10 or id=20 or id=30;
优化后:
select id from t1 where id=10
union all
select id from t1 where id=20
union all
select id from t1 where id=30;
4、模糊查询尽量避免使用前置 % ,否则全表扫描
select name from t1 where name like "%c%";
5、尽量避免使用 in 和 not in,否则全表扫描
select id from t1 where id in(1,2,3,4);
select id from t1 where id between 1 and 4;
6、尽量避免使用 select * ...;用具体字段代替 * ,不要返回用不到的任何字段
事务和事务回滚
1、定义 :一件事从开始发生到结束的整个过程
2、作用 :确保数据一致性
3、事务和事务回滚应用
1、MySQL中sql命令会自动commit到数据库
show variables like "autocommit";
2、事务应用
1、开启事务
mysql> begin;
mysql> ...一条或多条SQL语句
## 此时autocommit被禁用
2、终止事务
mysql> commit; | rollback;