目录
登录Mysql
mysql -u用户名 -p密码 (显示密码)
mysql -uroot -p (不显示密码)
常用命令
exit //退出mysql
show databases; //查看数据库
use 数据库名 ; //使用数据库
create database 库名 ;//创建数据库
case.....when....then....when....then.....else....end
// eg: select name,job,(case job when 'a' then salary1.1 when 'b' then salary1.2 else salary end) as newsalary from emp;
数据库基本单元是表 table
数据库是以表格形式表示的数据的
行(row):数据
列(column):字段
show tables; 查看当前数据库下有哪些表
数据库中字符串是用单引号括起来的,单引号是标准
sql语句
分类
DQL- 数据库查询语言
DML- 数据库操作语言
DDL -数据库定义语言
TCL -事务控制语言
DCL -数据控制语言
mysql 不见";"不执行,“;”表示结束
查看表结构:desc 表名;
查看数据库版本号:select version();
查看当前使用的数据库 select database();
DQL
简单查询
select 字段名 from 表名;
查询两个或者多个字段 select 字段名1,2,.......from 表名;
查询所有字段: select *from 表名;
给查询的列起别名:select 字段名 as 别名 from 表名;(as可以用空格代替)
字段可以使用数学表达式,进行数学运算
条件查询
格式:select .....from .....where 条件;
条件:= , <,>,!=,<=,>=,<>(不等于),and和or(可连接多个条件)
between..and... 两个值之间,等同于 >= and <=
is null ,is not null
not(可以取非,主要用在is或in中)
like 模糊查询,支持%或下划线匹配
in 包含,相当于多个or 格式:in(条件1,条件2,.......)
not in 不包含
<%匹配任意个字符,一个下划线只匹配一个字符>
<and 优先级高于or,可以加括号控制优先级>
排序
select ...from ....order by 字段 desc; //降序
select ...from ....order by 字段 (asc); //升序
select A,B from ......order by A,B; //A在前面起主导作用,只有在A相等的时候,才会启用B排序
select ....from ...order by 1; //表示对第一列排序
单行处理函数
特点:一个输入对应一个输出
使用函数:函数名() <函数可以嵌套>
lower 转换小写
upper 转换大写
substr 取子串
格式:substr(被截取的串,起始下标(从1开始),截取长度)
length 取长度
trim 去空格
str_to_date 将字符串转成日期
date_format 格式化日期
concat(字段1,字段2) 字符串拼接
format 格式化日期
round 四舍五入
rand 生成随机数
ifnull 可以将null转成一个具体值
格式:ifnull(字段名,数字)//如果出现null,则null为....
<null参与运算结果一定为null>
多行处理函数(分组函数)
特点:输入多行,输出一行
count //计数
sum //求和
avg //求平均值
max //求最大值
min //求最小值
1.多行处理函数忽略null
2.分组函数中count(*)和count(具体字段数)有区别
前一个统计表当前总行数,后一个统计该字段下不为null的元素的总数
3.分组函数不能直接使用在where子句中
4.所有的分组函数可以组合起来一起用
分组查询
select .....from......group by.....
输入顺序:select...
from..........
where.........
group by................
order by......
执行顺序: from--where--group by--select--order by--limit
在一条select子句中,如果有group by,select后只能跟分组字段和分组函数
having ...... 跟在group by 之后,可以对分组后的数据进行过滤
把查询结果去重复记录 : distinct //只能出现在所有字段的前方
select distict 字段名 from .........
连接查询
形式:a join b on 连接条件 where 条件
表连接方式分类:
内连接:等值连接,非等值连接,自连接
外连接:左外连接,右外连接
全连接
<避免在查询时加条件,起别名可以提高查询效率>
1.等值内连接
select .... from a join b (inner) on a=b where ....... //inner可有可无
2.非等值内连接
3.自连接(技巧:一张表看成两张表)
4.外连接
a right (outer) join b on ...... //主要是为了把b的数据全部查询出来,捎带查询出ab关联的a中的数据,同理还有 left join 左外连接
<外连接的查询条数一定大于内连接查询条数>
6.多张表连接
select ..... from
a join b on ab连接条件
join c on ac 连接条件
join d on ad 连接条件........
<内连接外连接可以混合>
子查询
select语句中嵌套select语句,被嵌套的select语句称为子查询
可以出现在:select ......(select.....) //此查询只能返回一条结果
from .......(select......) //将select查询结果看做一张表(建议取别名)
where ......(select.....)
联合查询
select ..... from.... union select .....from....
// 要求union两个结果集的列数和类型相同
limit
将查询结果的一部分取出来,通常使用在分页查询中
select .... from.... order by ... limit 起始下标,长度
//limit默认0为起始下标,缺省用法:limit(长度) 表示取前几数据
分页:limit((pageno-1)*pagesize,pagesize)
表的创建
create table表名(字段名1 类型,字段名2 类型,.......);
类型:varchar ,int,bigint,float,double,date,datetime,clob(字符大对象,最多可存4G字符串),blob(二进制大对象,专门用来存储图片,声音,视频等流媒体数据)
建表时,可以对指定字段设置默认值(默认为null),形式: defaut ‘默认值'
快速创建:create table 表名 as select .......from 表名; //将查询结果当做一张表创建
删除操作
drop table 表名;//不存在会报错
drop table if exsits 表名;
delete from 表名 where 条件; //删除效率较低,支持回滚
truncate from 表名 where 条件; //删除效率高,不支持回滚
插入数据
insert into 表名(字段名1,2,3,.......) values(值1,2,3,......) //值与字段一一对应
可一次插入多条记录: values(......),(......),(........)
insert语句一旦执行成功,必然会多一条或多条记录
字段名可以省去,此时默认为全部字段,值必须一一对应,不可省去
insert into 表名 select ......from 表名; //将查询结果插入到一张表中
日期格式
日期格式:%Y %m %d %h %i %s 年月天时分秒
日期格式转换:
str_to_date() varchar-->date
date_format() date-->varchar
str_to_date('字符串日期','日期格式')
date_formate(日期类型数据,’日期格式‘) //通常使用在查询日期,设置展示的日期格式
date型只包括年月日信息 默认格式:%Y-%m-%d
datetime包括年月日时分秒信息 默认格式:%Y-%m-%d %h:%i:%s
命名规范
所有标识符都是小写,单词之间用下划线衔接
表的修改
内容修改:
update 表名 set 字段名1=值1,字段名2=值2 ................where 条件
修改表名和列名(结构修改)的语法如下:
修改表名(将表名user改为users)alter table user rename to users;
修改列名(将字段名username改为name)alter table users change uesrname name varchar(30);
约束
在创建表的时候,我们可以给表中字段加上一些约束,来保证表中数据的完整性,有效性
分类:
1.非空约束 not null 具有列级约束 //约束字段不能为null
2.唯一性约束 unique 具有表级约束 //约束字段不能重复
各自唯一:字段名1 类型(大小)unique,字段名2 类型(大小)unique ,...........
联合唯一:unique(字段名1,2,3............................)
3.主键约束 primary key 具有表级约束
4.检查约束 check(MySQL不支持,oracle支持)
5.外键约束 foreign key
//表级约束主要是多个字段联合起来约束
主键约束
一张表只能有一个主键,主键值是每一行记录的唯一标识,任何一张表都应有主键,没有主键,表无效
主键的特征:not null +unique
auto_increment 表示从1开始自增,常用于主键创建
外键约束
通过外键引用的表为父表
实现表与表之间的约束,子表的字段值必须在主表中,保证数据的完整性
create .......(
.................
..................
字段名n,foreign key(字段名n)references 父表(引用字段名)
);
删除表顺序:子----父
创建表顺序:父--子
删除数据顺序:子--父
插入数据顺序:父--子
外键值可以为null,外键引用的字段至少具有unique约束
存储引擎
MySQL中一个表存储数据的方式
show create table 表名 ;//查看存储表的方式
mysql默认存储引擎为InnoDB,字符编码为UTF8
show engine \G //查看当前版本下MySQL支持哪些存储引擎
事务
一个完整的业务逻辑
只有DML语句与事务有关,批量DML语句同时成功或失败
提交事务:清空事务性活动的日志文件,将数据全部彻底持久划到数据库表中,标志着事物结束,且全部成功
回滚事务:撤销之前所有的DML操作,并清空该事务日志文件,标志着事务结束,且全部失败
transaction 事务
commit 提交事务
rollback 回滚事务
MySQL默认情况下是支持自动提交的
如果想关闭自动提交,得先使用 start transaction;来关闭它
事务的四个特征:
A 原子性 事务是最小工作单元
C 一致性 数据一致性
I 隔离性 两个事物之间有一定隔离
D 持久性 事务最终结束一个保障
事务隔离性
隔离级别:
1.读未提交 read uncommitted //事务1可以读到事务2未提交的数据
2.读已提交 read committed//事务1可以读到事务2已提交的数据
3.可重复读 repeat read //事务1开启之后,每次1读到事务2的数据都是一样的,即使2已经修改
4.序列化/串行化 serializable 事务排队,不能并发
查看隔离级别:select @@tx_isolation;
Set global transation isolation level 级别; //设置隔离级别
索引
索引是在数据库表的字段上添加的,是为了提高查询效率而存在的一种机制,一张表的一个字段或者多个字段联合添加一个索引,相当于目录,可以缩小扫描范围,快速定位
MySQL在查询方面主要就是两种方式:全表扫描和根据索引检索
MySQL中主键字和unique字段自动添加索引
添加索引条件
1.数据量庞大
2.该字段经常被扫描(位于where后面)
3.该字段很少的DML操作
索引不能随便添加,其需要维护,耗费资源,设置太多会降低性能
基本语法
create index 索引名 on 表名(字段名); //创建索引
drop index 索引名 on 表名; //删除索引
explain......select......where......;//检查一个sql语句是否使用了索引进行检索
注意
模糊查询使索引失效
使用or要求两边字段都有索引才不会让索引失效
使用复合索引时,没有使用左侧的列查询,索引失效
在where中索引列参加了运算,索引失效
在where中索引列使用了函数,索引失效
视图
(view):站在不同角度看待同一份数据
创建视图对象:create view 视图名 as select .......;
删除视图对象:drop view 视图名;
视图特点:通过视图操作,会影响到原表数据
可以将视图视为一张表(可能为多表联合的表),他一直存在,其可以简化操作(用一个视图对象指代多条DQL语句)
DBA命令
create user 用户名 identified by ‘密码’; //创建新用户
数据备份:
导出(在dos窗口下):mysqldump 数据库名 > 绝对路径和文件名(.sql)-u用户名 -p密码
也可以只导出一张表:.......数据库名 表名>.....................
导入(在MySQL数据库服务器上,先创建新库,use库,然后添加命令):source 绝对路径和文件名(.sql)
数据库设计三范式
1.要求任何一张表必须有主键,每一个字段原子性不可再分
2.建立在第一范式基础上,要求所有非主键字段完全依赖主键,不产生部分依赖
3.建立在第二范式基础上,要求所有非主键字段直接依赖主键,不产生传递依赖