MySQL简单回顾

之前发现MySQL有些东西忘光了,稍微回顾一下。

U1 注意事项

  1. 在下面的语句中,凡是出现不加引号汉字在实际中都需要换成实际的名字,如:Use 数据库名; 在实际中可能需要换成 use student;等
  2. 这里的内容都是我参考 《MySQL5.7从入门到精通》刘增杰 清华大学出版社 这本书的内容而来的
  3. Mysql中大小写不敏感,因此下面的有些大写有些小写(navicat自动补全的都是大写)
  4. 在这里有些注释以//开始,只有单行注释
  5. 这里有些例子都是我自己想的,可能不是最优的,只是用来展示知识点的,如有比较优秀的语句可以实现希望多多指正,不胜感激。
  6. 有些知识点目前用不到,学的动力不大,以后补上

U2 数据库存储引擎

             MySQL的默认存储引擎是innoDB存储引擎

U3数据库的基本操作

  1. navicat怎么查看操作日志
    1. 方法一:工具—>历史日志
    2. 方法二:CTRL+H
  2. 常见的表属性查看

Show databases;           查看现有哪些数据库

Use 数据库名;                    更改使用数据库

Show tables;                      查看现用数据库中的有哪些表

Describe 表名;             查看表基本结构,describe可以简写为desc

SHOW CREATE TABLE 表名;    查看表的详细信息(创建表时的语句,结果包括字符集和存储引擎)

 

3,常见表属性(或者称为字段,列)的修饰符:

             Auto_increment 自增

             Unique  唯一性声明

             Default 设置默认值

             Primary key 主键

             Foreign key 外键

             Not null 非空

  1. 修改数据表

(1)修改表名tb_test为tb_t

      alter TABLE tb_test RENAME tb_t;  

(2) 把表tb_t中的tb_name属性改为int(10)                 

     ALTER TABLE tb_t MODIFY tb_name int(10);    

(3) 把表tb_t中的tb_name属性改为int(10)类型的tb_age;

    alter TABLE tb_t CHANGE tb_name tb_age INT(10);  

(4) 在表tb_t中添加不为空的varchar(10)类型的属性tb_name,这里的修饰符有first(在第一列添加) after name (在name这一列添加)

    ALTER TABLE tb_t ADD tb_name VARCHAR(10) NOT NULL;

(5)把某一字段调整到另一字段之后,这里把tb_id放到tb_name之后

    ALTER TABLE tb_t MODIFY tb_id INT(10) AFTER tb_name;

(6)如果表之间有外键约束,在删除父表的时候会报错,可以先删除子表,逐层删除父表,或者取消约束条件

       本节注意:    (1)并不是每个表都需要有主键,但是多个表连接的时候需要用到主键,有的时候需要用到联合主键

(2)每个数据表都可以选择自己的存储引擎,但是外键约束不能跨引擎使用,因此存储引擎使用需谨慎

(3)自增字段可以设置初始值

U4常见数据的数据类型

  1. 货币  decimal类型
  2. 只记录日期year
  3. 只记录时间time
  4. 记录时间和日期timeStamp
  5. Char(定长字符串)varchar(变长字符串)
  6. Enum 多个值中取单值,如性别男女中取男
  7. Set多个值中可取多个值

本节注意:

  1. 在mysql中虽然可以存储媒体问价,但是出于性能的考虑一般选择存储这些文件的路径
  2. Mysql中大小写的区分,加上binary关键字

U5 mysql常见函数

数学函数

Abs(x)返回x的绝对值

Sqrt(x) 返回x的平方根(开方)

MOD(x,y)返回x%y

CEIL(x) 返回不小于x的最小整数

Rand(x)产生一个0到1的随机值,x是种子

Round(x)对x四舍五入

Sign(x)返回x的符号(-1,0,+1)

Pow(x,y)返回x的y次方

 

字符串函数

Char_length  计算字符串字符个数

 

日期时间函数

Curdate()  返回YYYY-MM-DD日期

