可怜人意,薄于云水,佳会更难重。
——晏几道《少年游》
SQL基础知识
什么是SQL ?
Structured Query Language 结构化查询语言
第一部分 SQL基础
1.1 SQL的作用
- 是一种所有关系型数据库的查询规范,不同的数据库都支持。
- 通用的数据库操作语言,可以用在不同的数据库中。
- 不同的数据库 SQL 语句有一些区别
1 | graph TD; |
1.2 SQL语句的分类
- Data Definition Language (DDL 数据定义语言) 如:建库,建表
-
Data Manipulation Language(DML 数据操纵语言),如:对表中的记录操作增删改
Data Query Language(DQL 数据查询语言),如:对表中的查询操作
Data Control Language(DCL 数据控制语言),如:对用户权限的设置
1.3 MySQL语法
- 每条语句以分号结尾,如果在 SQLyog 或者Navicat中不是必须加的。
- SQL 中不区分大小写,关键字中认为大写和小写是一样的。
- 三种注释:
- **--空格** 单行注释 - **/\* \*/** 多行注释 - **#** mysql特有的注释,单行注释
第二部分 DDL数据库定义语言
create , drop , show , alter , select , use
按 tab 键可以自动补全关键字
一、对数据库的操作
2.1.1 创建数据库create
1 | 三种创建数据库的方式: |
2.1.2 查看数据库show
1 | -- 查看所有的数据库 |
2.1.3 修改数据库alter
1 | alert database 数据库名 default character set 字符集; |
2.1.4 删除数据库drop
1 | drop database 数据库名; |
2.1.5 查看正在使用的数据库
1 | -- 查看正在使用的数据库 |
二、对表的操作
前提先使用某个数据库
use 数据库名;
2.2.1 创建表create
1 | create table 表名 ( |
MySQL常使用的数据类型如下:
类型 | 描述 |
---|---|
int | 整型 |
double | 浮点型 |
varchar | 字符串型 |
date | 日期类型,格式为yyyy-MM-dd,只有年月日,没有时分秒 |
详细的数据类型如下
分类 | 类型名称 | 类型说明 |
整数 | tinyInt | 微整型:很小的整数(占 8 位二进制) byte |
smallint | 小整型:小的整数(占 16 位二进制) short | |
mediumint | 中整型:中等长度的整数(占 24 位二进制) 3个字节 | |
int(integer) | 整型:整数类型(占 32 位二进制) 4个体字节 | |
小数 | float | 单精度浮点数,占 4 个字节 |
double | 双精度浮点数,占 8 个字节 | |
time | 表示时间类型 | |
日期 | date | 表示日期类型 |
datetime | 同时可以表示日期和时间类型 | |
字符串 | char(m) | 固定长度的字符串,无论使用几个字符都占满全部,M 为 0~255 之间的整数 |
varchar(m) | 可变长度的字符串,使用几个字符就占用几个,M 为 0~65535 之间的整数 | |
大二进制 | tinyblob | 允许长度 0~255 字节 |
blob | 允许长度 0~65535 字节 | |
mediumblob | 允许长度 0~167772150 字节 | |
longblob | 允许长度 0~4294967295 字节 | |
大文本 | tinytext | 允许长度 0~255 字节 |
text | 允许长度 0~65535 字节 | |
mediumtext | 允许长度 0~167772150 字节 | |
longtext | 允许长度 0~4294967295 字节 | |
2.2.2 查看表show&&desc
1 | -- 查看某个数据库中的所有表 |
2.2.3 快速创建一个表结构相同的表like
1 | create table 新表名 like 旧表名; |
2.2.4 删除表drop
1 | --直接删除表 |
2.2.5 修改表结构alter
1 | -- 添加新字段add |
1 | -- 删除字段 |
第三部分 DML数据操纵语言
inset , update , where , delete , truncate
对表中的数据进行增,删,改操作
3.1 插入记录insert
1 | insert into 表名 (字段名...) values(字段值...); |
3.2 更新表记录update
1 | update 表名 set 字段名=值 [where 条件表达式]; |
1 | -- 具体操作: |
3.3 删除表记录delete&&truncate
1 | delete from 表名 [where 条件表达式] |
第四部分 DQL数据查询语言
select , show , as , distinct
查询不会对数据库中的数据进行修改.只是一种显示数据的方式
一、普通查询
1 | select 字段名 from 表名 [where 条件表达式] |
4.1.1 查询所有行和列的数据select
1 | -- 使用*表示所有字段 |
4.1.2 指定列的别名进行查询as
1 |
|
4.1.3 过滤重复的值distinct
1 | -- 查询指定列并且结果不出现重复数据 |
二、条件查询
为什么要条件查询?
如果没有查询条件,则每次查询所有的行。实际应用中,一般要指定查询的条件。对记录进行过滤。
4.2.1 条件查询的语法
流程:取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回
1 | select 字段名 from 表名 where 条件 |
比较运算符
比较运算符 | 说明 |
---|---|
>、<、<=、>=、=、<> | <>在 SQL 中表示不等于,在 mysql 中也可以使用!=没有== |
between…and | 在一个范围之内,如:between 100 and 200相当于条件在 100 到 200 之间,包头又包尾 |
in(集合) | 集合表示多个值,使用逗号分隔 |
like ‘张%’ | 模糊查询 |
is null | 查询某一列为 null 的值,注:不能写=null |
逻辑运算符
or 或 || | 或 |
---|---|
and 或 &&与 | SQL 中建议使用前者,后者并不通用。 |
not 或 ! | 非 |
MySQL 通配符
通配符 | 说明 |
---|---|
% | 匹配任意多个字符串 |
_ | 匹配一个字符 |
4.2.2 条件查询演示
1 | -- 准备数据 |
1 | -- 具体操作-比较运算符 |
in关键字
1 | select 字段名 from 表名 where 字段 in (数据 1, 数据 2...); |
范围查询
1 | /* |
like 关键字
1 | -- like 表示模糊查询 |
第五部分 数据控制语言
grant , revoke
我们学习中默认使用的都是 root 用户,超级管理员,拥有全部的权限。但是在一个公司里面的数据库服务器上面可能同时运行着很多个项目的数据库。所以,我们应该可以根据不同的项目建立不同的用户,分配不同的权限来管理和维护数据库。
5.1 用户和数据库
数据库:数据库是一种服务,帮忙存储与管理数据的守护进程。
用户:实质是在数据库名下的,是为了赋予一种不同用户对同一数据库的操作的权限(比如有些表你看不到,有些数据库你不能改);
5.2 创建用户
创建的用户名都在 mysql 数据库中的 user 表中可以查看到,密码经过了加密。
1 | create user '用户名'@'主机名' identified by '密码'; |
5.3 给用户授权grant
用户创建之后,没什么权限!需要给用户授权
1 | grant 权限 on 数据库.表名 to '用户名'@'主机名'; |
5.4 撤销授权revoke
1 | revoke 权限 on 数据库.表名 from 'user1'@'localhost'; |
5.5 查看权限
注:usage 是指连接(登陆)权限,建立一个用户,就会自动授予其 usage 权限(默认授予)。
1 | show grants for '用户名'@'主机名'; |
5.6 删除用户
1 | drop user '用户名'@'主机名'; |