// 1.
mysql -uroot -p***
u:user
p:password
mysql -uroot -p
input:password
exit
//2
uninstall
setup->remove
C://program files(x86)/mySql
C://programData/mySql
//3 import data
show databases;
show tables; 查看当前库中的表
show tables from <database name>; 查看其他库中的表
show create table dept; 查看表的创建语句
desc dept; 显示表结构
create database node; 创建数据库
drop database node;删除数据库
use node;
source *.sql 执行sql 脚本
//7
select database();
select version();
//8 结束一条语句 :\c
//9
count(*)和count(具体的某个字段),区别:
count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(comm): 表示统计comm字段中不为NULL的数据总数量。
分组函数自动忽略空值,不需要手动的加where条件排除空值
分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因
并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。
当一条sql语句没有group by的话,整张表的数据会自成一组
group by 在where 执行后 才执行
记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段
//10总结一个完整的DQL语句怎么写
select 5
from 1
where 2
group by 3
having 4
order by 6
//11根据表的连接方式来划分,包括:
内连接:等值连接 非等值连接 自连接
外连接:左外连接(左连接)右外连接(右连接)
全连接:(很少用)
内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
AB两张表没有主副之分,两张表是平等的。
外连接:假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中
的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
外连接的分类
左外连接(左连接):表示左边的这张表是主表。
右外连接(右连接):表示右边的这张表是主表。
左连接有右连接的写法,右连接也会有对应的左连接的写法
内连接之等值连接:最大特点是:条件是等量关系
内连接之非等值连接:最大的特点是:连接条件中的关系是非等量关系
自连接:最大的特点是:一张表看做两张表。自己连接自己
实际开发中外连接用的多
SQL99语法结构更清晰一些:表的连接条件和后来的where条件分离了。
SQL92:(太老,不用了)
select e.ename,d.dname
from emp e, dept d
where e.deptno = d.deptno;
SQL99:(常用的)
select e.ename,d.dname
from emp e
join dept d //(inner join, inner可以省略的,带着inner目的是可读性好一些)
on e.deptno = d.deptno;
// e.sal between s.losal and s.hisal; 非等值
内连接:
select a.ename '员工', b.ename '领导'
from emp a
join emp b
on a.mgr = b.empno;
外连接:(左外连接/左连接)
select a.ename '员工', b.ename '领导'
from emp a
left join emp b //left outer(可以省略) join
on a.mgr = b.empno;
外连接:(右外连接/右连接)
select a.ename '员工', b.ename '领导'
from emp b
right join emp a //right outer(可以省略) join
on a.mgr = b.empno;
//12 子查询
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;
select
e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname
from emp e;
//13 union (可以将查询结果集相加)
select ename,job from emp where job = 'MANAGER'
union
select ename,job from emp where job = 'SALESMAN';
两张不相干的表中的数据拼接在一起显示
select ename from emp
union
select dname from dept;
//14 limit
limit (重点,以后分页查询全靠它了。)
limit是mysql特有的,其他数据库中没有,不通用。(Oracle中有一个相同的机制,叫做rownum)
limit取结果集中的部分数据,这时它的作用。
语法机制:
limit startIndex, length
startIndex表示起始位置,从0开始,0表示第一条数据。
length表示取几个
eg:取出工资前5名的员工(思路:降序取前5个)
select ename,sal from emp order by sal desc;
取前5个:
select ename,sal from emp order by sal desc limit 0, 5;
select ename,sal from emp order by sal desc limit 5;
limit是sql语句最后执行的一个环节:
select 5
from 1
where 2
group by 3
having 4
order by 6
limit 7
...;
// 15
表的复制
create table 表名 as select语句:
create table emp2 as select empno,ename from emp;
将查询结果插入到一张表中:
insert into dept1 select * from dept;
删除所有记录
delete from dept1;
删除大表中的数据
truncate table 表名; // 表被截断,不可回滚。永久丢失
drop table 表名
drop table if exists 表名; // oracle不支持这种写法。
//16约束
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
非空约束(not null):约束的字段不能为NULL
唯一约束(unique):约束的字段不能重复,但可以为NULL。
主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)
外键约束(foreign key):外键可以为NULL,...(简称FK)
检查约束(check):注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束。
//16.1主键
表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
主键的作用:主键值是这行记录在这张表当中的唯一标识
根据主键字段的字段数量来划分:
单一主键(推荐的,常用的)
复合主键(多个字段联合起来添加一个主键约束)(复合主键不建议使用,因为复合主键违背三范式。)
根据主键性质来划分:
自然主键:主键值最好就是一个和业务没有任何关系的自然数。(这种方式是推荐的)
业务主键:主键值和系统的业务挂钩,例如:拿着银行卡的卡号做主键,拿着身份证号码作为主键。(不推荐用)
最好不要拿着和业务挂钩的字段作为主键。因为以后的业务一旦发生改变的时候,主键值可能也需要
随着发生变化,但有的时候没有办法变化,因为变化可能会导致主键值重复
drop table if exists t_user;
create table t_user(
id int,
// or id int primary key, 列级约束
// id int primary key auto_increment, id字段自动维护一个自增的数字,从1开始,以1递增
// Oracle当中也提供了一个自增机制,叫做:序列(sequence)对象
username varchar(255),
primary key(id)
);
insert into t_user(id,username) values(1,'zs');
//16.2外键约束
顺序要求:
删除数据的时候,先删除子表,再删除父表。
删除表的时候,先删除子表,在删除父表。
添加数据的时候,先添加父表,在添加子表。
创建表的时候,先创建父表,再创建子表。
drop table if exists t_student;
drop table if exists t_class;
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),
foreign key(classno) references t_class(cno)
);
insert into t_class values(101,'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
insert into t_class values(102,'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy');
insert into t_student values(1,'zs1',101);
//17 存储引擎
存储引擎这个名字只有在mysql中存在。(Oracle中有对应的机制,但是不叫做存储引擎。Oracle中没有特殊的名字,
就是“表的存储方式”)
mysql支持很多存储引擎,每一个存储引擎都对应了一种不同的存储方式。
每一个存储引擎都有自己的优缺点,需要在合适的时机选择合适的存储引擎
查看当前mysql支持的存储引擎:show engines \G
完整的建表语句
CREATE TABLE `t_x` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注意:在MySQL当中,凡是标识符是可以使用飘号括起来的。最好别用,不通用。
建表的时候可以指定存储引擎,也可以指定字符集。
mysql默认使用的存储引擎是InnoDB方式。
默认采用的字符集是UTF8
常见的存储引擎:
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
MyISAM这种存储引擎不支持事务。
MyISAM是mysql最常用的存储引擎,但是这种引擎不是默认的。
MyISAM采用三个文件组织一张表:
xxx.frm(存储格式的文件)
xxx.MYD(存储表中数据的文件)
xxx.MYI(存储表中索引的文件)
优点:可被压缩,节省存储空间。并且可以转换为只读表,提高检索效率。
缺点:不支持事务
InnoDB:
支持事务、行级锁、外键等。这种存储引擎数据的安全得到保障
表的结构存储在xxx.frm文件中
数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读。
这种InnoDB存储引擎在MySQL数据库崩溃之后提供自动恢复机制。
InnoDB支持级联删除和级联更新
Engine: MEMORY
缺点:不支持事务。数据容易丢失。因为所有数据和索引都是存储在内存当中的。
优点:查询速度最快。
以前叫做HEPA引擎
//18事务包括四大特性:ACID
A: 原子性:事务是最小的工作单元,不可再分。
C: 一致性:事务必须保证多条DML语句同时成功或者同时失败。
I:隔离性:事务A与事务B之间具有隔离。
D:持久性:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束。
关于事务之间的隔离性
事务隔离性存在隔离级别,理论上隔离级别包括4个:
第一级别:读未提交(read uncommitted)
对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。
读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据。
第二级别:读已提交(read committed)
对方事务提交之后的数据我方可以读取到。
这种隔离级别解决了: 脏读现象没有了。
读已提交存在的问题是:不可重复读。
第三级别:可重复读(repeatable read)
这种隔离级别解决了:不可重复读问题。
这种隔离级别存在的问题是:读取到的数据是幻象。
第四级别:序列化读/串行化读(serializable)
解决了所有问题。效率低。需要事务排队。
oracle数据库默认的隔离级别是:读已提交。
mysql数据库默认的隔离级别是:可重复读。
//18.1使用start transaction;关闭自动提交机制
mysql> start transaction;
mysql> rollback;
...
mysql> commit;
mysql> savepint (name)
mysql> rollback(name)
//18.2演示两个事务,假如隔离级别
演示第1级别:读未提交
set global transaction isolation level read uncommitted;
演示第2级别:读已提交
set global transaction isolation level read committed;
演示第3级别:可重复读
set global transaction isolation level repeatable read;
//19
什么时候考虑给字段添加索引?(满足什么条件)
* 数据量庞大。(根据客户的需求,根据线上的环境)
* 该字段很少的DML操作。(因为字段进行修改操作,索引也需要维护)
* 该字段经常出现在where子句中。(经常根据哪个字段查询)
//19.1 索引
创建索引对象:create index 索引名称 on 表名(字段名);
删除索引对象:drop index 索引名称 on 表名;
索引底层采用的数据结构是:B + Tree
注意:
主键和具有unique约束的字段自动会添加索引。
根据主键查询效率较高。尽量根据主键检索。
查看sql语句的执行计划:
mysql> explain select ename,sal from emp where sal = 5000;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | emp | ALL | NULL | NULL | NULL | NULL | 14 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
给薪资sal字段添加索引:
create index emp_sal_index on emp(sal);
mysql> explain select ename,sal from emp where sal = 5000;
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
| 1 | SIMPLE | emp | ref | emp_sal_index | emp_sal_index | 9 | const | 1 | Using where |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
//19.2索引的分类
单一索引:给单个字段添加索引
复合索引: 给多个字段联合起来添加1个索引
主键索引:主键上会自动添加索引
唯一索引:有unique约束的字段上会自动添加索引
//19.3索引什么时候失效
select ename from emp where ename like '%A%';
模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的
//20 视图 很少用
站在不同的角度去看到数据(同一张表的数据,通过不同的角度去看待)
//20.1创建视图
create view myview as select empno,ename from emp;
drop view myview;
注意:只有DQL语句才能以视图对象的方式创建出来。
//20.2
对视图进行增删改查,会影响到原表数据。(通过视图影响原表数据的,不是直接操作的原表)
可以对视图进行CRUD操作
面向视图操作: select * from myview;
//20.3
视图的作用:
视图可以隐藏表的实现细节。
保密级别较高的系统,数据库只对外提供相关的视图,java程序员只对视图对象进行CRUD。
//21 DBA命令
将数据库当中的数据导出,在windows的dos命令窗口中执行:
导出整个库:mysqldump node>D:\node.sql -uroot -p111
在windows的dos命令窗口中执行:
导出指定数据库当中的指定表: mysqldump node emp>D:\node.sql -uroot –p111
导入数据
create database node;
use node;
source D:\node.sql
//22 数据库设计三范式
设计表的依据。按照这个三范式设计的表不会出现数据冗余
提醒:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。
第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分
第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。
多对多,三张表,关系表两个外键
第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。
一对多,两张表,多的表加外键
一对一设计:
一对一设计有两种方案:主键共享
t_user_login 用户登录表
id(pk) username password
--------------------------------------
1 zs 123
2 ls 456
t_user_detail 用户详细信息表
id(pk+fk) realname tel ....
------------------------------------------------
1 张三 1111111111
2 李四 1111415621
一对一设计有两种方案:外键唯一。
t_user_login 用户登录表
id(pk) username password
--------------------------------------
1 zs 123
2 ls 456
t_user_detail 用户详细信息表
id(pk) realname tel userid(fk+unique)....
-----------------------------------------------------------
1 张三 1111111111 2
2 李四 1111415621 1
// 23 CURD:Create增, Retrieve检索,Update修改,Delete删除
select
e.ename,t.*
from
(select deptno,max(sal) as maxsal from emp group by deptno) t
join
emp e
on
t.deptno = e.deptno and t.maxsal = e.sal;