Curtime() 返回系统当前时间

Current_timestamp()=localtime()=now()=sysdate()  返回当前的日期和时间

 

 

条件函数

If(expr(),a,b) 如果表达式expr()为true则返回a否则返回b

 

加解密函数

Password(str)   将str加密返回二进制字符串,不常用

MD5(str) 将str使用MD5加密返回二进制字符串

 

 

Encode(pwd,str)使用pwd作为密码加密str返回一个和str等长字符串a,常用

Decode(pwd,a)  和encode配对使用,用pwd作为密码解密a

 

U6,数据查询操作(重要)

包括对数据有选择的查询和按格式输出,最主要的关键字是select ,上面U3.3的调整字段的位置的语法有助于更好的展示数据

 

查询语句的基本形式:

Select distinct{*|字段列表}  from <表1,表2>…  //distinct表示数据唯一,重复//的都只显示一份

Where <表达式>

Group by <group by destination>    // 按字段分组显示数据

Having expression

Order by <order by destination>    //按什么顺序显示数据:升序(asc),降序(desc)

Limit <row count>                         //x显示每次查询显示的结果数

 

下面是基于本节而创建的表(我是直接从网上复制粘贴的插入代码再自己加上主外键实现的)

Course表

SC

 

Student

 

Teacher

  1. 在查询中in可以指定范围

(1)查询成绩为70或者80或者76的人的学号和成绩

SELECT Sid ,score FROM sc WHERE score IN (70,80,76);

 

2,使用between…and … 来进行范围查询

SELECT Sid ,score FROM sc WHERE score BETWEEN 70 AND 90;

3 ,使用like来进行通配符查询

SELECT sname FROM student where sname like '李%';

 

一般的通配符有%和_,其中%不光后面有多少个字符,_只能替代一个字符

 

 

  1. 分组查询:(group by)

select score ,COUNT(score) as total from sc GROUP BY score having score >= 60;

 

上面语句的意思是从sc表中显示score和score的数量,其中score按照total为标题显示,按照score的大小分组,其中score必须是60分或之上的,分组之后相当于形成了单独的列

  1. 限制查询结果条数

SELECT * FROM sc ORDER BY score DESC LIMIT 5  ;

查询成绩前五

 

SELECT * FROM sc ORDER BY score DESC LIMIT 3,4 ;

从成绩第四(3+1)开始查询4条成绩记录

  1. 聚合查询

常见聚合函数

Avg() 返回某列的平均值

Count() 返回某列的行数

Max() 返回某列的最大值

Min()返回某列的最小值

Sum() 返回某列的和

  1. 连接查询(重要)

连接查询有内链接,外连接,内链接查询是在一个表中查不同的属性,而外连接是针对多个表的连接查询(重要)

比如下面连接了三个表,

select sname,Cname,score from student,course,sc where student.sid=sc.Sid AND course.Cid = sc.Cid;

外连接查询(重要),外连接查询又分为左连接查询(left join)与右连接查询,其中比较常用的是左外连接查询(left out join)(即:以左表为显示的基础进行完全显示,右表仅显示连接字段)

如之上的查询可以替代为

SELECT student.sname,course.Cname,sc.score FROM (student LEFT  JOIN sc ON student.sid = sc.Sid)LEFT JOIN course ON course.Cid = sc.Cid;

其中left join 是left outer join 的简写,因此左连接就是左外连接的意思。

  1. 子查询

子查询是指嵌套在一个查询内部的查询,顺序是先计算子查询,其结果作为外部查询的条件或者结果继续进行查询,常见的关键字有:any(some)(任一条件即为True),all(满足所有条件为true),in (返回一个数据列),exists(存在,有一条就返回)

  1. 合并查询

将结果类型相同的多条select语句整合到一起,关键字是union all

  1. 正则表达式查询

这里我觉得书上给的图就比较明了

 

如    SELECT * from student WHERE sname REGEXP '.李';

