一、数据库简介
1、MySQL数据库介绍
MySQL是一个关系型数据库管理系统,有瑞典MySQL AB公司开发,后来被sun公司收购,sun公司后来后被Oracle公司收购,目前是Oracle旗下产品。
MySQL开源,支持多平台、免费、使用范围广,是了解学习关系型数据库的首选。
特点:
1、使用c和c++编写,并使用了多种编译器进行测试没保证源代码的可移植性
2、支持多种操作系统,如linux、windows、unix等
3、为多种编程语言提供了API。如c++、c、java、python、PHP等
4、优化的SQL查询算法,有效地提高查询速度
5、可以处理拥有上千万条记录的大型数据库
6、使用标准的SQl数据语言形式
2、数据库定义
数据存储-数据库阶段
数据库:是指长期存储在计算机内,有组织的数据集合,简而言之,数据库就是一个存储数据的地方。
表:是数据库中存储的基本单位,数据按照分类存储到不同的表中,能够非常高效的查询其中的数据。
二、SQL语言
1、SQL语言定义
Structured Query Language
结构化查询语言
SQL是一门特殊的语言,专门用来操作关系型数据库,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过SQL语言操作Oracle、mysql、SqlServer、sqlite等等所有的关系型数据库。
2、SQL语言主要分为:
DQL:数据查询语言,用于对数据进行查询,如select
DDL:数据定义语言,进行数据库、表的管理等,如create、drop
DML:数据操作语言,对数据库进行增删改。如 insert、delete、update
TPL:事务处理语言,对事物进行处理。包括begin transaction、commit、rollback
3、关系型数据库的主要产品:
Oracle:在大型项目中使用。如银行、电信项目;
MySQL:web时代使用最为广泛的关系型数据库;
Microsoft SQL Server: 在微软平台的项目常用;
SQLite:轻量级数据库主要应用在移动平台。
三、SQL语言基础
掌握create table、drop table语句;
掌握 增加insert、删除delete、查询select、更新update表语句;
1、SQL语言中的注释
单行注释
格式:-- 注释内容
Select * --简单的查询语句
From student;
多行注释
格式: /注释内容/
·在Navicat中按住ctrl+/快速注释选中的SQL语句
·在Navicat中按ctrl+shift+/选中SQL代码取消注释。
2、mysql常用数据类型
·整数:int,有符号范围(-2147483648,2147483647),无符号范围(0,,494967295),如:intunsigned,代表设置一个无符号整数;
·小整数tinyint,有符号范围(-128,127),无符号范围(0,255),如天阴天unsigned,代表设置一个吻无符号位的小整数。
·小数;decimal, 如decimal(5,2)表示共存5位数,小数占两位,不能超过2位数;整数占3位,不能超过3位;
·字符串varchar; 如varchar(3)表示最多存3个字符,一个中文或一个字母都占一个字符;
·日期时间:datetime, 范围(10000-01-01 00:00:00~9999-12-31 23:59:59)
如’2020-01-01 12:29:59’.
3、表、字段、记录
表(table),数据库中存储数据的基本单位,表示一个有行和列组成的二维表格结构。
字段(filed)表中的列,在数据库中,叫做字段(filed)。
记录(record)表中的一行,在数据库中叫做记录(record)。
4、创建表的语法
Create table 表名(字段名 数据类型 约束条件。。。);
5、添加数据的语法
Insert into table values();
6、删除表内容的语法
Delete from 表名
Delete from表名 where 条件
Truncate 表名
7、删除表
8、Drop table表名
四、约束
约束:对数据库表中的数据进行限制和约定。
目的:为保证数据库中的数据合理性、准确性、合理化、规范化定义的。
在创建表的时候加约束:
Create table 表名(
字段名 数据类型 约束,
字段名 数据类型 约束,
…
);
约束分类:
1、非空约束 not null
2、默认约束 default 值
3、唯一约束 unique
4、主键约束
Primary key ===not null +unique
主键是表中所有数据用来唯一识别的标志
5、自增约束 auto_increment
6、检查约束 check mysql中有检查约束,但自动忽略
7、外键约束
Foreign key(外键) references 主表(主键)
外键是表与表之间建立连接的通道(桥梁)
有外键的表示从表
有主键的表示主表
从表中的外键值要依赖于主表中的主键值
创建时先创建主表,再创建从表
五、单表查询
1、分组查询
Select * from 表名 where 条件 order by 字段名 desc limit 2;
Select后跟查询的结果字段信息
From后跟查询的表
Where 查询的条件
Order by 排序信息 desc降序 asc升序,默认升序
Limit 分页展示 limit
2、不分组查询
Select * from 表名 where 条件 group by 条件 having。。 order by。。 limit 3
Select … 查询结果的字段信息
Form … 查询的表信息
Where … 查询的条件
Group by … 分组依据
Having … 对分组后的结果进行二次筛选
Order by … 对分组后的结果进行排序
Limit … 对分组后的结果进行分页展示
Where和having:
Where是对分组签的数据进行条件筛选,然后再分组
Having是对分组后的结果进行二次筛选
Distinct:消除重复行
As 取别名
六、函数
函数: mysql中提供的方法
聚合函数: count() sum() avg() min() max()
普通函数:
数字函数:
abs() mod(n,m)==% floor() ceiling() round()
案例:
select abs(-20)
select abs(sage) from student;
select mod(15,7);
select 15%7;
select round(15.6)
字符串函数:
concat(…) length() trim() repalce() insert()
案例:
select concat('my','sql')
select concat(sname,sage) from student;
select length(sname) from student;
select sname from student;
select replace(sname,SUBSTR(sname,2),'先生/女士') from student;
日期函数:
DAYOFMONTH() DAYOFYEAR() QUARTER()
YEAR() MONTH() DATE() HOUR() MINUTE() SECOND()
DATE_ADD() DATE_SUB() CURRENT_TIME() NOW()
案例:
select now(),current_time();
select year(now()),MONTH(now()),DAYOFMONTH(now()),HOUR(now()),minute(now()),second(now());
SELECT now(), DATE_ADD(now(),INTERVAL 7 DAY);
控制流程函数:
case 变量
when 值1 then 结果
when 值2 then 结果
else 结果
end
if(条件,true结果,false结果)
Strcmp(str1,str2):如果str1>str2返回1,str1=str2反回0,str1<str2返回-1)
案例:
select case 1 when 1 then 'one' when 2 then 'two' else 'more' end;
select if(1>2,'yes','no')
加密函数:
password() md5()
案例:
select length(md5('abc'));
insert into student values('admin',md5('abc'))
其他函数:
FORMAT(x,n)函数可以将数字x进行格式化,将x保留到小数点后n位。这个过程需要进行四舍五入
七、多表查询
多表查询: 就是把多张具有关系的表进行数据的查询和拼接
格式:
select … from 表1,表2… …
分类: 交叉连接 等值连接 内连接 左外连接 右外连接 全外连接 自连接 子连接
如何判断查询语句中使用的是哪种连接查询?
单表查询:
查询结果是当前表中的直接字段
查询的条件是当前表中的字段值条件
多表查询:
查询的结果是多张表中的直接字段
条件是多张表中的字段值条件
子连接查询:
查询的结果是当前表的直接字段或者非直接字段
查询条件不是当前表中的直接的字段值
创建两张表并放置数据:
CREATE TABLE `dept` (
`dno` int(11) NOT NULL AUTO_INCREMENT,
`dname` varchar(30) DEFAULT NULL,
`dtext` varchar(30) DEFAULT NULL,
PRIMARY KEY (`dno`))
INSERT INTO `dept` VALUES ('10', '研发部', '程序研发和开发');
INSERT INTO `dept` VALUES ('20', '教学部', '新员工培训和新技术培养');
INSERT INTO `dept` VALUES ('30', '销售部', '销售程序和项目');
INSERT INTO `dept` VALUES ('40', '硬件部', '公司运营和设备维护');
CREATE TABLE `employee` (
`empno` int(11) NOT NULL AUTO_INCREMENT,
`ename` varchar(30) DEFAULT NULL,
`job` varchar(30) DEFAULT NULL,
`mgr` int(11) DEFAULT NULL,
`hiredate` date DEFAULT NULL,
`sal` double DEFAULT NULL,
`COMM` double DEFAULT NULL,
`deptno` int(11) DEFAULT NULL,
PRIMARY KEY (`empno`),
foreign key(`deptno` ) references `dept` (`dno` )
)
INSERT INTO `employee` VALUES ('1001', '甘宁', '文员', '1013', '2000-12-17',
'8000', null, '20');
INSERT INTO `employee` VALUES ('1002', '黛绮丝', '销售员', '1006', '2001-02-20',
'16000', '3000', '30');
INSERT INTO `employee` VALUES ('1003', '殷天正', '销售员', '1006', '2001-02-22',
'12500', '5000', '30');
INSERT INTO `employee` VALUES ('1004', '刘备', '经理', '1009', '2001-04-02',
'29750', null, '20');
INSERT INTO `employee` VALUES ('1005', '谢逊', '销售员', '1006', '2001-09-28',
'12500', '14000', '30');
INSERT INTO `employee` VALUES ('1006', '关羽', '经理', '1009', '2001-05-01',
'28500', null, '30');
INSERT INTO `employee` VALUES ('1007', '张飞', '经理', '1009', '2001-09-01',
'24500', null, '10');
INSERT INTO `employee` VALUES ('1008', '诸葛亮', '分析员', '1004', '2007-04-19',
'30000', null, '20');
交叉连接
交叉连接查询: 笛卡尔积查询 , 简单的把多张表中的数据建立一一对应原则,拼接再一起.
注意: 交叉连接查询的结果有很多条数据不合理,稍微了解即可
格式: select … from 表1,表2,…
等值连接
等值连接查询: 其实是交叉连接查询中的特殊情况,把交叉连接查询的结果中的进行条件判断,获取
其中合理 的数据 ,以后经常被使用。
注意: 条件 外键 = 主键
格式: select … from 表1,表2 where 表1.外键 = 表2.主键
– 查询员工的姓名,职位,工资,所属的部门名称,部门简介select ename,job,sal ,dname,dtext from employee,dept where
employee.deptno=dept.dno
– 查询工资高于15000的员工的姓名,职位,工资,部门名称
select ename,job,sal,dname from dept,employee where employee.deptno = dept.dno
and sal>15000
– 查询工资高于15000的员工的姓名,职位,工资,部门名称,结果按照工资降序排序
select ename,job,sal,dname from dept,employee where employee.deptno = dept.dno
and sal>15000 order by sal desc;
– 查询部门20的经理和部门30的销售员且工资高于12000以上的
– 人员信息和所属的部门名称和部门简介
select e.,d.dname,d.dtext from employee e,dept d
where e.deptno=d.dno
and (d.dno=20 and e.job=‘经理’)
or (d.dno=30 and e.job=‘销售员’ and e.sal>12000)
内连接
内连接查询: 是join连接查询的一种,查询结果数据与等值连接查询的结果数据一模一样
格式: select … from 表1 inner join 表2 on 表1.外键=表2.主键
注意: inner 可以省略
– 查询员工的姓名及所有的部门名称
select ename,dname from employee,dept where employee.deptno=dept.dno
select ename,dname from employee inner join dept on employee.deptno=dept.dno
select ename,dname from employee join dept on employee.deptno=dept.dno
– 查询工资高于12000的员工信息和所属的部门信息,结果按照工资降序排序
select * from employee inner join dept
on employee.deptno = dept.dno and sal>12000
order by sal desc
– 查询部门20的经理和部门30的销售员且工资高于12000以上的
– 人员信息和所属的部门名称和部门简介
select e.
,d.dname,d.dtext
from employee e inner join dept d
on e.deptno=d.dno and (dno=20 and job=‘经理’)
or (dno=30 and job=‘销售员’ and sal>12000)
左外连接
左外连接查询 : 是join的一种外链接查询的方式之一
格式: select … from 表1 left outer join 表2 on 表1.外键=表2.主键
注意:outer 可以省略
把左边的表中的数据全部显示,如果右表有数据对应则显示;如果没有数据对应,则以null补
全
select * from employee , dept where employee.deptno=dept.dno
select * from employee inner join dept on employee.deptno=dept.dno
– 查询员工信息及所属的部门信息,人员信息必须展示所有
select * from employee left outer join dept
on employee.deptno=dept.dno
select * from employee left join dept
on employee.deptno=dept.dno
order by sal desc;
右外连接
右外连接查询 : 是join的一种外链接查询的方式之一
格式: select … from 表1 right outer join 表2 on 表1.外键=表2.主键
注意:
outer 可以省略
把右边的表中的数据全部显示,如果左表有数据对应则显示;如果没有数据对应,则以null补全
– 查询员工信息及所属的部门信息,人员信息必须展示所有
select * from dept right outer join employee
on employee.deptno = dept.dno
select * from dept right join employee
on employee.deptno = dept.dno
全外连接查询
全外连接查询: 是join外连接查询的方式之一
格式: select … from 表1 full outer join 表2 on 表1.外键=表2.主键
注意: mysql默认不支持全外连接查询,oralcle和DB2才支持
解决方案:
并集查询 union 非并集查询 union all
– union : 获取两条sql语言查询结果的并集【把两个查询语句的结果合并,如果相同则去除重复,如果不同,则展示】
– 注意: 两条sql语句查询的结果列要保持一致
– 查询所有的员工信息和部门信息,要求全部要展示人员信息和部门信息
– 1, 查询所有的员工信息和部门信息,人员信息全部展示
select * from employee left join dept on deptno=dno
– 2,查询所有的员工信息和部门信息,部门信息全部展示select * from employee right join dept on deptno=dno
– 3,把以上两条sql求其并集
select * from employee left join dept on deptno=dno
union
select * from employee right join dept on deptno=dno
– union all
select * from employee left join dept on deptno=dno
union all
select * from employee right join dept on deptno=dno
自连接
子连接查询 : 把一张表当成多张表来使用查询
格式: 一张看成多张并取别名查询
– 查询员工的姓名和工资及其上级的姓名
select yg.ename,yg.sal,yg.mgr,sj.empno,sj.ename from employee yg ,employee
sj
where yg.mgr = sj.empno
– 查询员工的姓名和工资及其上级的姓名,如果没有上级也要展示
select yg.ename,yg.sal,sj.ename from employee yg left join employee sj
on yg.mgr = sj.empno
– 查询入职时间早于其上级的员工的信息
select yg.* from employee yg,employee sj
where yg.mgr = sj.empno and yg.hiredate<sj.hiredate
子连接查询
子连接查询 : 查询的sql中会存在多条查询语句进行整合
方式:
1, 把一条查询语句的结果当成另一条查询语句的条件
2,把一条查询语句的结果看成一张虚拟表,再此表中进行联合查询
结果情况:
单行单列 > >= < <= = !=
多行单列in not in
多行多列虚拟表
select * from employee;
– 查询与甘宁再同一部门的员工信息
– 1,先查询甘宁所在的部门编号
select deptno from employee where ename=‘甘宁’
– 2,然后把1中查询的编号当成条件来查询员工信息
select * from employee where deptno=20select * from employee
where deptno=(select deptno from employee where ename=‘甘宁’)
– 查询研发部中的所有的员工信息和部门信息
select * from employee,dept
where employee.deptno=dept.dno and dept.dname=‘研发部’
– 查询研发部中的所有的员工信息
– 1,先查询研发部的部门编号
select dno from dept where dname=‘研发部’
– 2,再根据部门编号来查询员工信息
select * from employee where deptno=10;
select * from employee where deptno=(select dno from dept where dname=‘研
发部’);
– 查询工资高于张飞的员工信息
– 1,先查询张飞的工资
select sal from employee where ename=‘张飞’
– 2,根据工资进行条件查询
select * from employee where sal>24500
select * from employee where sal>(select sal from employee where
ename=‘张飞’)
– 查询工资再 谢逊和黛丽丝 工资之间的员工信息
– 1查询谢逊的工资
select sal from employee where ename=‘谢逊’
– 2查询黛丽丝的工资
select sal from employee where ename=‘黛丽丝’
– 3根据1,2的查询结果作为条件,查询
select * from employee
where sal>(select sal from employee where ename=‘黛绮丝’)
and sal<(select sal from employee where ename=‘诸葛亮’)
– 查询销售部和研发部下的所有的员工信息
– 1,查询研发部和销售部的部门编号
select dno from dept where dname in(‘研发部’,‘销售部’)
– 2,根据部门编号来查询员工信息
select * from employee
where deptno in(select dno from dept where dname in(‘研发部’,‘销售部’))
– 查询员工的姓名和工资
– 1,先查询员工的所有的信息
select * from employee;
– 2,把1中的结果当成一张虚拟表,再此表中查询姓名和工资
select s.ename,s.sal from (select * from employee) s
– 查询部门信息及该部门的员工人数
– 1,查询部门编号及该部门的员工人数
select deptno,count(1) from employee group by deptno
select * from dept;
– 2,把1中查询的结果当成虚拟表,与dept表进行联查即可
select * from (select deptno,count(1) from employee group by
deptno)s,dept
where dept.dno=s.deptno
八、视图
视图:在数据库中用来简化复杂的sql语句的一种方式
一般可以把视图看成一张虚拟的表,其本质是一条复杂的sql语句
作用:
1、简化复杂的sql语句
2、用来隐藏敏感字段信息
创建视图:
Create view 视图名 as select 。。。。。
查询视图:
Select。。。From视图名 where,,,order by 。。Limit。。
删除视图:
Drop view 视图名;
九、索引
索引是一种允许直接访问数据库表中某一数据行的属性结构,为了提高查询效率而引入,是独立鱼表的对象,可以存放在与表不同的表空间(TABLESPACE)中
索引记录中存有索引关键字和指向表中数据的指针(地址)。对索引进行的I/O操作比对表进行操作要少很多。
索引一旦被建立就将被Rracle系统自动维护,查询语句中不能用指定使用那个索引,是一种提高查询效率的机制
索引类似于书本的目录,主要目的是提高查询效率的
如果创建一个索引,则该索引对应的保护空间就会是原来的1.5倍左右。
分类: 主键索引、唯一索引、外键索引、普通索引
创建索引:
Create index 索引名 on 表名(列名,列名,);
修改索引:
Alter index 索引名 rebulid
删除索引:
Drop index 索引名称 on 表名
为提高查询效率,创建和使用索引的原则:
为经常出现在where子句中的列创建索引
为经常出现在order by、distinct后面的字段建立索引。如果建立的索引是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致
为经常作为表的连接条件的列创建索引
不要在经常做DML操作的表上建立索引
不要在小表上建立索引
限制表上的索引数目,索引并不是越多越好
删除很少使用的,不合理的索引
列中值较少的不要加索引
索引
create index in_ename on employee(ename);
– 复制表
create table emp select * from employee;
select * from emp;
– 短期内插入大量数据
insert into emp select * from emp;
select count(1) from emp;
– 根据ename来查询李博文的信息
select * from emp where ename=‘李博文’
– 没有索引 时间 1.817s
– 为ename加入索引
create index in_ename on emp(ename)
– 加入索引后 时间 0.001s
select * from emp where ename=‘李博文’
十、事务
事务的四大特性:ACID:原子性(atomicity,或称为不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)
·原子性:一个事务中所有的操作,要么全部完成,要么全不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
·一致性:在事务开始之前和事务结束之后,数据库的完整性没有被破坏,这表示写入的资料必须完全符合所有的预设规则,这包含资料的精准度、串联性以及后续数据库可以自发性地完成预定的工作。
·隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,事务隔离分为不同级别,包括读未提交,读提交,可重复读,串行化
·持久化:事务处理结束后,对数据的修改就是永久的,即便系统故障依然不会丢失。
事务:
mysql中的事务自动提交,默认是每一条sql都是一个单独的事务
oracle中的事务不会自动提交,默认事务是开启,如果你没有提交,则事务不会提交
开启事务:begin / start trancation
提交事务:commit
事务回滚: rollback
-- 事务
select * from employee;r
-- mysql 默认每一条sql都是一个事务,会自动提交
update employee set sal=40000 where ename='诸葛亮'
-- 开启事务
begin
update employee set sal=30000 where ename='诸葛亮'
select * from employee;
delete from employee where job='销售员'
-- 回滚 数据会恢复到修改和删除前
rollback;
-- 提交 如果提交,则上面的临时修改和删除会直接作用再真实表中,实现修改和删除
commit
查询事务是否默认提交:
select @@autocommit; 1 : 自动提交 0 :手动提交
修改事务的提交方式:
set @@autocommit = 值;
设置保存点:
savepoint 保存点名;
回滚到保存点:
rollback to 保存点;
-- 8上班 设置保存点a
savepoint a;
update employee set sal=8000 where ename='诸葛亮'
-- 9 设置保存点b
savepoint b;
update employee set sal=9000 where ename='诸葛亮'
-- 10 设置保存点c
savepoint c;
update employee set sal=10000 where ename='诸葛亮'
-- 11 发现10点后的DML有错误,回滚到c保存点
select * from employee;
rollback to c;
-- 都成功,则提交事务即可
Commit;
十一、权限:
一个用户是否拥有操作表的能力
权限列表
Insert
Select
Update
Delect
All
授权和撤回权利
表操作:
数据库.表名
数据库.*
.*
为用户赋予权限:
Grant 权限列名 on 数据库.表名 to ’用户名’@’主机’
从用户中撤回权限:
Revoke 权限列名 on 数据库.表名 from ’用户名’@’主机’
来源:oschina
链接:https://my.oschina.net/u/4300166/blog/4873628