一、数据库类型
1.关系型数据库:二维表格模型
如:MySQL、Oracle、DB2、SQLServer、SQLite等
2.非关系型数据库:Not only SQL(NoSQL),key-value键值对模型
如:Redis、Hbase、MongoDB等
二、MySQL登录
1.明文登录:
菜单键+R,运行打开cmd,输入命令:mysql -u[用户名] -p[密码],回车运行
2.暗文登录
菜单键+R,运行打开cmd,输入命令;mysql -u[用户名] -p,回车运行。Enter password :后输入[密码],回车运行
三、SQL语句分类
| DDL:数据定义语言 | 用于库/表的增删改 |
| DML:数据操作语言 | 用于表中数据的增删改 |
| DQL:数据查询语言 | 用于查询表中数据 |
| DCL:数据控制语言 | 用于控制权限 |
1.DDL数据定义语言
创建数据库:create database [if not exists] 库名称 [charset 字符集];
查看数据库:show databases
选择数据库:use 库名称
删除数据库:drop database 库名称
创建表:create table [if not exists] 表名称(字段1 数据类型 [约束],字段2 数据类型 [约 束],......);
查看表:show tables;
删除表:drop table 表名;(逻辑是drop表格后建立一个跟原来表结构一样的表)
清空表数据:truncate table 表名;
查看表结构:desc 表名称;
重命名表:①rename table 表名 to 新表名;
②alter table 表名 rename to 新表名;
修改表字段:①alter table 表名 change 旧字段名 新字段名 新数据类型 [新约束类型];
②alter table 表名 modify 旧字段名 新数据类型 [新约束类型];
增加表字段:alter table 表名 add 字段名 数据类型 [约束类型];
删除表字段:alter table 表名 drop 字段名;
2.DML数据操作语言
插入数据:①insert into 表名 values (值1,值2,......);
②insert into 表名(字段1,字段2,......) values (值1,值2,......);
③insert into 表名 values (值1,值2,......),(值1,值2,......),......;
删除数据:delete from 表名 (where 字段=值);(如果无where条件,则删除所有表数据)
更新数据:update 表名 set 字段1=值1 (where 字段2=值2);(如果无where条件,字段1中所 有数据更新为值2)
3.DML数据查询语言
基本语法结构:select 查询字段
from 查询的表
where 查询条件
group by 分组条件
having 分组后的查询条件
order by 排序
limit 分页;
执行顺序:from→where→group by→having→select→order by→limit
处理细节之select:
-- 查找表下所有数据用select *,*是通配符,代表所有数据。工作中尽量不要使用,企业数据量大。
-- 查询语句可以使用算数运算符“+、-、*、/等”,如select 字段1+字段2,select字段3*12等。如果某字段中存在null,不可直接运算,因为null与任何数值运算结果都是null,可用ifnull(字段,字如果字段中存在null则输出的值)处理后再运算。算数运算符只能对数值型字段使用。
-- 可为字段设置别名,如select 字段 as 别名,as 可以不写
-- 查询数据去重,select distinct 字段1,字段2。distinct 前面不能有任何字段,多列去重时,多列完全相同时才会去重。
处理细节之where:
-- 不等于符号用!=,或<>都可以;建议用!=,因为python中只有!=,没有<>。
-- 判断null不能用=或!=,只能用is 或is not。
-- 查询条件是否在两个数值(含)之间的语法:(not)between 数值1 and 数值2。
-- 查询条件在某个集合:in (值1,值2,......)
-- 模糊查询:like ‘存在内容’。%是like语法中的通配符,占用不固定字节。_是占位符,仅占用一个字节。\是转义字符,使%和_转义为字符串,而不是特殊字符。
-- 逻辑运算:and(且)、or(或)、not(取反)。执行顺序not>and>or
细节处理之order by:
-- desc 表示降序,asc表示升序,不写默认升序
-- MySQL中null永远为最小值,oracle中永远是最大值
字节处理之limit:
-- limit n,表示仅输出前n条数据
-- limit(x,y),表示不输出前X条数据,从X+1条数据开始输出y条数据
细节处理之group by 和having:
-- group by 分组后,select 后面只能跟分组字段和聚合函数
-- having 必然跟在group by 后面,无法单独使用having。
4.DCL数据控制语言
四、数据类型
1.数值类型
tinyint(小整数集),int(大整数集),bigint(极大整数集),float(单精度浮点数值,不适用金额),double(双精度浮点数值,不适用金额),decimal(最大总位数,小数点后位数)(定点小数)
2.字符串类型
char(定长字符串),varchar(不定长字符串),text(长文本数据)
3.日期时间类型
date,datetime
五、约束类型
| primary key: | 主键,非空且唯一 |
| unique: | 唯一 |
| not null: | 非空 |
| default: | 默认值,未指定时使用默认值 |
| check: | 检查是否符合业务逻辑 |
| auto_increment: | 自增长,未指定时按顺序填写,一般搭配主键使用 |
| foreign key: | 外键,引用主表字段 |
外键使用tips:
-- 建表时语法:create table [if not exists] 表名 (字段1 数据类型 [约束],字段2 数据类型 [约束],......,constrain [外键名] foreign key 外键字段 reference 主表名 (主表字段));
-- 建表后增加外键语法:alter table 表名addconstrain [外键名] foreign key 外键字段 reference 主表名 (主表字段);
删除外键语法:alter table 表名 drop foreign key [外键名]
六、函数(仅在DQL中使用)
1、字符串函数
| low() | 转小写 |
| upper() | 转大写 |
| concat(字段1,字段2,......) | 多字段拼接,若拼接字段中有null,则必定返回null |
| concat_ws(拼接符,字段1,字段2,......) | 跟concat作用一样,不过要先输入拼接符 |
| substr(字段,n,m) | 截取字符串,从字段第n个字符开始截取,截取m个字符。n可为负数,表示倒数第|n|个字符。m可不填,表示截取至最后一个字符 |
| length() | 求长度函数,一个汉字算3个字符 |
| char_length() | 求长度函数,一个汉字算1个字符 |
| instr(字段,字符) | 定位字符在字段中首次出现的位置,找不到返回0 |
| replace(字段,被替换字符,替换字符) | 用替换字符替换字段中所有被替换字符。 |
2.数值函数
| round(字段,n) | 保留n位小数,四舍五入 |
| truncate(字段,n) | 保留n位小数,不四舍五入 |
| mod(被除数,除数) | 取余 |
| ceil() | 向上取整 |
| floor() | 向下取整 |
| power(底数,次方数) | 幂运算 |
3.日期函数
| now() | 查看当前时间 |
| date() | 查看日期 |
| date_format(原数据,输出格式) | 日期格式化 |
| datediff(date1,date2) | 计算date1-date2的天数 |
| date_add(date,interval n 单位) | 计算date加n年/月/日/时/分/秒后的日期,单位可为year/month/day/hour/minute/second |
| courdate() | 查看当前日期 |
4.通用函数
| ifnull(字段,返回值) | 把字段中的null处理为返回值 |
| nullif(字段1,字段2) | 内容相同返回null,不同返回1 |
| coalesce(字段1,字段2,......) | 返回第一个不是null的参数 |
5.聚合函数
| sum() | 求和 |
avg() | 求平均值 |
| count() | 求个数,count(*)或count(常量)统计所有行数,count(字段名)统计该字段非null的行数。 |
| max() | 求最大值 |
| min() | 求最小值 |
6.条件表达式
-- case:打标签。
基本语法:case when 条件1 then 返回值1 when 条件2 then 返回值2...... else 返回数据3 end
-- if:if(条件,满足条件返回的值,不满足条件返回的值)
-- cast(字段 as 字段类型):把字段转换成字段类型。
七、级联操作与软删除
-- 级联操作:正常表连接之后,当主表中的数据被外键引用后,不可以删除主表或更新主表中已被引用数据。级联操作就是让你可以这样操作。不建议使用,了解即可
--软删除(逻辑删除):说白了就是不把数据真的删除,而是在表格中增加一个字段,用于识别该数据是否要呈现。本质上是数据更新
八、表连接(join on)
1.内连接
基本语法:表1 [表1别名] [inner] join 表2 [表2别名] on 连接条件
-- 能够连接的上的数据才会呈现
2.(左/右)外连接
基本语法:表1 [表1别名] left/right join 表2 [表2别名] on 连接条件
-- left表示左边的是主表,right表示右边的是主表, 执行后主表数据全部显示,从表满足条件的依次连接,不满足条件的用null填充
3.自连接
基本语法:表名 [别名1] [inner/left/right] join 表名 [别名2] on 连接条件
-- 自连接必须为表设置表名
其他情况说明:
-- 两个表中存在相同字段名时,可用”表名.字段名“表示。如emp和dept表中都有deptno字段,可设置emp.deptno=dept.deptno
-- 笛卡尔积:连接的表的行数的乘积,当表连接不设置on连接条件时,就会出现笛卡尔积。
九、子查询
定义:在一条查询语句中嵌套其他select,把返回的结果给主查询使用
1.单行子查询:适用于子查询返回单行单列或单行多列的场景,主查询使用单行比较运算符,如>、<、=等
2.多行子查询:适用于子查询返回多行单列或多行多列的场景,主查询使用多行比较运算符,如in,any,all等。
--子查询可以作为新表放在from后面使用,此时必须为子查询设计别名。
十、临时表
--基本语法:with 临时表名 as (临时表查询语句)
--建多张临时表基本语法:with 临时表名1 as (查询语句),临时表名2 as (查询预计),......
-- 临时表只在当前SQL语句中生效。
十一、视图
视图是对数据库中原始数据的一个映射,是一个虚拟表,仅占用很少的内存空间。
-- 创建视图基本语法:create view 视图名 as (查询语句);
-- 删除视图:drop view 视图名;
-- 修改视图:alter view 视图名 as (查询语句);
-- 因为视图是对数据库原始数据的映射,所以不能直接修改视图中的具体内容,只能修改映射的数据,本质上是用这个视图名重新设立了一个新的视图
十二、索引(index)
1.建表时插入索引基本语法:create table (if not exists)表名 (字段1 类型,字段2 类型,......,index [索引名1] (字段名1),index [索引名2] (字段名2),......);
2.建表后插入索引基本语法:create index on 表名 (字段名1 [desc/asc]),(字段名2 [desc/asc]),......;
其他说明:
-- 索引底层是一套树形查找方法,让数据库不用逐行扫描就能快速定位数据编辑CSDN同步助手
-- 索引不是越多越好 -- 索引内部是一个哈希表,键值对形式 -- 给经常查询的字段取建立索引编辑CSDN同步助手
-- where 后面使用函数会导致索引失效
-- 日期类型的字段不建议加索引(日期进经常需要用函数处理,导致索引失效)
-- 主键不用创建索引,主键自带索引
十三、事务
-- 事务四大特性
| 原子性 | 事务是最小的原子单元,不可拆分。一个事务里的所有SQL要么全部执行成功,要么全部失败 |
一致性 | 事务执行前后,数据库的约束、完整性规则不会被破坏 |
| 隔离性 | 多个事务并发执行时,事务之间互相隔离,互不干扰,每个事务看不到其他事务未提交的脏数据。数据库提供了4中隔离级别,控制并发冲突问题 |
| 持久性 | 事务执行commit提交后,数据永久写入磁盘 |
--设置事务提交状态:set autocommit=0/1,0代表手动提交,1代表自动提交。MySQL默认自动提交
-- 开始事务:begin/start transaction
-- 设置安全节点:savepoint 安全节点名称,设置在需要回滚的节点上面,回滚后视为savepoint 后面的SQL均未执行
-- 回滚 :rollback to 安全节点名称,回滚至指定安全节点。
-- 提交事务:commit
十四、建表三范式
| 1NF_原子性 | 表中字段内容应为不可再拆分的最小字段 |
| 2NF_消除部分依赖 | 非主键字段必须依赖整个主键,不能仅依赖主键的部分(针对复合主键) |
| 3NF_消除传递依赖 | 非主键字段之间不能有依赖关系(如A依赖B,B依赖主键→传递依赖) |