MySQL
数据库介绍2434274
H2数据库:是一个开源的关系型数据库。H2是一个采用java语言编写的嵌入式数据库引擎,只是一个类库(即只有一个.jar文件),可以直接嵌入到应用项目中,不受平台的限制
Oracle:是甲骨文公司的一款关系型数据库管理系统,是目前世界上流行的关系型数据库之一
MySQL:是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,属于Oracle旗下产品
Redis:是一个开源的,高性能的key-value系统,可以用来缓存或存储数据。
1.什么是SQL
SQL(Structured Query Language) 是“结构化查询语言”,它是对关系型数据库的操作语言。它可以应用到所有关系型数据库中,例如:MySQL、Oracle、SQL Server等。
SQL标准(ANSI/ISO)有:
- SQL-92:1992年发布的SQL语言标准。
- SQL-1999:1999年发布的SQL语言标签。
- SQL-2003:2003奶奶发布的SQL语言标签。
2.语法要求
- SQL语句可以单行或多行书写,以分号结尾;
- 可以用空格和缩进来增强语句的可读性
- 关键字不区分大小写,建议使用大写
SQL分类
-
DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
创建数据库:CREATE DATABASE [IF NOT EXISTS] mydb1; IF NOT EXIST 选项 :如果这个数据库不存在时创建该库 删除数据库:DROP DATABASE [IF NOT EXIST] mydb1; 修改数据库编码:ALTER DATABASE mydb1 CHARACTER SET utf8;
-
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
插入数据 INSERT INTO 表名(列名,列名,....); INSERT INTO 表名(列名,列名,....)VALUES(值,值,....); 列名与值一一对应 修改数据 UPDATE 表名 SET 列名 = 值, 列名= 值,.....[WHERE 条件]; 删除数据 DELETE FROM 表名 [WHERE 条件]; 假如十条记录 用delect 删除完后 再添加记录的话 会在原来的记录号的基础上 增加 TRUNCATE TABLE 表名; truncate 则不会 truncate是先清空表 再添加表结构
-
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
3创建用户 CREATE USER '用户名'@地址 IDENTIFIED BY '密码'; CREATE USER '用户名'@localhost IDENTIFIED BY '密码'; CREATE USER '用户名'@'%' IDENTIFIED BY '密码'; 给用户授权 GRANT 权限1,.....,权限n ON 数据库.* TO '用户名'@地址; 撤销授权 REVOKE 权限1,......,权限n ON 数据库.* TO '用户名'@地址; 查看用户权限 SHOW GRANTS FOR '用户名'@地址; 删除用户 DROP USER '用户名'@地址; 修改用户密码 USE MYSQL; ALTER USER '用户名'@地址 IDENTIFIED BY '新密码';
-
DQL(Data Query Language):数据查询语言,用来查询记录(数据)
-
select 列名[distinct] from 表名 where 条件 [group by 分组字段 [having 分组后的行条件]] [order by 排序字段] [limit 起始行,行数(结果限定)]; 基础查询 select * from 表名; select 列名,.......from 表名; 条件查询 = ,!= ,<> , < , <= , > , >= between .... and in (字符集) is null not/and/or 模糊查询 select 字段 from 表名 where 某字段 like 条件 1.%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个(%)表示。 2._:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。 聚合函数(不可与group by 连用) count():统计指定列不为null的记录行数 max():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算。 min():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算。 sum():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0。 avg():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0。
多表连接查询
表分为内连接和外连接
最主要的区别:内连接仅选出两张表中互相匹配的记录,外连接会选出其他不匹配的记录
外连接分为左连接和右连接
左连接:包含左边表中所有的记录,右边表中没有匹配的记录显示为null。
右连接:包含右边表中所有的记录,左边表中没有匹配的记录显示为null
数据类型
常用类型:
- 整数类型
bigint:占8个字节,相当于C#中long
int:占4个字节,相当于C#中的int
smallint:占2个字节,相当于C#中的short
tinyint:占1个字节,相当于C#中的byte
- 精确数字类型
decimal:固定精确度 -1038–1038-1
numeric:功能等同于decimal
写法:decimal(整数,小数),numeric(整数,小数)
默认:整数18位,小数0位 - 近似数字(浮点)类型
float[(n)]:表示范围:1.79乘以10的308次幂
n:表示精度,有效值1-53之间
real:知道即可 - 文本类型,在SQL中文本类型赋值必须使用单引号
char:固定长度的非unicode字符数据,最大长度是8000个字符
varchar:可变长度的非unicode字符数据,最大长度是8000个字符
text:存储长文本信息,最大长度为2^32-1个字符
nchar:固定长度的unicode字符数据,最大长度是4000个字符
nvarchar:可变长度的unicode字符数据,最大长度是4000个字符
ntext:存储可变的长文本信息,最大长度为2^30-1个字符
固定:当声明数据类型设置了固定长度,那么这个数据类型赋值的字符长度绝对不能超过这个规定,如果赋值的数据长度不足规定的长度,使用空格字符填充
可变:如果赋值数据长度不足,则自动缩短为实际赋值数据长度,内存空间按照指定大小,如果超过指定长度则依然按照实际赋值数据长度,内存空间跟着改变
类型长度最终影响的是内存空间 - 日期时间类型
datetime:允许范围1753-1-1至9999-1-1
smalldatetime:允许范围1900-1-1至2079-1-1
时间精度不同:datetime精确到3/100秒;smalldatetime精确到1分钟
赋值格式:以字符串格式填写
分隔符数字方式:2020-02-18或2020/02/18或02/18/2020
纯数字格式:02182020 月日年
英文数字方式:Feb 18,2020
不管哪种方式给日期时间类型赋值必须用单引号(’ ')
一月 Jan.。二月 Feb.。三月 Mar.。四月 Apr.。五月 May.。六月 Jun.。七月 Jul.。八月 Aug.。九月 Sept.。十月 Oct.。十一月 Nov.。十二月 Dec.。 - 位类型
bit:表示“是/否”类型数据。(0/1,true/false) - 货币类型
money:货币数-263-263-1之间,精确到货币单位的千分之一
smallmoney:货币数介于-214748.3648 – 214748.3648之间,精确到货币单位的百分之一 - 二进制类型
binary:固定长度的二进制数据,最大长度为8000个字节
vbinary:可变长度的二进制数据,最大长度为8000个字节
image:可变长度的二进制数据,最大长度2^31个字节,应用场合:可用来存储图片类型
操作表
//创建表
CREATE TABLE 表名(
列名 列类型,
列名 列类型,
.....);
//查看表结构
DESC 表名;
//删除表
DROP TABLE 表名;
//修改表
//添加列
ALTER TABLE 表名 ADD (列名 列类型,.....);
//修改列的数据类型
ALTER TABLE 表名 MODIFY 列名 列类型;
//修改列名
ALTER TABLE 表名 CHANGE 列名 修改后的列名 列类型;
//删除列
ALTER TABLE 表名 DROP 列名
//修改表名称
ALTER TABLE 表名 RENAME TO 新表名
连接查询-内连接
隐式内连接
SELECT 字段列表 FROM 表1,表2 WHERE 条件...;
显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件...;
内连接查询的是两张表交集的部分
连接查询-外连接
左外连接
SELECT 字段列表 FROM 表1 LEFT[OUTER] JOIN 表2 ON 条件...;
右外连接
SELECT 字段列表 FROM 表1 RIGHT[OUTER] JOIN 表2 ON 条件...;
相当于查询表2(右表)的所有数据包含 表1 和表2交集部分的数据。
连接查询-自连接
SELECT 字段列表 FROM 表A 别名 JOIN 表A 别名 ON 条件...;
联合查询-UNION, UNION ALL
对于union 查询,就是把多次查询的结果合并起来,形成一个新的查询结果集
SELECT 字段列表 FROM 表 ...
UNION [ALL]
SELECT 字段列表 FROM 表...;
union all 是将两次查询的结果直接合并 union是将两次查询的结果合并之后去重复
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
多表查询-子查询
概念:SQL语句中嵌套SELECE语句,称为嵌套查询,又称子查询
子查询外部的语句可以是 INSERT / UPDATE /DELETE/SELECT的任何一个
根据子查询结果不同,分为:
-
标量子查询(子查询结果为单个值) 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。常用的操作符:= <> > >= < <=
-
列子查询(子查询结果为一列)子查询返回的结果是一列(可以是多行)这种子查询称为列子查询。常用的操作符:IN,NOT IN,ANY,SOME,ALL
-
-
行子查询(子查询结果为一行)子查询返回的结果是一行(可以是多列),这种子查询称为行子查询 常用的操作符:= , <> , IN , NOT IN
-
表子查询(子查询结果为多行查询)子查询返回的结果是多行多列,这种子查询称为表子查询 常用的操作符:IN
根据子查询位置,分为:WHERE之后,FROM之后,SELECT之后。