1. 什么是SQL
SQL 是结构化查询语言( Structured query language )
适用于所有关系型数据库对数据进行增删改查的语言
1.1按照SQL标准分类
除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的专有扩展!
SQL标准
关系型数据库通用的SQL语句就是SQL标准语句。
SQL方言
每个数据库管理系统都有各自的专属SQL语句,我们俗称方言,我们在实际开发的时候应该尽量避免使用每个数据库管理系统的专属SQL语句。
2. 数据库管理系统的分类
关系型数据库(SQL)RDBMS
关系型数据库指的是使用关系模型(二维表格模型)来组织数据的数据库
常见的关系型数据库
- Oracle
- MySql
- SQL Server 微软
- SQLite
- DB2 IBM
非关系型数据库(NoSQL)
非关系型数据库又被称为 NoSQL(Not Only SQL ),意为不仅仅是 SQL。通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定,常用于存储非结构化的数据
常见的非关系型数据库
- 键值数据库:Redis
- 文档数据库:MongoDB
- 图形数据库:Neo4j
3. MySQL介绍
持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企 业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化”,而持久化的实现过程大多 通过各种关系数据库来完成。
持久化的主要作用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数 据文件中。
4. 数据类型
整数类型
* int / interage 4B
* tinyint 1B
* bigint 8B
浮点类型
* float 小数点后面6-8位
float(n,m);
n表示一共有多少位数 m表示小数部分保留几位
此时整数部分位数:(n-m)位
* double 小数点后有效位数12位
double(n,m) n表示一共有多少位数 m表示小数部分保留几位
此时整数部分位数:(n-m)位
* decimal 用法和float和double相同 专用于表示钱相关的数字
decimal(n,m) m是小数位数 n-m为整数位数
字符类型
* char 固定长度 char(10)
分配十个长度的存储空间,若不够10个长度,MySQL会自动补齐十个长度 char(n) n<=4000
* varchar 可变长度 varchar(10)
分配十个长度的存储空间,传入长度不够时不会自动补齐
* text 64kb
* longtext 4GB
时间类型
1:time:只有时分秒: xx:xx:xx
2:date:只有年月日: xx/xx/xx
3:datetime:有年月日和时分秒: xx/xx/xx xx:xx:xx
4:timestamp:时间戳 毫秒值:
布尔类型
bool
boolean
字节类型
1:binary:255B
2:blob:64kB
5. DDL相关语句
data defined language:数据定义 对表结构的增删改查
关键字:create /drop /alter /show
1 对数据库的操作
-- 数据库相关的DDL语句
SHOW DATABASES; -- 显示所有数据库
SHOW VARIABLES LIKE '%char%'; -- 显示数据库的编码集
SHOW TABLES; -- 显示数据库所有表
CREATE DATABASE db_1; -- 创建一个数据库 名字:db_1
CREATE DATABASE db_1 CHARSET='utf8'; -- 创建一个数据库 名字:db_1
USE db_1; -- 使用db_1 数据库
SELECT DATABASE(); -- 显示当前使用的数据库
DROP DATABASE db_1; -- 删除数据库 db_1
ALTER DATABASE db_1 CHARSET='gbk'; -- 修改数据库的编码集为gbk
ALTER DATABASE db_1 CHARSET='utf8';
2 对表的操作
-- 数据表的DDL相关操作
CREATE TABLE tab_1( -- 创建tab_1表 且必须传字段
tid INT NOT NULL, -- 创建tid字段 数据类型是 int
tname VARCHAR(4), -- 创建tname字段 数据类型varchar(4)
tage TINYINT,
tsex CHAR(1),
tscort FLOAT(4,1),-- 数据类型float 整数长度4-1 小数1
tbirthday DATE,
tintime DATETIME -- 最后一个不可以有逗号
);
SHOW TABLES; -- 显示所有表
DESC tab_1; -- 显示指定表的字段所有信息
DROP TABLE tab_1; -- 删除表
ALTER TABLE tab_1 RENAME TO tab_11; -- 修改表的名字
ALTER TABLE tab_11 RENAME TO tab_1;
ALTER TABLE tab_1 DROP tintime; -- 删除一个字段
ALTER TABLE tab_1 ADD tintime DATETIME; -- 增加一个字段
ALTER TABLE tab_1 MODIFY tintime DATE; -- 修改字段的数据类型
ALTER TABLE tab_1 MODIFY tintime DATETIME;
ALTER TABLE tab_1 CHANGE tintime tin DATETIME; -- 修改字段名为tin数据类型为datetime
ALTER TABLE tab_1 CHANGE tin tintime DATE;
6. DML相关语句
-- DML相关语句
-- 对表记录的增删改:update insert delete
USE db_1;
DESC tab_1;
SELECT * FROM tab_1;
-- 添加信息
INSERT INTO tab_1 VALUES(1001,'张三',19,'男',19.9,'1990/1/1',NOW());
INSERT INTO tab_1 VALUES(1002,'李四',21,'男',29.9,'1993/3/4',NOW());
INSERT INTO tab_1 VALUES(1003,'王五',24,'男',2131.1,'2001/4/133',NOW());
INSERT INTO tab_1(tid,tname,tage,tsex,tscort,tbirthday,tin)VALUES(1004,'赵六',24,'男',28.1,'2002/3/14',NOW());
-- 添加一行信息 ,没有指定字段为null
INSERT INTO tab_1(tid,tname,tage,tsex,tscort)VALUES(1004,'赵六',24,'男',28.1);
-- 添加多行信息 没有指定的字段为null
INSERT INTO tab_1(tid,tname,tage,tsex)VALUES(1004,'王刚',24,'女'),(1004,'小明',24,'男');
UPDATE tab_1 SET tsex ='妖' WHERE tname = '王刚';
UPDATE tab_1 SET tid = 1005 WHERE tbirthday = '2002/3/14';
-- 删除数据 where 使用条件
DELETE FROM tab_1 WHERE tid = 1004;
INSERT INTO tab_1(tid,tname,tage,tsex)VALUES(1004,'王刚',21,'女');
-- tscort 是不是null 是null的话就是1不是null的话就是本身
UPDATE tab_1 SET tscort = IFNULL(tscort,1);
7. 函数
1. 字符串相关
MySQL中字符串索引是从1开始
函数名 | 函数使用方式 | 函数表示意义 | |
---|---|---|---|
ascii | ASCII('a') 返回97 | 获取字符串在编码表中的位置 | |
char_length | CHAR_LENGTH('abcdefg') 返回7 | 获取字符串的长度 一共有多少个长度 | |
lentgth | LENGTH('abc你好啊') 返回12 | 获取字符串所占的字节数 字符串占2个字节 | |
concat | CONCAT('abc','123','defg',可无限写) 返回 abc123defg | 字符串连接 | |
format | SELECT FORMAT(123123123,3);返回123,123,123.000 | 将数字转换成金钱余额的形式 小数点保留位数可以指定 | |
locate | SELECT LOCATE('de','abcdefg')返回4 | 获取字符串1在字符串2中第一次出现的位置 | |
lower | SELECT LOWER('ABCDefg123%$#!@')返回abcdefg123%$#!@ | 将大写字符转换成小写字符其他字符不变 | |
upper | SELECT UPPER('abcdef123@$#')返回ABCDEF123@$# | 将小写字符转换成大写字符 | |
trim | TRIM(' --abc-- ')返回--abc-- | 清除字符串两边空格 | |
rtrim | SELECT RTRIM(' --abc-- '); | 清除字符串右边空格 | |
Ltrim | SELECT LTRIM(' --abc-- '); | 清除字符串左边空格 | |
space | SELECT CONCAT('abc',SPACE(5),'def'); | 获取n个空格 | |
reverse | SELECT REVERSE('abcdefgh'); | 字符串反转,逆序字符串 | |
replace | SELECT REPLACE('abc123abc456abc','abc','-') | 将参数一中的参数二替换成参数三 | |
position | SELECT POSITION('abc' IN 'defabcgheabc'); | 获取第一个字符串在第二个字符串中出现第一次的位置 | |
repeat | SELECT REPEAT('abc',4); | 获取当前字符串几次的拼接结果 | |
strcmp | SELECT STRCMP('def','eabc'); | 字符串逐个比较前面大返回1后面大返回-1一样返回0 | |
substring | SELECT SUBSTRING('abcdef',2,3); | 从参数一中截取字符串索引是参数2截取个数是参数3 |
2. 数学相关函数
函数名 | 函数使用方式 | 函数表示意义 | |
---|---|---|---|
sum | SELECT SUM(tscore) FROM tab_2; | 求和,忽略null值不算 | |
min | MIN(tscore) | 求最小值,忽略null值不算 | |
max | MAX(tscore) | 求最大值,忽略null值不算 | |
avg | AVG(tscore) | 求平均值,忽略null值不算 | |
count | COUNT(tscore) | 获取数据行数,忽略null值不算 COUNT(*)会获取所有行包含null | |
floor | floor(19.5) 返回19 | 向下取整 | |
ceil | CEIL(19.5) 返回20 | 向上取整 | |
round | round(19.5) round(19.5,2) | 四舍五入保留几位小数 | |
pow | pow(n,m) | 幂运算 n的m次方 | |
sqrt | SQRT(9) | 开平方 | |
rand | RAND() | 获取一个0到1之间的随机数字 | |
truncate | TRUNCATE(n,m) | 截取数字n,保留小数点后m位 | |
UUID | UUID() | 随机一个不重复的32位字符串d2f5b155-4a97-11ed-98ed-eff1eabffcb4 | |
mod | MOD(n,m) | n%m 取余运算 | |
3. 日期相关函数
函数名 | 函数使用方式 | 函数表示意义 | |
---|---|---|---|
now | NOW() | 取当前系统时间 2022-08-13 09:42:41 | |
curdate | CURDATE() | 取当前系统日期 2022-08-13 | |
8. 数据操作
1. Insert 插入数据
INSERT INTO【表名称】(字段列表)values(值列表);
- 插入多条数据
INSERT INTO 【表名称】(字段列表)values(值列表),(值列表)...;
2. Select 查询数据
SELECT * FROM 【表名称】; -- 查询该表所有字段的所有信息
- 查询指定字段的信息
SELECT 【字段列表】 FROM 【表名称】; -- 查询该表中指定字段信息
3. Where 条件查询
- 需要配合着select查询语句进行使用
SELECT 【字段列表】 FROM 【表名称】 where 【字段名】<等于/大于/小于/不等于> 某值;
4. Update 更新数据
- 修改指定条件的字段等于某个数据
UPDATE 【表名称】SET 【字段】=【某值】,【字段】=【某值】 where 【字段名】<等于/大于/小于/不等于> 某值;
5. Delete 删除数据
- 删除表中的数据
DELETE FROM【表名称】;
- 指定条件删除某条或多条数据
DELETE FROM 【表名称】 where 【字段名】<等于/大于/小于/不等于> 某值;
6. Like 模糊匹配
- 我们在使用where的时候只能匹配精准的数据,若使用我们的Like 的话就可以模糊匹配某条数据是否包含某些值
select 【字段名】 from 【表名】 where 【字段名】 Like '匹配规则'
匹配规则
以某值开头 '【值】%';
以某值结尾 '%【值】';
包含某值 '%【值】%';
7. 获取到数据后排序
使用 Oreder By 【字段名】 【排序规则 DESC 倒序/ASC 正序】
SELECT * FROM 【表名称】 order by 【字段名】 DESC/ASC;
### 8. 获取到的数据分组
使用 Group by 【字段名】
按照指定固定字段进行分组
注意:
分组之后的数据无法查询组员是谁,只可以查询组员的聚合信息 比如 成员数,求和,求最大值,求最小值,求平均值等聚合信息
聚合信息:
比如 成员数,求和,求最大值,求最小值,求平均值
select 【聚合信息字段】 from 【字段名】 group by 【分组字段】;
9. 多表查询
1. 字段连接查询 UNION / Union all
- 查询两张表中的字段 放到一张表中显示
- 1 两张表连接起来的数据类型必须一致
SELECT 【字段名】,【字段名】 from 【表名】 union select 【字段名】,【字段名】 from 【表名】; -- 查询到的数据不包含null
SELECT 【字段名】,【字段名】 from 【表名】 union all select 【字段名】,【字段名】 from 【表名】;-- 查询到的数据包含null
2. 表连接查询
- 方言
SELECT 【别名1】.*, 【别名2】.* from 【表名1】 as 【别名1】,【表名2】 as 【别名2】 where 【查询条件】;
- 标准 内连接 去除两张表中的NULL数据
SELECT 【别名1】.* 【别名2】.* from 【表名1】 as 【别名1】 inner join 【表名2】 as 【别名2】 on 【查询条件】;
- 标准 左连接
SELECT 【别名1】.* 【别名2】.* from 【表名1】 as 【别名1】 left join 【表名2】 as 【别名2】 on 【查询条件】;
- 标准 右连接
SELECT 【别名1】.* 【别名2】.* from 【表名1】 as 【别名1】 right join 【表名2】 as 【别名2】 on 【查询条件】;
10. SELECT(select) 查询
select 字段1,字段2,......from 表名 # 查询当前表明指定字段的所有信息
查询指定字段 来自哪个表中
查询所有 select * from 表名 # 查询当前表中所有字段的所有信息
SELECT 1+1,3*2;
SELECT 1+1,3*2 FROM DUAL
# dual 伪表
# 当前两种语句在执行的时候没有区别
11. 别名 AS
在我们查询的时候为了方便查看我们可以给字段 / 表头 起一个别名,这个别名只在这条语句执行的时候有效
起别名的方式有两种
1 在我们select选择字段的时候可以直接按下一个空格然后指定别名
2 使用 AS 关键字 AS关键字后面写入你要起的别名使用双引号
select id as "学号",rname as "姓名" from student
12. 去除重复 distinct
使用场景:比如我们要查询员工表中都有哪些部门中有员工
就可以使用关键字 distinct
select distinct department_id from employees;
错误的情况 运行报错无法运行
select salary,distinct department_id from employees;
正确的情况:
select distinct department_id,salary from employees;
13. 着重号
我们在给字段起名字的时候最好不要使用到MySQL的关键字,若真是使用到了关键字我们在查询的时候可以使用着重号来给这个词括起来
然后再去运行我们的查询语句就可以了
着重号就是~符号单点一下
14. 显示表结构 describe
describe 表名;
desc 表名;
显示表中所有字段的详细设置信息
15. where 数据过滤
select * from 表名 Where 过滤条件
如我们想要查询一个学生信息表中学生分数大于60的可写下面语句
select * from student where scort>60;
16. 算数运算
select 100 + 'a' from dual; # 此时计算结果为100
# 在mysql中 他并不会将字符转换成对应的整数进行计算
select 100 + '1' from dual; # 计算结果101
select 100 + null from dual; # 计算结果为null
- 一个整数类型的值对整数进行加法和减法操作,结果还是一个整数;
- 一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数;
- 加法和减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的;
- 在Java中,+的左右两边如果有字符串,那么表示字符串的拼接。但是在MySQL中+只表示数 值相加。如果遇到非数值类型,先尝试转成数值,如果转失败,就按0计算。(补充:MySQL 中字符串拼接要使用字符串函数CONCAT()实现)
- 一个数乘以整数1和除以整数1后仍得原数;
- 一个数乘以浮点数1和除以浮点数1后变成浮8点数,数值与原数相等;
- 一个数除以整数后,不管是否能除尽,结果都为一个浮点数;
- 一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后4位;
- 乘法和除法的优先级相同,进行先乘后除操作与先除后乘操作,得出的结果相同。 在数学运算中,0不能用作除数,
- 在MySQL中,一个数除以0为NULL。
17. 比较运算符
比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回1,比较的结果 为假则返回0,其他情况则返回NULL。 比较运算符经常被用来作为SELECT查询语句的条件来使用,返回符合条件的结果记录。
1.字符串特殊情况
字符串存在隐式转换,如果转换不成功 则给他当成0来看
若是字符串和字符串进行比较那么将比较的是值不会将字符串转换为 0 进行比较
若是字符串与数字进行比较那么将字符串转换为数字,若字符串不是数字的话默认当成0来看
2. null特殊情况
如果在比较中出现与null参与比较的时候比较返回也是一个null
select null=null from dual; # 结果返回一个null
select null = '1' from dual; # 结果返回一个null
3. null 查询
# 假设学生数据库中有地址字段address 其中有一部分学生的address是null 并没有添加地址信息,我们要查到这些学生使用sql语句
# 错误的写法
select * from student where address = null; # 此条语句返回一个空
# 因null在参与比较的时候无论什么情况都返回一个null 所以会取不出我们查询的数据集
此时我们要借助一个新的运算符进行和null比较
<=> 安全等于
select null<=> null from dual;
# 按照之前的逻辑比较来说null参与比较是必须返回一个null,但是使用到安全等于比较运算符的时候就可以判断出他是不是等于null
4. 使用关键字进行字符串比较