前两天把mysql大概都学完了,挺简单的,都是一些逻辑性或者背的东西(见名知意的),下面就来简单总结一下,有些地方不是很充分也欢迎来评论补充交流!
一、首先先看语法(学完语法才能对概念理解的更加透彻,我是这么认为的)
1.连接mysql服务器:在dos窗口下输入
mysql -u用户名 -p -h主机名或ip地址 -P端口(可以不写,默认locahost,3306)
2.退出mysql:quit
3.注释:/**/ 或者--空格(感觉在黑窗口下不常用)
4.撤销语句:\c
5.查看mysql中所有数据库:show databases (mysql自带4个库,千万别乱动啊!)
6.进入库:use 库名;(进入库中才能对表做操作)
7.查看本库中所有表:show tables;
8.创建库:create database 库名 charset utf8;(后面一定要加u8编码,不然插入中文数据时会出现乱码问题)。
9.删除库:drop database 库名;
10.小注释:创建库删除库,创建表和删除表时都可以在库名或表名前加上if exists (如果存在的意思,存在就删除,存在就不创建,语句不会报错的)。
11.创建表:create table(属性名称 类型 约束(有则写,没有就不写),..........);
12.删除表:drop table if exists 表名;如果存在就删除
13.查看表结构:desc 表名;
14.向表中插入数据:insert into 表名(列名1,列名2........) value(值1,值2........)必须一一对应,也可以简写insert into 表名 values(数据用逗号隔开);,values可以一个事务下插入多条数据,节约了事务开启关闭的损耗。
15.修改表结构:添加列 alter table 表名 add column 字段名 字段类型 约束(没有可不写) ;
删除列 alter table 表名 drop column 字段名;
16.修改表中数据:update 表名 set 列=值;(全部属性)
update 表名 set 列=值 where 条件(一般是key值);
17.删除表中记录:delete from 表名 where 条件;(删除符合条件的记录)
delete from 表名;(删除表中所有记录)
18.查询表中记录:select * from 表名;(查询所有,*是通配符)
select 列一,列二,.... from 表名;(查询指定列,把*换成属性名就可以)
19.查询中去除重复记录:select distinct 属性 from 表名;(distinct去重)
20.限制筛选查询:select 列名 from emp where 筛选条件;
21.对null数据做处理:null与任何数据运算都是null,这样有时会出现问题,用ifnull(属性名,用什么来代替null)来解决。
22.起别名:有时为了自己的方便,有时为了更好的展现,我们需要给查询到的数据起个别名,在属性名后加 As 别名 就可以,也可以省略As不写。
23.指定查询数据:while 属性名=什么 or(或者的意思) 属性名=什么。
这样数据太多的情况下会很麻烦,可以用 属性名 in(值,值,值....)来解决
24.范围查询数据:同上,把or换成and,也可以用between 小值 and 大值;来解决
25.模糊查询:%是通配符,可以表示0个或多个字符。_是通配符,可以表示一个字符
例:以刘开头的 select * from emp where name like '刘%';
like是像的意思。
26.函数查询:count(列名,或者*,或者1(列名和1的效率较高))
max(列名):最大值
min(列名):最小值
avg(列名):平均值
sum(列名):求和
27.分组:在表名后面加group by 要分组的属性。一般多配合函数使用,分组后进行筛选用having,不能用where,否则报错
28.排序:在表名后面加order by 要排序的属性。默认升序,后面加desc可降序
29.分页查询:表名后面加limit 每页显示几条记录。也可以括号(从第几条数据-1开始 ,显示后面的几条数据)。
30.还有一些函数,大概说一下:
/ 转义
floor()向下取整
ceil()向上取整
round()四舍五入
ifnull(字段名,为空的话替换成什么)是否为空
replace(字段名,要替换的,换成什么)替换
substr(截取的字段,从哪里开始截取,截取的长度(可以不加默认截取到最后))截取函数
upper()转成大写
lower()转小写
length()求长度(1个汉字占三个长度)
concat(要拼接的字段,要拼接的内容) 拼接函数
curdate() 获取当前日期,格式是:年月日
curtime() 获取当前时间 ,格式是:时分秒
sysdate()/now() 获取当前日期+时间,格式是:年月日 时分秒
year(date) 返回date中的年份
month(date) 返回date中的月份
day(date) 返回date中的天数
hour(date) 返回date中的小时
minute(date) 返回date中的分钟
second(date) 返回date中的秒
decimaldecimal(P,D);
p表示的是总位数
d表示的是小数点后的位数
31.日期类型:date:日期类型;年月日
time:事件类型;时分秒
datetime:日期加时间;年月日 时分秒
timestamp:时间戳;年月日 时分秒,和datetime不同的是
1,范围:datetime范围是1000-9999(年份)
timestamp范围是1970-2038(年份)
2.使用上区别:datetime实际存的就是一个`年月日 时分秒`格式的日期+时间。 而timestamp实际存储的是这个从1970年1月1日到这个日期+时间的时间毫秒值
例: create_time timestamp, 2018-2-3 14:45:56
实际存储的是 1970年1月1日到2018-2-3 14:45:56时间的时间毫秒值
32.mysql的字段约束:在创建表时,数据类型的后面添加
主键约束:primary key(基本每个表都有主键,不可重复不能相同)
外键约束:foreign key(列名) references 关联的表名(列名) -- 指定外键
本表的那一列为外键,关联哪一个表的那一列属性
注:表关系为1v1(随意添加);1vN(N方添加);NvN(随意)
级联删除:on delete cascade(强制删除,把部门和它关联的员工全删除)
非空约束:not null(不能为空,但可以重复)
唯一约束:unique(不可重复)
检查约束:check(检查条件)
自增:auto_increment(id什么的可以自动增加,插入数据时可以写null)解释:在设置完主键自增之后,表中会维护一个AUTO_INCREMENT的值,这个值从1开始,如果插入主键时没有给主键赋值,就会从AUTO_INCREMENT这里获取一个值再作为主键插入到表中。再用完之后,会自动将AUTO_INCREMENT的值加1
33.为建立好的表修改属性值:alter table 表名 modify 列名 数据类型 primary kry auto_increment(为列名添加主键和自增),当和当前表内容重复时会报错,可以先desc看一下表的结构再做修改,也可以删除
34.连接查询:可以查询多张表,只不过这样是查出它们的笛卡尔积,没什么用,一般要加上条件,而且如果属性名重复的话可以用表名点属性名,这样就不怕重复了。
35.内连接:select * from 表一 inner join 表二 on 条件;(将相同的部分展现出来,不同的删去)
36.左外连接:select * from 表一 left join 表二 on 条件;(左边的表全部展现,右边的表展现符合条件的,其他全为null)
37.右外连接:select * from 表一 right join 表二 on 条件;(右边的表全部展现,左边的表展现符合条件的,其他全为null)
38.自连接查询:对同一张表做两次操作,为了区分表必须要起别名
注:有一个小表驱动大表原则,左连接就作为小表,右连接就右表作为小表,内连接就选择数据量小的作为驱动表。
39.子查询:将一个SQL语句的执行结果作为另外一条SQL语句的条件来执行, 这就是子查询!
例:select name, sal from emp where sal>(select sal from emp where name='王海涛');
40.传输编码: set names gbk;
这个命令是用在cmd窗口中用来通知数据库服务器, 当前cmd窗口发送给服务器的数据的GBK的,那么服务器就会按照GBK编码来接收 cmd窗口发送过来的数据, 再将GBK的数据转换成utf8编码的数据存入数据库中! 这个命令只能用在cmd窗口! 而且是每次新开一个cmd窗口都需要重新设置一次!
像Navicat/SQLYog等工具不需要设置该命令,因为这些工具底层已经设置过编码了!
41.添加单值索引:create index 索引名 on 表名(字段)一个索引只添加一个列
42.添加唯一索引:alter table 表名 add unique(列名) 索引列的值不可重复
43.创建复合索引:alter table 表名 add index 索引名(哪些列) 一个索引包含多个列
44.创建符合唯一:alter table 表名 add unique 索引名(那些列)
45.查看索引:show index from 表名
46.备份数据库:单个备份:在cmd窗口(未登录、未连接到mysql服务器的界面)中,可以通过如下命令对指定的数据库进行备份:
mysqldump -u用户名 -p密码 库名 > 备份文件的位置
没有报错表示成功,但是只会备份数据,不会备份数据库结构
示例1: 对db40库中的数据(表,表记录)进行备份,备份到 d:/db40.sql 文件中
mysqldump -uroot -proot db40 > d:/db40.sql
多个备份:mysqldump -u用户名 -p密码 --databases 库名1 库名2 ... > 备份文件的位置
没有报错表示成功,会把数据和数据库结构一起备份
全部备份:mysqldump -uroot -proot -A > d:/dball.sql
47.恢复数据库:单个恢复:在cmd窗口中(未登录的状态下),可以通过如下命令对指定的数据库进行恢复
mysql -u用户名 -p密码 库名 < 备份文件的位置
示例1: 将 d:/db40.sql 文件中的数据恢复到 db60 库中
1) 先在cmd窗口中(已登录的状态下), 先创建db60库
create database db60 charset utf8;
2) 再回到cmd窗口中(未登录的状态下), 执行下面恢复的命令
mysql -uroot -proot db60 < d:/db40.sql
多个恢复:
在cmd窗口中(已登录的状态下),可以通过source命令来执行指定 位置的sql文件中的sql语句:
source sql文件的位置
示例2: 将 d:/db40.sql 文件中的数据恢复到 db80 库中
1) 先创建db80库, 并进入到db80库
create database db80 charset utf8;
use db80;
2) 再通过source命令执行 d:/db40.sql 文件中的sql语句
source d:/db40.sql
示例3: 将 d:/db2040.sql 文件中的数据恢复回来
1) 将db20,db40库删除(模拟数据丢失)
drop database db20;
drop database db40;
2) 再通过source命令执行 d:/db2040.sql 文件中的sql语句
source d:/db2040.sql
二、概念、
数据库:数据库是一个专业的存储和管理数据的仓库
分类:早期: 层次式数据库,网络型数据库
现在: 关系型数据库,非关系型数据库
现在市面上大部分用的还是关系型数据库
关系型数据库:底层以二维表的形式保存数据的库,就是关系型数据库
常见的关系型数据库:Oracle: 甲骨文公司提供的一款数据库产品,收费的,之前在Java中的市 场份额超过50%。主要适用于一些大型或者超大型应用系统。
SQL Server: 微软提供的一款数据库产品,收费,主要适用于一些中型或 者大型的应用系统
MySQL: 瑞典的一个公司(MySQLAB)提供的一款数据库产品,特点是 小巧轻量,简单易用,适用于一些小型或中型的应用系统,如果做mysql集群,也可以用于一些大型或者超大型系统。免费mysql被甲骨文收购了!
SQLite: 迷你数据库, 用于嵌入式设备(手机/智能家居等产品)
数据库服务器:其实就是你安装的哪个mysql软件,将mysql安装在计算机上,那么这台计算机 就可以作为数据库服务器使用,可以实现数据的存和取。一个数据库服务器中可以包含多个数库。
数据库:数据库就是存储数据的仓库,通常情况下一个网站(系统)中的所有数据会存放在一个数据库中
表: 数据库中的数据是安装类型存放的, 一类数据往往存储在一张表中, 一个数据库中可以创建多张表!
表记录: 一张表中可以包含多行表记录, 一张表中用于存储一类信息, 一行表记录就用于存储某一个具体的数据
SQL语言:是一门操作关系型数据库的通用的语言(学会了SQL可以操作所有的关系型数据库),但是每个数据库都有自己的方言,方言不通用。
三、数据库优化
1, 尽量使用字段名代替*
2. char和varchar斟酌使用:
1) char和varchar存的数量是不同的, char类型最多能存255个字符, varchar类型最多能存65535个字节(具体达不到65535,但是也差不多)
2) char类型如果存的数据量小于最大长度, 剩余的空间会使用空格填充, 因此可能会浪费空间所以char类型适合存储长度固定的数据, 这样既不会浪费空间, 效率还比varchar略高
3) varchar类型如果存的数据量小于最大长度, 剩余的空间会留给别的数据使用,所以varchar类型适合存储长度不固定的数据, 这样虽然没有char存储效率高, 但至少不会浪费空间。
3.字段里的值,最好用数字代替字符串
4.尽量把过滤条件精细,能用and不用or
5.索引的设计,最多3个,不能太多
6.模糊查询,尽量要确定开始元素,让索引生效
7.数据库对数字没有严格的要求,name=123索引失效,name='123’索引生效
8.无用的索引最好及时删除(索引相当于增加冗余数据,但是增加了查询效率)
9.视图:这个不常用了,也是通过增加冗余数据来增加操作的方便性。
四、数据库事务管理
简单来说,事务就是将一堆的SQL语句绑定在一起执行, 执行结果是: 所有SQL都执行成功了才算成功, 但凡有一条失败, 就按全失败来处理(比如即使执行成功的语句,也会进行回滚,就是撤销当前的执行)。
开启事务:begin 或 start transaction;
关闭事务:commit(提交事务)/ rollback(回滚事务)
事务的四大特征:原子性:原子曾被认为是最小单位,不能被分割, 这里的原子性其实是指:
事务中的所有SQL是一个整体,不能被分割。不存在一部分SQL执行成功,而另一部分SQL执行失败,都执行成功才算成功,有一条失败就算失败!
一致性:在事务执行前后(不管事务最后是提交还是回滚)的业务数据之和是保持一致的!
隔离性:在事务并发时, 一个事务理论上看不到另外一个事务的状态, 也就是说事务之间是相互隔离开来的!
持久性:一旦事务提交之后, 事务中对数据的更新操作会持久的保存到数据库中(最终是更新到硬盘的数据文件里)。反过来说, 在事务提交之前, 对数据的更新操作只是一个临时的数据, 没有真正的去修改数据库。
这里我对数据库的总结和了解就到此为止了,以后如果学到新的东西还会继续更新这个帖子的
下面我就开始学习JDBC吧,用JAVA来对数据库操作,当然这个只是基础过度,因为我知道还有Mybatis,学完这一小节再和大家分享吧!