mysql基础

1.SQL语句分类

DQL:数据查询语言(凡是带有select关键字的都是查询语句)

DML:数据操作语言(凡是对表当中的数据进行增删改的都是DML)

DDL:数据定义语言 (凡是带有create、drop、alter的都是DDL)

TCL:事务控制语言(commit、rollback)

DCL:数据控制语言 (例如:授权grant、撤销权限revoke…)

2.常用命令

退出mysql :exit;

查看mysql中有哪些数据库 :show databases;

选择使用某个数据库:use test;

创建数据库:create database xxxx;

查看某个数据库下有哪些表:show tables;

查看mysql数据库的版本号:select version();

查看当前使用的是哪个数据库:mysql> select database();

3.一些语法

1.between…and 两端为闭区间
2.and优先级比or高
3.in(a,b,c)括号里面接具体值,不是区间
4.like ‘%abc_’ , %表示匹配任意多个字符,下划线表示匹配一个字符

4.单行处理函数

单行处理函数的特点:一个输入对应一个输出。

和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)

  • lower() 转换小写;

  • upper 转换大写;

  • substr 取子串(substr( 被截取的字符串, 起始下标,截取的长度)),注意:起始下标从1开始,没有0;

  • concat(str1,str2)函数进行字符串的拼接;

  • length()取长度;

  • trim() 去空格;

  • str_to_date (‘字符串日期’, ‘日期格式’) 将字符串转换成日期,如果你提供的日期字符串是

    %Y-%m-%d,str_to_date函数就不需要了;

    date_format 格式化日期;

  • case…when…then…when…then…else…end
    ex:当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%,其它正常。
    select
    ename,
    job,
    sal as oldsal,
    (case job when ‘MANAGER’ then sal1.1 when ‘SALESMAN’ then sal1.5 else sal end) as newsal
    from
    emp;

  • round (字段,保留位数)四舍五入,保留位数默认保留整数位,1表示保留一位小数,-1表示保留到十位;

  • rand() 生成随机数

  • ifnull 可以将 null 转换成一个具体值,NULL只要参与运算,最终结果一定是NULL。为了避免这个现象,需要使用ifnull函数。
    ifnull函数用法:ifnull(数据, 被当做哪个值)

5.多行处理函数(分组函数)

sum,max,min,avg,count

6.SQL执行顺序

select

from

where

group by

​ having

​ …

​ order by
​ …

执行顺序:

​ 1.from

​ 2.where

​ 3.group by

​ 4.having

​ 5.select

​ 6.order by

所以分组函数不能直接使用在where后面,where后面执行的时候还没有group by;

所以在一条select语句当中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数。其它的一律不能跟;

where和having,优先选择where,where实在完成不了了,再选择having;

7.表连接

外连接表示将join关键字右边(或者left关键字左边的)的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边(右边)的表。在外连接当中,两张表连接,产生了主次关系

union合并查询结果集:union在进行结果集合并的时候,要求两个结果集的列数相同,结果集合并时列和列的数据类型也要一致(oracle要求,mysql可以执行)

8.分页limit

每页显示pageSize条记录
第pageNo页:limit (pageNo - 1) * pageSize , pageSize

9.truncate和delete

truncate:删除表中的内容,不删除表结构,释放空间;

delete:删除内容,不删除表结构,但不释放空间

区别:

​ truncate删除速度快,delete慢;

​ truncate不支持rollback回滚,delete删除数据后可以回滚;

​ truncate不触发任何删除数据的触发器;

​ truncate删除数据后,表和索引会恢复初始大小,delete不会减少表和索引所占空间

10.mysql添加字段

末尾添加:

​ ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件]

开头添加:

​ ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] FIRST

中间指定位置添加:

​ ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] AFTER <已经存在的字段名>

11.约束

  • 非空约束:not null;
  • 唯一性约束: unique;
  • 主键约束: primary key (简称PK);
  • 外键约束:foreign key(简称FK);
  • 检查约束:check(mysql不支持,oracle支持);

在mysql当中,如果一个字段同时被not null和unique约束的话,该字段自动变成主键字段。

对于一张表来说,只要是主键,或者加有unique约束的字段上会自动创建索引。

12.mysql存储引擎

mysql默认的存储引擎是:InnoDB,mysql默认的字符编码方式是:utf8

1.MyISAM

​ 特点:使用三个文件来表示每张表,格式文件存储表结构、数据文件存储表数据、索引文件存储表上索引

​ 优点:可被转换为压缩、只读表来节省空间;

​ 缺点:不支持事务,安全性低;

2.MEMORY(HEAP)

​ 特点:每个表以一个.frm格式的文件表示、不能包含TEXT、BLOB字段、表被存储于内存中

​ 优点:内存存储、速度快,不需要和硬盘交互

​ 缺点:不安全,数据会丢失

3.InnoDB

