前言
MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。MySQL作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作。如果反复频繁的访问数据库,(1)会在反复链接数据库上花费大量时间,从而导致运行效率过慢;(2)反复的访问数据库也会导致数据库的负载过高。
MySQL(1)
准备阶段
开启(关闭)MySQL服务器
#linux下
service mysql start
service mysql stop
#windows下
net start mysql
net stop mysql
登录
mysql -u username -p #本地登录
mysql -u username -p -P 端口号(默认:3306)#指定端口登录
mysql -h ip地址 -u username -p -P 端口号 #指定IP地址和端口号
SQL基础语句
SQL语句分为四类,分别是:
1、DDL(Data Definition Language),数据定义语言,对数据库和表的结构操作
2、DML(Data Manipulation Language),数据操作语言,对数据的增、删、改
3、DQL(Data Query Language),数据查询语言(重难点)
4、DCL(Data Control Language),数据控制语言,对用户的创建及授权
DDL
1、对数据库的操作
show databases; #查看所有数据库
use <数据库名>; #切换(选择)数据库
create database [if not exists] <数据库名> [charset = utf8]; #创建数据库,安装时默认选了编码方式
drop database [if exists] <数据库名>; # 删除
alter database <数据库名> character set utf8; #修改数据库编码
2、对表的操作
create table [if not exists] <表名>(
<列名> <列类型>,
...
<列名> <列类型>
); # 创建表
show tables; #查看表
desc <表名>; #查看表结构
drop table <表名>; #删除表
alter table <表名> add( ); #添加列
alter table <表名> modify <列名> <列类型>; #修改列类型
alter table <表名> change <原列名> <新列名> <列类型>; #修改列名
alter table <表名> drop <列名>; #删除列
alter table <原表名> rename to <新表名>; #修改表名称
DML
insert into <表名>(列1, 列2,...) values(值1, 值2,...); # 插入数据,列-值一一对应,没有插入的列值默认为NULL
insert into <表名> values(值1, 值2,...); #表示插入所有列
update <表名> set <列1>=<值1>,<列2>=<值2>,...[where <条件>] # 修改数据
delete from <表名> [where <条件>]; # 删除数据,注意:不加where会删除所有数据
truncate table <表名>; #先删除该表(drop table <表名>),再创建该表(create table <表名>),无法回滚
DQL
1、字段(列)控制
select * from <表名>; # *表示查询所有列
select <列1>,<列2>, ... from <表名>; #查询指定列
select distinct * <列1>,<列2>, ... from <表名>; #不显示重复行
select <列>*<值> from <表名>; #对<列>所有值乘<值>,数据类型的列可加减乘除
select concat( <列1>,<列2>) from <表名>; #字符串类型可做连续运算(拼接)
select ifnull(<列>,0) + <值> from <表名>; #如果列中存在NULL值,那么当成0来运算
select <列> as <列别名> from <表名>; #给列起别名,as可省略
2、条件控制
(1)条件查询
select <列1>,<列2>, ... from <表名> where <条件>;# 若where子句中包含了>=3个条件,且使用了and和or操作符,就需要用圆括号来明确意图
(2)模糊查询
select * from <表名> where <列名> like '___'; #通配符:下划线匹配一个字符,‘%’匹配[0,N]个任意字符
(3)条件类型
相等条件:=
不等条件:!=、<>
范围条件:<,<=,>,>=,between,in
注:使用字符串范围时,需要知道所使用的字符集中各字符的次序(字符集内各字符的次序被称为排序顺序,即比较大小的先后次序)。
(4)正则表达式构造搜索表达式
将关键字like换为regexp,它告诉mysql后面为正则表达式。
注意like和regexp之间的一个重要差别:like需要列置完全匹配,如果被匹配的文本只是在列值中出现,并不会返回相应的行。而regexp则只要被匹配的文本在列值中出现了,就会返回相应的行。
mysql只支持正则表达式实现的一个很小的子集,并不是全部。
常用正则表达式:
'.xxx' #匹配任意一个字符
'|' #匹配其中之一
'[123]' #[]定义or语句查找什么,匹配123中任意一个
'[1-5]' #匹配1-5中任意一个
#匹配特殊字符时,字符要以\\为前导
#定位元字符:^(文本的开始),$(文本的结尾),[[:<:]](词的开始),[[:>:]](词的结尾)
3、排序
select * from <表名> order by <列> ASC; #按<列>升序
select * from <表名> order by <列> DESC; #按<列>降序
select * from <表名> order by <列1>(ASC/DESC),<列2>(ASC/DESC),...;
4、聚合函数
(1)count
select count(*) from <表名>; #计算表中所有列都不为NULL的记录的行数
select count(<列>) from <表名>; #计算表中该列不为NULL的记录的行数
(2)max/min
select max(<列>) from <表名>; #列中最大值
select min(<列>) from <表名>; #列中最小值
(3)sum/avg
select sum(<列>) from <表名>; #列中元素之和
select avg(<列>) from <表名>; #列中元素之平均值
5、分组查询
把记录使用某一列进行分组,然后查询组信息。
select <列> <组信息> from <表名> group by <列>;
select <列> <组信息> from <表名> where <条件> group by <列>; #分组前条件
select <列> <组信息> from <表名> group by <列> having <条件>; #分组后条件
6、limit子句(mysql特有)
用于限定查询结果的起始行,以及总行数。
select * from <表名> limit 4,3; #查询起始行为第5行,一共查询3行记录
# 10条记录/页,查询第3页
select * from <表名> limit 20,10;
DCL
一般情况下,一个项目创建一个用户,一个项目对应的数据库只有一个。
1、创建用户
create user username@ipaddress identified by 'password'; #用户只能在指定的IP地址上登录
create user username@'%' identified by 'password'; #用户可以在任意IP地址上访问
2、给用户授权/撤销授权
grant <权限1>,<权限2>,... on <数据库名> to username@ipaddress;revoke <权限1>,<权限2>,... on <数据库名> from username@ipaddress;#权限包括create、select等,使用all表示所有权限