目录
1.对库操作
1.1 创建数据库
1.1.1 查看有哪些数据库
1.1.2 指定数据库的字符集
1.1.3 查重创建数据库
1.1.4 查看警告信息
1.1.5 小知识:SQL语句中的分号
1.1.6 小知识:设置默认字符集
1.1.7 小知识:语句中的大小写
1.2 使用/选中数据库
1.3 删除数据库(慎重操作)
2.数值类型
2.1 数值类型
2.2 字符串类型
2.3 日期类型
3 对表操作
3.1 创建表
3.2 查看库中所有的表
3.3 查看表中结构
3.4 删除表(慎重操作)
3.5 小知识:注释
4 表的增删查改(基础)
4.1 新增
4.1.1 单行/多行新增
4.1.2 对指定列新增
4.2 查询(重点)
4.2.1 查询表里面的全部内容
4.2.2 查看指定列的内容
4.2.3 在查询时进行计算
4.2.4 查询时起别名
4.2.5 查询时去重
4.2.6 查询时排序(order by)
4.2.7 多种排序方法排序
4.2.8 条件查询(where)
4.2.9 分页查询(limit和offset)
4.3 修改update(慎重操作)
4.4 删除delete(慎重操作)
5 数据库约束
5.1 什么是约束
5.2 not null约束
5.3 unique约束
5.4 primary key 主键约束
5.5 default约束
5.6 外键约束froeign key(重要)
6.表的设计
7 表的增删查改(进阶)
7.1 新增
7.2 聚合查询
7.3 分组查询(group by)
7.4 联合查询(多表查询)
7.4.1 内连接
7.4.2 外连接
7.4.3 自连接
7.4.4 子查询(不建议用)
7.4.5 合并查询
1.对库操作
1.1 创建数据库
操作语句:create database 数据库名;
注意:数据库名不可以是SQL中的关键字,也不可以重名,否则会报错
针对重名,可以先去查看数据库中的所有库名,再去进行建库操作,降低重名概率
1.1.1 查看有哪些数据库
操作语句:show databases;
执行操作后会显示所有的已创建的数据库,其中有几个是自带的库,千万不要删!!!(删除操作后面会说)
1.1.2 指定数据库的字符集
操作语句:create database 数据库名 charset 字符集(一般用utf8);
指定字符集可以方便后期对库中表的操作(如果不指定字符集,后面对表的新增操作可能会出问题)
utf8: 是当前最流行的编码方式,utf8的汉字一般占3个字节,不过MySQL里面的utf8并不完整,它无法表示emoji
1.1.3 查重创建数据库
操作语句:create database if not exists 数据库名;
查重创建的好处: 如果库中没有重复的库名,则会创建成功;如果有重名的数据库,则不会创建成功,并给出警告信息 warning(图片中我之前已经创建了test数据库,所以有警告信息)
1.1.4 查看警告信息
操作语句:show warnings;
图片中打印的是1.1.3中的警告信息
1.1.5 小知识:SQL语句中的分号
在写SQL语句时,如果没有出现分号,那么即使摁下Enter(回车)也不会执行,因为MySQL的控制台认定只有出现分号的时候,才是一条完整的语句,所以在使用MySQL时一条语句可以分成多行输入.
1.1.6 小知识: 设置默认字符集
在MySQL中,如果没有默认字符集,那么每次创建时都要去指定字符集会很麻烦,在工作中,往往会存放相当多的数据,如果忘了指定字符集,那后果不堪设想,下面分享一下如何创建默认字符集
在外面安装完MySQL之后,在电脑中会有一个文件,名为my.ini
首先我们先找到这个文件(可能比较难找),可以去下载一个Everything这个软件去查找(只是建议)
找到之后,打开文件.
找到这两个语句,按照我的划线部分去修改
修改之后,再创建数据库时,就默认字符集为utf8了
1.1.7 小知识:语句中的大小写
MySQL中语句的大小写不会影响它的执行,大写小写全凭个人喜好
1.2 使用/选中数据库
操作语句:use 数据库名;
目前还用不到这个,当对表操作时会用到(只有选中了一个数据库,才可以对表进行增删改查)
1.3 删除数据库(慎重操作)
操作语句: drop database 数据库名;
删除操作(无论是删除什么)在操作数据库都是一个危险操作,在工作中,对于删除一类的操作都要慎重考虑!!!
删库跑路这种想法放在心里想想就好了,可是不太刑啊(手动狗头)
2.数值类型
2.1 数值类型
bit[(m)]--m为指定位数,默认为1--对应Java的boolean
tinyint--1字节--对应Java的byte
smallint--2字节--对应Java的short
(常用)int--4字节--对应Java的int
bigint--8字节--对应Java的long
float(m,d)--4字节,单精度,m指定长度,d指定小数位数,会发生精度丢失--对应Java的float
(常用)double(m,d)--8字节--对应Java的double
(常用)decimal(m,d)--大小:m/d最大值+2,双精度,m指定长度,d表示小数点位数,精确数值
numeric(m,d)--同decimal
2.2 字符串类型
(常用)varchar(size)--0~65535--可变长度字符串--对应Java的String
text--0~65535--长文本数据--对应Java的String
mediumtext--0~16777215--中等长度文本数据--对应Java的String
blob--0-65535--二进制形式的长文本数据--对应Java的byte[]
2.3 日期类型
datetime--8字节--1000年~9999年,不会进行时区的检索和转换
timestamp--4字节--1970年~2038年,自动进行时区的检索和转换
3 对表操作
3.1 创建表
操作语句: create table 表名(列名 类型,......);
要想对表进行操作,首先要选中一个数据库
varchar(20) -- 里面的20代表可以存放的字符数量
注意:表名也是不可以重复的,同时也不可以是关键字,若非要用关键字当表名,就需要将表名用反引号引起来.
反引号: ` `
3.2 查看库中所有的表
操作语句: show tables;
3.3 查看表中结构
操作语句: desc 表名;
详情见图.
3.4 删除表(慎重操作)
操作语句:drop table 表名;(图中的表名是关键字比较特殊,用了反引号)
3.5 小知识:注释
-- 后面为注释
comment 后面为注释
4 表的增删查改(基础)
4.1 新增
4.1.1 单行/多行新增
操作语句: insert into 表名 values(数据,数据,......);
对于字符串可以使用单引号也可以使用双引号
上述为单行新增,还可以一次性新增多行
一个括号相当于一行,新增时在行与行之间用逗号隔开.
4.1.2 对指定列新增
操作语句: insert into 表名(列名,......) values(数据);
在新增时,无论是指定列新增,还是行新增,数据和类型都要对应上.
4.2 查询(重点)
4.2.1 查询表里面的全部内容
操作语句: select * from 表名;
*相对于通配符,会显示全部数据
数据中没有被赋值的列会设置为null
4.2.2 查看指定列的内容
操作语句: select 列名,列名... from 表名;
4.2.3 在查询时进行计算
将要查询的列以表达式的形式输入,得到的结果就是表达式的结果
注意:计算后得到的表示一个临时表,原来表中的内容不会改变
表达式中的内容也可以是列与列之间的运算
4.2.4 查询时起别名
第一种方法
操作语句: select 列,列 别名,... from 表名;
在想要起别名的列后面加上别名即可
第二种方法
再第一种方法的基础上,在别名前加上as即可,这种方法更便于区分别名
4.2.5 查询时去重
在select 后面 加上distinct
会对后面的指定列或者*进行去重
只有一列则把这一列重复的数据隐藏
多列,则将数据相同的两行隐藏一行
4.2.6 查询时排序(order by)
从上到下为从小到大排序:
在语句末尾加上order by asc(asc可加可不加 默认为从小到大排序)
从上到下为从大到小排序:
order by 后面加desc
注意:如果数据中有null值,那么null值会按照最小值排列(无论其他数据有多小,null就是最小的)
4.2.7 多种排序方法排序
在不同的排序方法中间用逗号隔开
在排序时,先按照第一种进行排序,当第一种排序中出现有多行排序的数据相同时,会将这几行(某个)数据相同的行按照第二种方法排序
4.2.8 条件查询(where)
条件查询可以使用的比较运算符
>:大于,< :小于,>= :大于等于,<=: 小于等于
=: 等于,无法比较null与null相等, <=>: 可以比较null与null相等
!=: 不等于
between a1 and a2: 范围匹配[a1,a2]
in(option,...): 括号中的option均为可匹配的数据(后面会细说)
is null: 判断是null, is not null: 判断不是null
like:模糊匹配(后面会细说)
条件查询可以使用的逻辑运算符
and: 两边都为true才为true 相当于Java的&&
or: 两边有一个true就为true 相当于Java的||
not: true则为false,false则为true 相当于Java的!
操作语句: select ... from 表名 where 条件;
在where语句后面也可以加order by去排序
in的用法
操作语句: where 列名 in(数据,...);
会在表中查询符合括号中的数据
like的用法
(1) % 的用法
% 代表通配符,可以代指0个、1个或多个字符,再根据 % 前后的字符在表中去匹配相似的数据
(2) _的用法
和 % 相比, _ 只通配一个字符
4.2.9 分页查询(limit和offset)
limit用法: limit 后面加上要显示的行数
代表显示的总行数,如图,limit后面为5 则只显示5行(不足5行,就显示不足5行的数据)
limit作用在结尾处,在where 和 order by 后面
offset用法: offset 后面加上起始行数的位置
位置和limit相同,有limit则在limit后面使用,
假如一共有十行,那么offset 5 就会把前5行省略,从第6行开始显示
在limit后面 offset可以被逗号代替
4.3 修改update(慎重操作)
操作语句: update 表名 set 列的修改,列的修改,... where 条件(若不填写条件则全被修改);
后面也可以用order by、limit去修饰
可以用表达式进行修改
如果数值为null,则无法修改(因为null值无法进行运算)
虽然相对于删除,修改要安全很多,但是也是危险操作,要慎重对待
4.4 删除delete(慎重操作)
操作语句: delete from 表名 where 条件;
删除的条件与修改(update)的条件相同
都可以使用order by 和 limit
5 数据库约束
5.1 什么是约束
数据库约束是作用在列上的,在创建表时,将约束加在列的后面,就可以达到对列约束的作用(一个列上可以有多个约束).
下面对一些重要的约束进行讲解
5.2 not null约束
列后加上not null 代表这一列不可以为空
5.3 unique约束
列后加上unique 代表这一列不可以出现重复的数据
如上图,对id一列进行unique约束后,新增数据时出现的第二个1就对其进行了报错
5.4 primary key 主键约束
primary key 相当于 not null 和 unique 的同时使用
在一个表中只可以有一个主键约束,但是其他的约束不受限制
如果想要多个与主键约束相同效果的列,可以使用 not null 和 unique 的联合使用
注意: 使用多个约束,约束直接只有空格隔开即可
除此之外,主键中还有一个自增主键
auto_increment 自增主键
自增主键使用在主键之后,如下图
效果: 有了自增主键之后,在主键列可以赋为空值(null),当赋null之后,它会自动生成一个与前面不重复的值,并且这个值是前面的最大值+1,如下图.
特殊: 如果库中的数据个数过高(比如2的31次方),则要考虑分库分表
5.5 default约束
default约束,可以设置默认值
设置的默认值放在default后面
5.6 外键约束froeign key(重要)
外键设置在表中,看起来像单独一列
操作语句: foreign key (子表中被约束的列) references 父表(父表中的主键/unique列)
父表: 设置主键并且约束别人的表
子表: 设置外键并且被别人约束的表
特点: 子表中的被约束列必须在父表中存在,并且父表中已经约束子表的行不可以进行删除操作,对约束列也不可以进行修改
6.表的设计
7 表的增删查改(进阶)
7.1 新增
操作语句: insert into from 表名 select ....;
可以将查询到的结果直接新增到表中,不过新增过来的数据要保证列数及其数据类型与原表一致
7.2 聚合查询
注意: 聚合函数中的括号与函数名要紧密相连,中间不可以有空格,在()中可以有表达式可以可以其别名
常见的聚合函数有:
(1) count() 计算行数
当计算*时,会将全null的行也算入
当计算某一列时,则不会将null行算入
(2) sum() 求和
求和函数中 列的数据不是数字没有意义
(3) avg() 求平均数
(4)max() 最大值 和 min() 最小值
7.3 分组查询(group by)
分组查询相当于把相同的数据整合到一起,所以分组查询一般和聚合函数一起使用
where在group by前面使用,对整体的数据进行修饰
having在group by后面使用,对分组后的数据进行修饰
7.4 联合查询(多表查询)
7.4.1 内连接
方法一:
联合查询的本质上是将多个表拼合在一起,标语表之间用逗号隔开
如果不加where会将所有的情况都排列出来.
假如一个表中有2行数据,另一个表中有4行数据,那么将他俩联合查询会出现8条数据(查询全部数据)
在查询时,如果两个表中的列有重名的情况,可以在列前加上 表名. 来区分不同的列
方法二:
和方法一不同的是 方法二在表与表之间用了join on
操作语句: select ... from 表名 join 表名 on 条件;
这里的on相当于where
7.4.2 外连接
在 内连接方法二 的基础上,在 join 前加上 left 或 right ,表示即使条件不匹配,也会将 左表/右表 中的数据完全展现,与其相对应的 左表/右表 中的数据会用null来代替(即使有 not null 修饰)
7.4.3 自连接
自连接顾名思义,是自己与自己连接
使用场景:行和行的运算
在自连接中,表名必须要起别名
7.4.4 子查询(不建议用)
子查询是将多条查询语句合并到一条查询语句中
比如:
1.单行返回结果的子查询
2.多行返回结果的子查询(用in接收)
7.4.5 合并查询
操作语句:select ... union select ...
union的使用条件是两个查询的两个结果集中列数、列名、类型都必须完全一致
它可以用作单个表,也可以用作多个表
并且union会进行自动去重,而union all 不会进行去重