MySQL学习笔记

目录

创建数据库

查询、删除数据库

备份恢复数据库

备份(在dos执行)

恢复(在MySQL命令行中执行)

创建表

列类型

数值类型

整型

小数类型

文本(字符串)、二进制类型

文本类型

二进制数据类型

时间日期类型

datetime

timestamp(自动更新)

修改表

CRUD语句

Insert语句

Update语句

Delete语句

Select语句

单表

多表

合并查询

表复制及去重

表的外连接(join on)

约束

primary key(主键)

细节说明

not null(非空)

unique(唯一)

细节说明

foreign key(外键)

细节说明

check

enum(枚举)

自增长

细节说明

索引

删除索引

创建索引的规则

事务

隔离级别



创建数据库

创建数据库、表时,为了规避关键字,可以使用反引号(`)解决。

查询、删除数据库

SHOW DATABASES

显示当前数据库服务器下所有数据库

SHOW CREATE DATABASE db_name

显示数据库创建的信息

DROP DATABASE [IF EXISTS] db_name

数据库删除语句(慎用!!)

备份恢复数据库

备份(在dos执行)

mysqldump -u root -p -B db_name >d:\\backup.sql

此处文件保存的位置、名字可以自定义

如果只想备份数据库中的某张表,则执行如下语句:

mysqldump -u root -p db_name table_name>d:\\backup.sql

注意:一定要把-B删掉,否则系统会认为table_name是另一个数据库,会报错。

恢复(在MySQL命令行中执行)

source d:\\backup.sql

也可以将备份文件打开,将其中的sql语句直接运行

创建表

CREATE TABLE table_name
(
    field1 datatype(数据类型后面可以指定长度以及有无符号),
    field2 datatype,
    field3 datatype
)character set 字符集 collate 校对规则 engine 存储引擎
field:指定列名  datatype:指定列类型(字段类型)    character set:如不指定则为所在数据库字符集    collate:如不指定则为所在数据库校对规则 engine:引擎

注意:创建表时,要根据需保存的数据创建相应的列,并根据数据的类型定义相应的列类型。

列类型

数值类型

在能够满足需求的情况下,尽量选择占用空间小的类型;

未指定unsigned的情况下,默认是有符号的;

bit型显示的数据为二进制,但查询时仍然可按照十进制查询。

整型

用得较多的为int[4个字节]。

bit型在用于二进制数据时十分节省空间。

小数类型

用得较多的为double[双精度 8个字节],decimal[M,D](大小不确定)

可以支持更加精确的小数位,M是位数(精度)的总数,D是小数点(标度)后面的位数。

也可以存非常大的整数(超过bigint)。

如果D为0:值没有小数点或分数部分。

M最大65,被省略时默认是10

D最大30,被省略时默认是0

文本(字符串)、二进制类型

文本类型

常用(注意大小是否固定)

char

varchar

编码不同,大小不同(1-3个字节用于记录大小)

gbk编码两个字节表示一个字符。size:(65535-3)/2=32766

utf8编码表示中文字符一般为3个字节。size:(65535-3)/3=21844

mediumtext

下图中没有,大小为0-2^24

字符串使用细节

1.括号内的size(假设为6)是字符长度,字符占用字节数由所用编码决定,不管是中文还是字母都最多存放6个。

2.char(6)是定长,即使你插入的数据只有一个字符,也会占用6个字符的空间;而varchar(6)是变长,会按照实际占用空间分配(注意:varchar还会用1-3个字节来记录存放内容的长度)

3.如果数据是定长用char好。查询速度:char>varchar

4.存放文本时可以使用text类型,注意不能有size

二进制数据类型

用的不多

时间日期类型

常用(注意下方图片中的时间日期格式

datetime

timestamp(自动更新)

修改表

修改列名

ALTER TABLE 表名 CHANGE 原字段名 新字段名 字段类型 约束条件

CRUD语句

Insert语句

如果希望指定某个值为默认值,可以在创建表时设定。

Update语句

 

Delete语句

 

Select语句

单表

 

每个 column name 都可以用 as 别名,各个 as 用逗号隔开。

where子句中 不能使用别名,不能使用聚合函数!!!

between...and是闭区间

like使用示例:

select * from table_name
        where `name` like '韩%'
上面这一行也可以中的%表示韩以后匹配任意个字符
若使用_则表示匹配任意一个字符
 

函数

统计函数

count函数

 

两者差在是否排除null

在想要统计的列名前加上distinct可以去重

sum函数

返回满足where条件的行的和,一般在数值列使用

注意:sum仅对数值起作用,否则会报错;对多列分别求和时,“,”符号不能少

avg函数

返回满足where条件的一列平均值

round函数

返回按照指定小数位数进行四舍五入运算的结果,除数值外,也可对日期进行四舍五入运算

select round(number,num_digits)

如果 digits 大于 0,则四舍五入到指定的小数位。

如果 digits 等于 0,则四舍五入到最接近的整数。

如果 digits 小于 0,则在小数点左侧进行四舍五入。

如果round函数只有参数number,等同于digits 等于 0。

举例

round(3.1415926,2)=3.14;
​
round(3.1415926,3)=3.142;
​
select round(193,-2)from dual; 200
​
select round(193,-1)from dual;190
​
select round(193,-3)from dual;0

max/min函数

返回满足where条件的最大/最小值

group、having函数

having即添加查询后显示时的筛选条件

  • 当group by 与聚合函数配合使用时,功能为分组后计算

  • 当group by 与having配合使用时,功能为分组后过滤

  • 当group by 与聚合函数,非聚合字段同时使用时,非聚合字段的取值是第一个匹配到的字段内容,即id小的条目对应的字段内容。

字符串函数

练习:以首字母小写的方式显示所有员工emp表的姓名

数学函数

rand()返回一个随机浮点值(范围在0-1.0)之间。若已指定一个整数参数seed,则将会产生重复的一个随机值。

时间日期相关函数

记住日期作为字符串要用单引号括起来!

细节说明

 

 

在实际开发中经常使用int来保存一个时间戳,随后使用from_unixtime()进行转换。

加密和系统函数

user()回复格式:用户名@ip地址

流程控制函数

用if语句判断是否为空要用is,而不是用等号;判断不为空则用is not

-- 简单Case函数
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
​
CASE sex WHEN ‘1’ THEN ‘男’ WHEN ‘2’ THEN ‘女’ ELSE ‘其他’ END
-- 搜索Case函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END
​
CASE WHEN sex = ‘1’ THEN ‘男’ WHEN sex = ‘2’ THEN ‘女’ ELSE ‘其他’ END

搜索case 可以写判断式

分页查询(limit)

基本语法:select...limit start,rows

表示从start+1行开始取,取出rows行,start从0开始计算

重点看看公式!

注意几种语句的顺序!很重要,顺序错了就会报错

多表

多表查询的条件不能少于表的个数-1,否则会出现笛卡尔集

在默认情况下:当两个表查询时,规则:

1.从第一张表中,取出一行和第二张表的每一行进行组合,返回结果【含有两张表的所有列】

2.一共返回的记录数第一张表行数*第二张表的行数

3.这样多表查询默认处理返回的结果,称为笛卡尔集

4.要在where中写出必要的过滤条件:

自连接

指在同一张表的连接查询(即将同一张表看作两张表)

自连接的特点1.把同一张表当做两张表使用 2.需要给表取别名:表名 表别名 3.列名不明确,可以指定列的别名:列名 as 列的别名

SELECT worker.ename AS'职员名',boss.ename AS'上级名'
FROM emp worker,emp boss
WHERE worker.mgr boss.empno;
SELECT FROM emp;

子查询

嵌入在其它sql语句中的select语句,也叫嵌套查询

单行子查询

指只返回一行数据的子查询语句

SELECT *
    FROM emp
    WHERE deptno = (
        SELECT deptno
        FROM emp
        WHERE ename ='SMITH'
    )
-- 查询和fakenews在同一天录入的数据
SELECT * 
    from mes
    where date(send_time) = date(
        (SELECT send_time 
        FROM mes 
         where content ='fakenews')
    )AND id>1 -- 也可以用HAVING id>1

多行子查询(in)

指返回多行数据的子查询,使用关键字in

SELECT ename,job,sal,deptno
    FROM emp
    WHERE job IN (
        SELECT DISTINCT job
        FROM emp
        WHERE deptno = 10
        ) AND deptno != 10 --(不等号也可以用“<>”表示)
--查询整个公司其他部门和十号部门工作相同的人员(不包括10号部门本身)

子查询可以当作一张临时表(temp)来使用:

SELECT
    goods_id,
    ecs_goods. cat_id,--此处注意要明确是哪一张表的cat_id,否则两张表都有会报错
    goods_name,
    shop_price 
FROM( 
    SELECT cat_id,MAX( shop_price ) AS max_price 
    FROM ecs_goods 
    GROUP BY cat_id 
    ) temp,ecs_goods 
WHERE
    temp.cat_id = ecs_goods.cat_id 
    AND temp.max_price = ecs_goods.shop_price

all和any

比如要找出公司其他部门比某一个部门所有人工资都高的员工,则可以用all;要找出比某一个部门任意一个人工资高的员工,就可以使用any。

当然,比所有的高即比最高的高,此时也可使用max;比任意的高即比最低的高,此时也可使用min。

多列子查询

 

表.*表示将该表的所有列都显示出来,可以简化 SQL 语句。

合并查询

在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union all,union

1.union all用于取得两个结果集的并集。当使用该操作符时,不会取消重复行

2.union 会自动去重

表复制及去重

自我复制数据(蠕虫复制

有时,为了对某个SQL语句进行效率测试,我们需要海量数据时,可以使用此法为表创建海量数据。

INSERT into  my_tab01 
    SELECT * FROM my_tab01

去重通过创建临时表,使用 distinct 关键字,再通过表复制完成,最终使用 drop 删除临时表即可

表的外连接(join on)

当只有join时,后面可以用on也可以用where

1.左外连接(左侧的表完全显示)

在这里插入图片描述

我们先执行joinstu join class on classid = class.id (join的详细语法介绍过)

在这里插入图片描述

再执行left joinstu left join class on classid = class.id 后变为:

由于左边的表stu中的数据在join后,第三行没有在新表出现,left join会将没在新表出现的数据和NULL作拼接,并作为新的行加进来 在这里插入图片描述

如果将stu和class顺序换一下,执行 class left join stu on classid = class.id 结果会是什么呢?

在这里插入图片描述

这个时候,左边的表是class,它的数据在新表中都存在,所以和用join是一样的!!

通过这个例子,再回过头去看上面的话,应该就可以理解。

left join 左右两边的表是不能交换的,交换的话,意思会变;join左右两边的表可以交换,意思不变

2.右外连接(右侧的表完全显示)

它们的常用语句结构:

select .. from 表1 left (right)  join 表2 on 条件

约束

用于确保数据库的数据满足特定的商业规则

包括:not null,unique,primary,foreign key 和 check 五种。

primary key(主键)

细节说明

  1. primary key:不能重复而且不能为null.

  2. 一张表最多只能有一个主键,但可以是复合主键

    当定义为复合主键时,只有两个字段都相同才算作重复(所以上图的添加时有效的)

  3. 主键的指定方式有两种 (1)直接在字段名后指定:字段名primary key (2)在表定义最后写primary key(列名)

  4. 使用desc表名,可以看到primary key的情况。

  5. 在实际开发中,每个表往往都会有主键。

not null(非空)

如果在列上定义了not null,那么当插入数据时,必须为列提供数据。 字段名 字段类型 not null

unique(唯一)

当定义了唯一约束后,该列值是不能重复的。 字段名 字段类型 unique

细节说明

1.如果没有指定not null,则unique字段可以有多个null;unique not null 使用效果类似primary key 2.一张表可以有多个unique字段

foreign key(外键)

用于定义主表和从表之间的关系:外键约束要定义在从表上,主表则必须具有主 键约束或是unique约束。当定义外键约束后,要求外键列数据必须在主表的主 键列存在或是为null

细节说明

  1. 外键指向的表的字段,要求是primary key或者是unique

  2. 表的类型是innodb,这样的表才支持外键

  3. 外键字段的类型要和主键字段的类型一致(长度可以不同)

  4. 外键字段的值,必须在主键字段中出现过,或者为null[前提是外键字段允许为null]

  5. 一旦建立主外键的关系,数据不能随意删除了,当主外键有相关数据时会删除失败

check

用于强制行数据必须满足的条件

在MySQL中实现check的功能,一般是在程序中控制或者通过触发器完成

enum(枚举)

自增长

 

细节说明

  1. 一般来说自增长是和 primary key 配合使用的

  2. 自增长也可以单独使用[但是需要配合一个unique]

  3. 自增长修饰的字段为整数型的(虽然小数也可以但是非常非常少这样使用)

  4. 自增长默认从1开始,你也可以通过如下命令修改 :

    alter table 表名 auto_increment = 新的开始值;

  5. 如果你添加数据时,给自增长字段(列)指定的有值,则以指定的值为准。一般来说,如果指定了自增长,就按照自增长的规则来添加数据。

索引

因为全表扫描导致没有索引会慢,使用索引会形成一个索引的数据结构(比如二叉树,B+树)

主键索引

主键自动地为主索引

添加主键索引
alter table 表名 add primary key (字段)
删除主键索引
alter table 表名 drop primary key

唯一索引(UNIQUE)

普通索引(INDEX)

全文索引(FULLTEXT)[适用于MylSAM]

一般开发中,不使用MySQL自带的全文索引,开发中考虑使用全文搜索 Solr 和 ElasticSearch

索引的代价:

  1. 磁盘占用

  2. 对 dml(update delete insert) 语句的效率影响

查询索引

show index from 表名
show keys from 表名

添加索引

添加唯一索引
create unique index id_index on 表名 (字段)
添加普通索引
方式一
create index id_index on 表名(字段)
方式二
alter table 表名 add index id_index (字段) 
如何选择
1.如果某列的值是不会重复的,则优先考虑使用unique索引,否则使用普通索引

删除索引

drop index 索引名称 on 表名

创建索引的规则

  1. 较频繁的作为查询条件的字段应该创建索引

  2. 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件(比如性别

  3. 更新较为频繁的字段不适合创建索引

  4. 不会出现在where子句中的字段不该创建索引

事务

事务用于保证数据的一致性,它由一组相关的dml语句组成,该组dml语句要么全部成功,要么全部失败。(比如转账)

  1. 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚

  2. 如果开始一个事务,你没有创建保存点。你可以执行rollback,默认就是回退到你事务开始的状态。

  3. 你也可以在这个事务中(还没有提交时),创建多个保存点。比如:savepoint aaa;执行dml,savepoint bbb;

  4. 你可以在事务没有提交前,选择回退到哪个保存点

  5. mysql的事务机制需要innodb的存储引擎,myisam不支持。

  6. 开始一个事务start transaction,也可以写作set autocommit=off;

隔离级别

1.多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。(通俗解释) 2.如果不考虑隔离性,可能会引发如下问题:

脏读(dirty read)

当一个事务读取另一个事务尚未提交的修改时,产生脏读

不可重复读(nonrepeatable read)

同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此事发生不可重复读

幻读(phantom read)

同一查询在同一事务中多次进行,由于其他提交事务所作的插入操作,每次返回不同的结果集,此时发生幻读

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值