mysql
本质#
其实每个人都可以开发一款数据库软件 因为它仅仅就是一款基于网络通信的应用程序 也就意味着数据库软件其实有很多很多
关系型数据库#
数据之间彼此有关系或者约束 存储数据的表现形式是以表格存储 如 MySQL、oracle、db2、access、sql server
非关系型数据库#
存储数据通常都是以k、v键值对的形式 如 redis、mongdb、memcache
常见软件的默认端口号#
sql语句初识#
连接服务端的命令
客户端退出 退出命令加不加分号都可以执行 quit 或 exit
其他设置#
windows将mysql服务端制作成系统服务
重置密码
配置文件
ini结尾的一般都是配置文件 程序启动会先加载配置文件中的配置之后才真正的启动
自己配置需要你新建一个my.ini的配置文件 修改配置文件后一定要重启服务才能生效
基本sql语句#
针对库的增删查改#
- 增 - 查 - 改 - 删 
针对表的增删改查#
在操作表(文件)的时候 需要指定所在的库(文件夹)
查看当前你所在的库的名字
切换库
- 增 - 查 - 改 - 删 
也可以用绝对路径的形式操作不同的库
针对数据的在增删改查#
一定要先有库 有表 最后才能操作记录
- 增 - 查 - 改 - 删 
mysql主要存储引擎#
查看MySQL所有的存储引擎
创建innodb存储引擎的表
创建表的完整语法#
- 宽度 
- 约束条件 是宽度的基础之上增加的额外的约束 null not null 
- 严格模式 - 如何查看 - 修改严格模式 
mysql基本数据类型#
整形#
分类 TINYINT SMALLINT MEDUIMINT INT BIGINT
默认情况下都是带符号的 整型约束条件之无符号unsigned 无符号
浮点型#
分类 FLOAT DOUBLE DECIMAL
存储限制
字符类型#
| 类型 | 优点 | 缺点 | 说明 | 
|---|---|---|---|
| char:定长 char(4) | 存取都很简单 直接按照固定的字符存取数据即可 | 浪费空间 | 超过四个字符直接报错 不够四个字符空格补全 | 
| varchar:变长 varchar(4) | 省空间 存的时候需要制作报头 | 存取比较麻烦 | 数据超过四个字符直接报错 不够有几个存几个 | 
char_length统计字段长度
时间类型#
| 类型 | date | datetime | time | year | 
|---|---|---|---|---|
| 年月日 | 年月日时分秒 | 时分秒 | 年 | 
栗子:
枚举与集合类型#
约束条件补充#
default默认值 可以设置默认值 比如男生比较多 性别默认男
unique单例唯一 比如id号是唯一的 必须是不同的
unique联合唯一 比如ip地址和端口号合起来是唯一的 必须是不同的
primary key主键
- 约束效果相当于 not null + unique 非空且唯一 是Innodb存储引擎组织数据的依据 
- Innodb存储引擎在创建表的时候必须有primary key 它类似于目录 能够帮助提升查询效率并且也是建表的依据 - 一张表有且只有一个主键 如果你没有设置主键 那么会从上往下搜索直到遇到一个非空且唯一的字段将它自动升级为主键 - 如果表中没有主键也没有其他任何的非空且唯一字段 那么Innodb会采用自己内部提供的一个隐藏字段作为主键 隐藏意味无法使用 
- 一张表通常都应该有一个主键字段 并且通常将id/uid/sid字段作为主键 
单个字段主键
联合主键(多个字段联合起来作为表的主键 实质还是一个主键)
auto_increment自增
通常都是加在主键上的 不能给普通字段加 当编号太多 人为维护太麻烦 所以自增 比如id自动+1
创建表的(数据的唯一标识id、uid、sid)字段的时候 后面必须加primary key auto_increment
表与表之间的关系#
外键#
外键就是用来在代码层面真正的实现表与表之间的关系 foreign key
表与表之间建立关系#
表与表之间只有三种关系 一对多 多对多 一对一
- 一对多 - 针对一对多 外键字段建在多的一方 
- 多对多 - 关系表无需外键 单独开设一张表专门用来存储关系 
- 一对一 - 外键字段建在任意方均可 但是推荐你建在查询频率较高的表中 
栗子:
修改表#
修改表名
增加字段
删除字段
修改字段
复制表#
我们sq1语句查询的结果其实也是一张虚拟表
where筛选条件#
作用:对整体数据的一个筛选操作
栗子:
- 查询id大于等于3小于等于6的数据 - 查询id小于3或者id大于6的数据 - 查询薪资是20000或者18000或者17000的数据 - 查询薪资不在20000,18000,17000范围的数据 (不在 not in) - 查询员工姓名中包含字母o的员工的姓名和薪资 - 查询员工姓名是由四个字符组成的 姓名和薪资 - 查询岗位描述为空的员工姓名和岗位名 针对mull不能用等号 用is 
group by分组#
分组实际应用场景 如 男女比例 部门平均薪资 国家之间数据统计 应用场景非常多
需要分组的场景 关键字 每个 平均 最高 最低 .....
分组之后 最小可操作单位应该是组 不再是组内的单个数据 不应该考虑单个数据 而应该以组为操作单位
上述命令在你没有设置严格模式的时候是可正常执行的 返回的是分组之后 每个组的第一条数据 但是这不符合分组的规范;
分组之后 没办法直接获取组内的单个数据 如果设置了严格模式 那么上述命令会直接报错
设置严格模式之后 分组 默认只能拿到分组的数据 其他字段不能直接获取 需要借助于一些方法
聚合函数 min max avg sum count#
栗子:
- 获取每个部门的最高薪资 - 获取每个部门的最低薪资 - 获取每个部门的平均薪资 - 获取每个部门的薪资总和 - 获取每个部门的人数 - group_concat获取分组之后的其他字段 还支持拼接操作 - 查询分组之后的部门名称和每个部门下所有的员工姓名 - 不分组的时候 
分组补充#
分组注意事项
分组之后的筛选条件having的语法跟where是一致的 只不过having是在分组之后进行的过滤操作
即having是可以直接使用聚合函数的
统计各部门年龄在30岁以上的员工的平均工资并且保留平均薪资大于10000的部门
distinct去重#
一定注意 必须是完全一样的数据才可以去重 不要将主键忽视了 有主键存在的情况下 是不可能去重的
order by排序#
limit限制展示条数#
针对数据过多的情况 我们通常做分页处理
正则regexp#
多表查询#
联表操作
子查询
总结#
- 书写sql语句的时候 select后面先用*占位 之后写完再查
- 在IE较为复杂的sql语句的时候 不要想着一口气写完 写一点查一点看一点再写 (只要涉及到数据查询相关的语法都不应该一次性写完 不太现实)
- 在做多表查询的时候 联表操作和子查询你可能会结合使用