查询某个叫什么李的人,这里.本来只是代表一个字符,但是在本例中代表查询名字中包含’某李’两个字的人的姓名。此外,regexp意为正则表达式,是使用正则表达式的关键字

U7 插入,删除,更新操作

  1. 插入

在course中插入一条新纪录

INSERT INTO course(Cid,Cname,Tid)VALUES('04','java','02');

在插入操作中要特别注意的是,你要知道你插入表的数据格式,可以使用desc 表名来查看,比如varchar类型需要加引号,日期类型要符合格式等,此外插入的时候还要注意主键不能重复等问题

  1. 更新

UPDATE sc SET score =79 WHERE Sid = '01' AND Cid = '01';

把学号为01的同学的课程号为01的成绩改为79

  1. 删除

delect FROM course WHERE cid = '04';

删除编号为04的课程

U8索引

索引是对某列进行快速查询的一种结构,索引的数量要适中,一个表中不要超过3个,索引是针对大量数据才见效果,如果几百条数据就不必要加什么索引了,索引可以在表创建的时候就创建,也可以在表创建完成之后更改表实现创建,索引创建完成之后在查询表的时候系统会自动调用来优化查询

普通索引:值不唯一,可为空

唯一索引:值唯一,不可为空

  1. 创建表时创建普通索引,索引名字默认

CREATE table test(tid VARCHAR(10) not NULL,tnum INT(10) NOT NULL,INDEX(tid));

  1. 在已有表上创建索引 tindex

ALTER TABLE test ADD INDEX tIndex(tnum);

  1. 显示现有索引

SHOW INDEX FROM test;

  1. 删除索引tid

alter TABLE test DROP INDEX tid;

U9存储过程(非常重要)

  1. 存储过程就是多个sql语句的集合,存储过程可以一次编译,多次调用,因此性能比普通语句好很多(在大量复杂业务情况下很明显),此外还可以防sql注入攻击,但是存储过程也有很多缺点,如sql本身不擅长处理业务,因此没必要搞这么多存储过程,此外存储过程出错很难调试,因此要适量使用存储过程。
  2. 存储过程和函数异同:

相同点

    1. 本质上都是存储程序

不同点

  1. 函数可以通过return返回单个值或者对象,存储过程没有return,但是可以通过out参数返回多个值
  2. 函数可以在select语句中调用,存储过程不可以,一般作为单独一个模块
  1. 注意事项:
    1. 存储过程不可以更改,,如果必须更改必须删除(drop)后重建
    2. 存储过程可以使用call调用其他存储过程,但是不能使用drop删除其他存储过程
    3. 存储过程的参数不要使用数据库的保留字段,如select等

 

U10 视图

视图是数据库中的一个虚拟表,属性从多个表中抽取,属性和操作和真实表相同,目的是为了让用户更加方便的查看数据

  1. 创建一个试图,使其存在student表中的姓名和性别(若视图存在则替代,修改视图结构也是使用这个语句)

CREATE OR REPLACE VIEW stuview(name,sex) as SELECT sname,ssex FROM student;在视图中查询

    SELECT * from stuview;

  1. 视图是已经编译好的sql语句,不占用物理空间,视图的删除不影响实际表的内容
  2. 查看现有的所有视图

show table status where comment='view';

此外在information_schema数据库中的views表中也可以查看到所有的自建的视图

U11 触发器

触发器是特殊的存储过程,不需要使用call语句来调用,在进行事务的时候自动调用

  1. 格式

CREATE TRIGGER test AFTER DELETE ON student FOR EACH ROW

BEGIN

INSERT INTO stusize(id,size)VALUES(1,1);

END

  1. 显示所有的触发器

show TRIGGERS;

3,注意,相同的事件只能创建一个触发器,比如一个表的delete事件,否则没有办法识别,此外及时删除不必要的时间,否则会造成很多问题

 

 

U12 账户管理

1,在mysql数据库的user表中可以查看所有的用户,并修改其权限

U13数据备份与恢复

U14性能优化

U15 数据库设计

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------有些内容没动力看了,之后再补上

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值