mysql
执行步骤
select 5
...
from 1
...
where 2
...
group by 3
...
having 4
...
order by 6
...
limit 7
...;
表 table
包括 列 成为字段 column
行:被称为数据 data
字段包括的属性,字段名,类型、约束
建库
show databases;
use database 数据库名;
drop 数据库名;
show tables;
source sql文件路径;
desc 表名;
select * from 表名;
select database();
select version();
\c 结束一条命令,不执行
exit 退出mysql
表
select * from 表名;不区分大小写
select 字段名 as 重命名,字段名 as 重命名 from 表名;
条件查询 where
select 字段名 from 表名 where 条件;先from,再where,最后select;
select enamel from emp where ename = ‘SMITH’;
between and ; 左大右小,可为数字,也可为字符串
between “a” and “c”; 包括a,但不包括c;
null不是一个值,不能用“=“衡量,使用is
where comm is null;
where comm is not null;
and,
or,
in(1000,1200) in等同于or,不是区间。
not in(1000,1200)
like 模糊查询 like ‘%b%’; %代表任意多个字符,代表任意1个字符。
如果要查询 “%"或””,使用转义字符\
排序
排序 order by asc 升序,desc降序
select * from emp where job=“CLEEK" order by sal;
order by 是最后执行的。
分组函数
count
sum
avg
max
min
默认忽略null
select 5
…
from 1
…
where 2
…
group by 3
…
having 4
…
order by 6
…
count(*)数据总的个数(含null的个数);count(列名)不含null的数据个数;
分组函数可以组合使用
求大于平均数
select ename,sal from emp where sal > (select avg(sal) from emp);
单行处理函数 输入一行,输出一行。
有null参与运算结果为null,避免此情况使用ifnull(可能为null的数据的列名,当做什么数据处理)函数
select enamel,(sal + ifnull(comm,0)from emp;
分组 group by
group by 按照某个字段中的同样的数据进行分组;目的是对多个值一样的数据进行操作,如求和;
select job ,max(sal) from emp group by job;
分组函数(count,sum,avg,max,min)通常与group by配合使用,所以叫分组函数,
分组函数在group by执行后执行,使用了分组函数,select之后只能跟分组函数或参与分组的字段,
,有结果,但无意义。
having 对分组之后的数据再次过滤。
where 效率高于having, where后不能使用分组函数;
去重 distinct
去重 distinct 只能出现在所有字段的最前面;
select distinct job from emp;
连接查询
连接查询,从多张表查出结果
笛卡尔现象,当从两张表连接查询时,不假任何条件,结果会出现两站表的乘积条数,称笛卡尔现象
避免笛卡尔现象,加入条件筛选
避免了笛卡尔积现象,会减少记录的匹配次数吗?
不会,次数还是56次。只不过显示的是有效记录。
设置表的别名
select e.ename,d.dname from emp e ,dept d;
内连接,
等值连接特点:等量关系
一个表中的每一项与另一个表中的每一项排列,经过等量关系的条件帅选,得出的表
select e.ename ,d.dname from emp e inner join dept d on e.deptno = d.deptno;
on 之后是连接条件,本质是对笛卡尔现象之后的筛选条件。本质上与where等效。
非等值连接:一个表中的每一项与另一个表中的每一项排列,经过不等量关系的条件帅选,得出的表
select
e.ename,e.sal,s.grade
from
emp e
inner join
salgrade s
on
e.sal between s.losal and s.hisal;
自连接 表中每一项与表中每一项组合,进过筛选条件,得出的新表。
外连接 有两张表,一主,一副,
外连接最重要的特点是:主表的数据无条件的全部查询出来,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。内连接两张表的如果有数据没有匹配,则丢弃。
left 左边的是主表,right 右边的是主表。
多表连接 如有三张表a,b,c,现将a,b连接成表之后,再将所得的表连接c表
select
e.ename,d.dname,s.grade
from
emp e
join
dept d
on
e.deptno = d.deptno
join
salgrade s
on
e.sal between s.losal and s.hisal;
子查询
当select语句中出现嵌套select语句,嵌套的select语句就是子查询。
出现在哪;select
…(select).
from
…(select).
where
…(select).
select * from emp where sal > (select avg(sal) from emp);
select
t.*,s.grade
from
(select deptno,avg(sal) as avgsal from emp group by deptno) t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;
union 将查询结果集相加
limit limit 0,5; limit 5;
创建表
create table 表名(
字段名 类型 约束,
。。。
)
类型
int 整数型(java中的int)
bigint 长整型(java中的long)
float 浮点型(java中的float double)
char 定长字符串(String)
varchar 可变长字符串(StringBuffer/StringBuilder)
date 日期类型 (对应Java中的java.sql.Date类型)
BLOB 二进制大对象(存储图片、视频等流媒体信息) Binary Large OBject (对应java中的Object)
CLOB 字符大对象(存储较大文本,比如,可以存储4G的字符串。) Character Large OBject(对应java中的Object)
char和varchar怎么选择?
在实际的开发中,当某个字段中的数据长度不发生改变的时候,是定长的,例如:性别、生日等都是采用char。
当一个字段的数据长度不确定,例如:简介、姓名等都是采用varchar。
BLOB和CLOB类型的使用?
电影表: t_movie
id(int) name(varchar) playtime(date/char) haibao(BLOB) history(CLOB)
表名在数据库当中一般建议以:t_或者tbl_开始。
insert
insert into 表名(字段名1,字段名2,字段名3,…) values(值1,值2,值3,…)
要求:字段的数量和值的数量相同,并且数据类型要对应相同。
字段可以省略不写,但是后面的value对数量和顺序都有要求。
insert into t_student values(1,‘jack’,‘0’,‘gaosan2ban’,‘1986-10-23’);
一次插入多行数据
insert into t_student
(no,name,sex,classno,birth)
values
(3,'rose','1','gaosi2ban','1952-12-14'),(4,'laotie','1','gaosi2ban','1955-12-14');
除name字段之外,剩下的所有字段自动插入NULL。
insert into t_student(name) values('wangwu');
需要注意的地方:
insert语句插入数据了,只能使用update进行更新。
表的复制
语法:
create table 表名 as select语句;
将查询结果当做表创建出来。
将查询结果插入到一张表中?
insert into dept1 select * from dept;
修改数据:update
语法格式:
update 表名 set 字段名1=值1,字段名2=值2... where 条件;
注意:没有条件整张表数据全部更新。
删除数据?
语法格式:
delete from 表名 where 条件;
注意:没有条件全部删除。
怎么删除大表中的数据?(重点)
truncate table 表名; // 表被截断,不可回滚。永久丢失。
删除表?
drop table 表名; // 这个通用。
约束
约束在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的
合法性、有效性、完整性。
常见的约束有哪些呢?
非空约束(not null):约束的字段不能为NULL
唯一约束(unique):约束的字段不能重复
主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)
外键约束(foreign key):...(简称FK)
唯一约束(unique)
给两个列或者多个列添加unique
usercode varchar(255),
username varchar(255),
unique(usercode,username) // 多个字段联合起来添加1个约束unique 【表级约束】
主键约束
id int primary key, // 列级约束
主键的特点:不能为NULL,也不能重复。
主键的作用:主键值是这行记录在这张表当中的唯一标识。(就像一个人的身份证号码一样。)
一张表的主键约束只能有1个。
mysql提供主键值自增:(非常重要。)
create table t_user(
id int primary key auto_increment, // id字段自动维护一个自增的数字,从1开始,以1递增。
username varchar(255)
);
外键约束
一张表中有两个字段或多个字段中的数据相似,为减少冗余,分为两个表。b表中的一个字段设置为外键约束,引用a表中的
一个字段,联系a表。
a表为父表,b表为字表。
顺序要求:
删除数据的时候,先删除子表,再删除父表。
添加数据的时候,先添加父表,在添加子表。
创建表的时候,先创建父表,再创建子表。
删除表的时候,先删除子表,在删除父表。
父表
create table t_class(
cno int,
cname varchar(255),
primary key(cno)
);
子表
create table t_student(
sno int,
sname varchar(255),
classno int,
primary key(sno),
子表设置classno字段为外键引用父表字段cno。classno字段与cno字段实际上是两个
表中的同一字段
foreign key(classno) references t_class(cno)
);
外键可以为NULL。
被引用的字段不一定是主键,但至少具有unique约束。
完整的建表语句
CREATE TABLE `t_x` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
存储引擎
mysql支持很多存储引擎,每一个存储引擎都对应了一种不同的存储方式。
查看mysql当前支持的存储引擎 show engines \g;
常见储存引擎
myISAM
缺点 不支持事务,不是mysql默认,
优点 可被压缩,节省存储空间。并且可以转换为只读表,提高检索效率。
INnoDB
优点:支持事务、行级锁、外键等。这种存储引擎数据的安全得到保障。
表的结构存储在xxx.frm文件中
数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读。
这种InnoDB存储引擎在MySQL数据库崩溃之后提供自动恢复机制。
InnoDB支持级联删除和级联更新。
MEMORY
缺点:不支持事务。数据容易丢失。因为所有数据和索引都是存储在内存当中的。
优点:查询速度最快。
以前叫做HEPA引擎。
事务
概念
就是完成某项任务的一组操作。(包含命令insert,delete,update)
事务的特性?
事务包括四大特性:ACID
A: 原子性:事务是最小的工作单元,不可再分。
C: 一致性:事务必须保证多条DML语句同时成功或者同时失败。
I:隔离性:事务A与事务B之间具有隔离。
D:持久性:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束。
关于事务之间的隔离性
事务隔离性存在隔离级别,理论上隔离级别包括4个:
第一级别:读未提交(read uncommitted)
对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。
读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据。
第二级别:读已提交(read committed)
对方事务提交之后的数据我方可以读取到。
这种隔离级别解决了: 脏读现象没有了。
读已提交存在的问题是:不可重复读,不可重复的意思就是读到的数据时另一个事务操作数据更新之后的数据。
第三级别:可重复读(repeatable read)
这种隔离级别解决了:不可重复读问题。
这种隔离级别存在的问题是:读取到的数据是幻象,意思就是读到的数据是本事务开始时什么数据,在此事务中一直就是这个数据。
第四级别:序列化读/串行化读(serializable)
解决了所有问题。
效率低。需要事务排队。
oracle数据库默认的隔离级别是:读已提交。
- 开启事务 strat transaction
- 回滚事务 rollback
- 提交事务 commit
索引
索引是引入一种算法,快速找到需要找到的数据。
添加索引
create index 索引名 on 表名(列名)
删除索引
drop index 索引名 on 表名(列名)
视图
作用
视图可以隐藏表的实现细节。保密级别较高的系统,数据库只对外提供相关的视图,java程序员
只对视图对象进行CRUD。
就是抽出表中的一些列,形成新的表,这个表,就是视图。
创建视图
create view 视图名 as 列名,列名。。。from 表
create view 视图名 as 列名 a,列名 b。。。from 表
删除视图
drop view 视图名
DBA命令
在windows的dos命令窗口中执行:(导出整个库)
mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p333
(导出指定数据库当中的指定表)
mysqldump bjpowernode emp>D:\bjpowernode.sql -uroot –p123
导入数据
source D:\bjpowernode.sql
数据库设计三范式
- 第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。
- 第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。
- 第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。
查看sql语句的执行计划:
explain select ename,sal from emp where sal = 5000;