​ 特点:每个 InnoDB 表在数据库目录中以.frm 格式文件表示,InnoDB 表空间 tablespace 被用于存储表的内容(表空间是一个逻辑名称。表空间存储数据+索引)。提供记录事务性活动的日志文件,支持事务处理,mysql服务器崩溃后自动恢复,多版本mvvc

​ InnoDB最大的特点就是支持事务:以保证数据的安全。效率不是很高,并且也不能压缩,不能转换为只读,不能很好的节省存储空间。

13.事务

​ 事务可以使「⼀组操作」要么全部成功,要么全部失败,事务其⽬的是为了「保证数据最终的⼀致性」。

​ 事务的四大特性:原⼦性(Atomicity)、⼀致性(Consistency)、隔离性(Isolation)、持久

性(Durability)

1.原子性

​ 当前事务的操作要么同时成功,要么同时失败。

​ 原⼦性由undo log⽇志来保证,因为 undo log记载着数据修改前的信息,⽐如我们要 insert ⼀条数据了,那undo log 会记录的⼀条对应的 delete ⽇志,我们要 update ⼀条记录 时,那undo log会记录之前的「旧值」的update记录,如果执⾏事务过程中出现异常的情况,那执⾏「回滚」。InnoDB引擎就是利⽤undo log记录下的数据, 来将数据「恢复」到事务开始之前

2.隔离性(隔离级别)

​ 隔离性指的是:在事务「并发」执⾏时,他们内部的操作不能互相⼲扰。如果多个事务可以同时操作⼀个数据,那么就会产⽣脏读、重复读、幻读的问题

​ InnoDB引擎中提供四种隔离级别,分别是:read uncommit(读未提交)、read commit (读已提交)、repeatable read (可重复复读)、 serializable (串⾏),总的来说级别越⾼事务隔离性越好,但性能就越低

  • 读未提交(read uncommitted):事务B读取到了事务A还没提交的数据,会产生脏读现象;
  • 读已提交(read committed):事务B可以看到事务A的修改,解决脏读,存在不可重复读(事务B中前后读取同一数据不一致),oracle默认的隔离级别;
  • 可重复读(repeatable read):事务A提交之后事务B也读不到,事务B永远读取的都是刚开启事务时的数据,解决了不可重复读、存在幻读问题(读取的数据不真实),mysql默认隔离级别;
  • 序列化、串行化(serializable):这是最高隔离级别,效率最低。解决了所有的问题,这种隔离级别表示事务排队,不能并发!每一次读取到的数据都是最真实的,并且效率是最低的
3.持久性

​ ⼀旦提交了事务,它对数据库的改变就应该是永久性的。说⽩了就是,会将数据持久化在硬盘上。⽽持久性由redo log ⽇志来保证,当我们要修改数据时,MySQL是先把这条记录所在的「⻚」找到,然后把该⻚加载到内存中,将对应记录进⾏修改

4.一致性

​ ⼀致性可以理解为我们使⽤事务的「⽬的」,⽽「隔离性」「原⼦性」「持久性」均是为了保障「⼀致性」的⼿段,保证⼀致性需要由应⽤程序代码来保证。⽐如,如果事务在发⽣的过程中,出现了异常情况,此时你就得回滚事务,⽽不是强⾏提交事务来导致数据不⼀致

14.索引

相当于一本字典的目录,是一种提升检索速度的数据结构。

在mysql当中,主键上,以及unique字段上都会自动添加索引,创建索引的条件:

  • 数据量庞大
  • 该字段经常出现在where的后面,以条件的形式存在,也就是说这个字段总是被扫描
  • 该字段很少的DML(insert delete update)操作(因为DML之后,索引需要重新排序)

索引失效的情况:

  • like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效
  • or语句前后没有同时使用索引
  • 组合索引,不是使用第一列索引,索引失效
  • 在索引字段上使用not,<>,!=,不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
  • 对索引字段进行计算操作、字段上使用函数

15.视图

MySQL视图是一个虚拟表,是存储在数据库中的查询的sql 语句;

作用:

1.提高重用性,对于一些经常用sql查询的数据,可以建立视图,避免重复编写复杂的SQL语句。

2.不影响原有数据表结构的情况下重构数据库。

3.安全性,可以隐藏表的真实信息。

ex:create view view_table as select a.name, a.age from user as a;

16.数据库设计三范式

  • 第一范式:属性(即列)具有原子性,不可再分解
  • 第二范式:建立在第一范式的基础上,表中的每一列都与主键相关,不能产生部分依赖(主要针对联合主键)
  • 第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖

三范式是理论上的,为了追求速度有时候可能不会完全按照三范式来建表。(数据冗余换速度,sql编写难度也会降低)

建表口诀:

​ 一对多:两张表,多的表加外键;

​ 多对多:三张表,关系表两个外键;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值