MySql成功完结

        前两天把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,学完这一小节再和大家分享吧!

        

        

                        

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值