1.什么是数据库?DBMS
DBMS:DataBaseManagementSystem,数据库管理系统 (数据库软件)
常见的DBMS:Oracle、MySQL、DB2、SQLserver、sqlite、Mariadb等
1.开源:开放源代码,产品免费,靠卖服务盈利,有大拿无偿维护升级
2.闭源:不开放源代码,产品收费,靠卖产品和服务盈利,有大拿攻击找漏洞,但是人家公司会花钱杨一帮人维护升级
2.数据库分类
2.1.关系型数据库:经过数学理论验证可以保存现实生活中的各种关系,以表为单位保存数据
2.2.非关系型数据库:主要解决特定的场景文体,比如数据缓存,已键值对形式在内存中保存数据
3.常见关系性数据库介绍
1.MySQL:Oracle公司产品,开源产品,08年被Sun公司收购,09年Sun被Oracle收购,传言要闭源,MySQL创始人们不爽。离职创办MariaDB,市场占有率第一
2.Oracle:Oracle公司产品,闭源,性能和价格都是最高 市场占有率第二
3.SQLserver:微软产品,闭源,主要应用在微软整体解决方案当中,市场占有率第三。
4.DB2:IBM公司产品,闭源,主要应用在IBM整体解决方案当中
5.SQLite:轻量级数据库,只具备最基础的增删改查操作,主要应用在嵌入式设备和移动设备中
6.Mariabd:是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL
4.什么是SQL
Structured Query language结构化查询语言,用于程序员和数据进行沟通
5.安装数据库
详情见数据库安装
6.连接数据库
6.1.Linux:桌面任意位置邮件打开终端,输入:
mysql -uroot -p 直接回车 填写密码 再回车
6.2.Window:1)win+R输入cmd 回车 弹出终端
mysql -uroot -p 直接回车 填写密码 再回车
2)开始菜单-所有程序-找到MySQL-MySQL Client-输入密码回车
6.3退出命令:exit
6.4导入数据库:
Window:source 导入数据库文件的路径(如:D:/java/***.sql)
Linux:source 导入数据库文件的路径(如:/home/soft01/桌面/***.sql;)
7.库相关SQL
7.1查看所有数据库: show databases;
7.2创建数据库:create database 数据库名 character set utf8/gbk;
7.3.查看数据库详情: show create database 数据库名;
7.4.删除数据库:drop database 数据库名;
7.5使用数据库: use 数据库名;
8.表相关SQL
!!!!前提一定是使用了数据库!!!看7.5
如若不懂数据类型者详情可看:MySQL数据库类型详解总结大全-有哪些以及取值范围 - secsafe - 博客园
SQL数据类型
1.整数 int 和 bigint(等效long)
2.浮点数: double(m,d)m代表总长度 d代表小数长度
52.342 m=5 d=3
decimal(m,d):超高精度的浮点数,当涉及超高精度运算时使用
3.字符串: char(m) m代表字符长度 固定长度 最大长度255
varchar(m) 可变长度 最大长度65535 但是超过255建议使用 text
text(m) 可变长度 最大长度65535
4.日期
data:只能保存年月日
time:只能保存时分秒
datatime:保存年月日时分秒 默认值为null 最大值9999-12-31
timestamp(时间戳):保存年月日时分秒 默认值为当前系统时间:2038-1-19
8.1创建表:create table 表名(字段1名 字段1类型,字段2名 字段2类型,.....);
8.2查询表详情:show create table 表名;、
8.3表引擎:InnoDB和MyISAM
innodb:默认,支持数据库的高级操作,如:外键、事务等
myisam:只支持基础的增删改查操作
两种类型最主要的差别是InnoDB支持事务处理与外键和行级锁。
8.4创建表的时候指定引擎和字符集:
create table 表名(字段1名 字段1类型,字段2名 字段2类型,.....)engine=innodb/myisam charset=utf8/gbk;
可以执行8.2查看有何不同。
8.5查看表字段:desc 表名;
8.6删除表: drop table 表名;
8.7查询所有表:show tables;
8.8修改表名:rename table 原名 to 新名;
可以执行8.7查看表名是否修改了。
8.9修改引擎和字符器:alter table 表名 engine=myisam/innodb charset=utf8/gbk;
别看了没有图。。。引擎很少修改,要记住修改字符集的语句!!charset
8.10添加表字段:
最后添加格式:alter table 表名 add 字段名 字段类型;
最前添加: alter table 表名 add 字段名 字段类型 first;
在xxx的后面:alter table 表名 add 字段名 字段类型 after xxx;
其余剩下感兴趣可以自行测试。
8.11删除表字段:alter table 表名 drop 字段名;
8.12修改字段名和类型: alter table 表名 change 原名 新名 新类型;
9.数据库相关SQL
9.1.新增数据(插入数据):注意插入的值要和表中字段一样,比如表中只有两个字段不可以插入三个值!!!!
9.1.1全表插入格式: insert into 表名 values(值1,值2);
9.1.2.指定字段插入格式:insert into 表名(字段1,字段2) values(值1,值2);
9.1.3.批量插入:在values后面通过,将多组数据写到一起
insert into 表名 values(3.5,10),(4.6,11),(5.7,12);
中文问题:如果执行报错执行:set names gbk;
9.2查询数据 :select 字段名 from 表名;
select agefrom student;//查询所有age
select bonus,age from student;//查询所有bonus和age
select * from student;//查询t1里所有信息
select *from student where age<11;//查询age小于11的所有信息
9.3修改数据:update 表名 set 字段名=值 where 条件;
update student set bonus=50.5 where age=12; //修改单个
update student set age=18;//所有数据都改成18
9.4删除数据: delete from 表名 where 条件;
delete from student where bonus=5.700; //删除单个
delete from student where age=10; //删除单个
delete from student ;//删除 student 里所有的数据
10.主键约束 primary key
什么是主键:表示数据唯一性的字段称为主键(如我们的身份证号码)
什么是约束:创建表时给表字段添加的限制条件(如不能为空,不能重复)
什么是主键约束:限制主键的值 唯一且非空
格式:create table t1(id int primary key,name varchar(10),age int);
失败的原因:主键为1的值已经存在
11.主键约束 + 自增 primary key auto_increment
规则:从历史最大数的基础上+1 只增不减
create table t3(id int primary key auto_increment,name varchar(10));
12.是否为空 is null \ is not null
select * from emp where manager is null; //查询emp表中上级领导为空的人
select * from emp where manager is not null; //查询emp表中上领导不为空的人
13.去重 distinct
去除重复的字段只显示一次。
select distinct job from emp; //查询emp表中有什么部门
14.多行结果显示一行 group_concat()
select id,group_concat(job) from emp where manager =4;
应用场景:一个学生对应多门科目成绩可以使用他来查询
15.比较运算符 > < >= <= = != 和<>(不等于)
select name,sal from emp where sal<2000; //查询工资小于2000的人的名字和工资
select name,sal,job from emp where job='CEO'; //查询岗位是CEO的人的名字,工资,岗位
select name,job,sal from emp where sal<=1600; //查询工资小于等于1600的人
select name,job from emp where job!='销售'; //查询岗位不是销售的人
select name,job from emp where job<>'销售'; //查询岗位不是销售的人
注意:<> 是不等于的意思。
16.和\或 and 和 or
如果查询数据需要满足多个条件使用and
如果查询数据只需要满足某一个条件就可以使用 or
select name,sal,deptId from emp where deptId=1 and sal<2000;//查询1号部门中工资低于2000的人
select * from emp where deptId=3 or sal>3000; //查询部门为1 并且工资是3000以上的人
17.模糊查询 like
% 代表0或多个未知字符
_代表1个未知字符
举例:
1.查询第一个字符是x x%
2.查询最后一个字符y %y
3.查询倒数第二个是x %x_
4.以x开头以y结尾 x%y
5.包含x %x%
6.第二个字符是x倒数第三个字符是y _x%y__
select name,sal from emp where name like '_八%'; //查询名字第二个字符是八的员工姓名和工资
18.包含 between x and y(包含x和y)、
select name,sal from emp where sal between 2000 and 3000;//查询工资再2000和3000之内的员工
19.多个条件 in
//查询工资为800,1250,1500的员工信息
select * from emp where sal in(800,1250,1500);
20.排序 order by asc/desc
order by 字段名;( asc 默认不写升序)/desc降序
select name,sal from emp order by sal; //查询每个员工的姓名和工资按照工资升序排序
select name,comm from emp where deptId=3 order by comm desc; //查询3号部门每个员工的姓名和奖金按照奖金降序排序
21.分页查询 limit
格式:limit n,m n:请求页数,m:每一页显示几行数据
select * from emp limit 4,2; //查询员工表信息 第五页 每页两条数据
22.数值计算 + - * / %
select name,sal,sal+1000 from emp; //查询员工表中每个员工涨薪1000块钱之后的姓名、涨薪前工资和涨薪后工资
23.聚合函数 平均值,最大值,最小值,求和,计数
对查询的多条数据进行统计查询:平均值,最大值,最小值,求和,计数
平均值:avg(字段);
select avg(sal) from emp where deptId=3; //查询3号部门的平均工资
最大值:max(字段);
select max(sal) from emp where deptId=1; //查询1号部门工资最高值
最小值:min(字段);
select min(sal) from emp where deptId=2; //查询2号部门工资最低值
求和:sum(字段);
select sum(sal) from emp where deptId=3; //查询员工表中3号部门的工资总和
计数:count(字段或*);
select count(*) from emp where deptId=2 and sal>2000; //查询2号部门工资大于2000的员工人数
24.分组查询 group by
格式:group by 字段
select deptId,avg(sal) from emp group by deptId; // 查询每个部门的平均薪资
select deptId,sum(sal) from emp group by deptId; //查询每个部门的工资总和
25.having
from后只能写普通的字段提交建,如果条件是聚合函数的条件则需要使用having
having一定要配合group by结合使用
select deptId,avg(sal) from emp group by deptId having avg(sal)>2000;
//查询每个部门的平均工资 要求查询平均工资大于2000的
别名:
select deptId 部门编号,avg(sal) a from emp group by deptId having a>2000;
//这里deptId字段变成了部门编号,而我们avg(sal)后的a最后可以当做条件去判断
sql语句执行顺序:
select ... from 表名 where ... group by ... having ... order by ... limit ...;
26.子查询(嵌套查询)
select * from emp where sal>(select avg(sal) from emp);
//查询工资高于平均工资的员工信息
select * from emp where sal=(select max(sal) from emp);
//查询员工表中工资最高的员工信息
select * from emp where sal>(select max(sal) from emp where deptId=2);
//查询工资高于2号部门最高工资的员工
27.关联查询
同时查询多张表的查询方式称为关联查询
关联查询必须写关联关系,如果不写会得到两张表数据的乘机 (2次方)这个乘机叫做笛卡尔积,这是一个错误的查询。
关联关系:指创建表时两张表之间存在的业务关系(外键)
外键:用于建立关系的字段称为外键,一个表中只有一个主键但可以有多个外键
一对一:假如有A\B两张表,A表中一条数据对应B表中的一条数据,同时B表中一条数据对应A表中一条数据。(比如一个人对应一个身份证号,一个身份证号对应一个人)只需要再表中添加外键指向主表主键即可。(如emp表中字段deptId对应dept表中字段id)
一对多:有AB两张表,A表中一条数据对应B表中多条数据,同时B表中一条数据对应A表中一条数据。
如何建立关系:在多的表中添加外键指向另外一张表的主键
多对多:有AB两张表,A表中一条数据对应B表中多条数据,同时B表中一条数据也对应A表中多条数据
如何建立关系:创建一个单独关系表,表中两个外键字段指向其他两个表中的主键
27.1等值链接
select d.name,e.name from emp e,dept d where e.deptId=d.id;
//查询每个员工的姓名和对应部门表中的职位
27.2内连接
select * from emp e join dept d on e.deptId=d.id where e.job='销售';
//查询job是销售的每个员工的信息和对应部门表中的信息
注意:等值链接和内连接查询到的数据都是两张表的交际数据。
27.3外链接(左left/右right)
select e.nam,e.job,d.name d.loc from emp e left/right join dept d on e.deptId=d.id where e. job='销售';
//查询job是销售的每个员工的姓名,工作和对应部门表中的信息
注意:用作教学使用*号,在实际中要考虑运行效果,一些不必要的信息可以省略,我们要用具体的字段去代替*号。
28MySQL数据优化
查询时,能不用* 就不用,尽量写全字段名。
索引不是越多越好,每个表控制在6个索引以内。范围where条件的情况下,索引不起作用,比如where value<100。
大部分情况连接效率远大于子查询,但是有例外。当你对连接查询的效率都感到不能接受的时候可以试试用子查询,虽然大部分情况下你会更失望,但总有碰到惊喜的时候不是么...
有时候可以1条大的SQL可以分成几个小SQL顺序执行,分了吧,速度会快很多。
连接时注意:小表 jion 大表的原则。
尽量避免使用order by。
因为where子句后面的条件是执行顺序是从右到左,所以尽量把能过滤掉大部分数据的条件放在最后。