本帖最后由 小石姐姐 于 2018-5-11 10:11 编辑
学习总结mysql # mySQL-关系型数据库 #
- 关系型数据库:保存的是实体之间的关系和数据
- 也是文件系统
- 通过提供的语法,去执行你想要的数据
- ER模型图
# 什么是服务器 #
- 硬件:一台计算机
- 软件:需要在电脑上安装数据库服务器
- 这台电脑就是MySQL数据库服务器
- 内部是通过数据库存储数据,通常一个应用创建一个数据库
- 一个数据库通过很多张的表来存储数据
- 一个系统中,通常为每个实体创建一个表
- 表里面有很多数据记录,例如:id,姓名,密码,性别等
- 一个项目创建一个数据库,里面有很多表,一个实体创建一个表,表内有很多记录,一个实体的实例(对象),会创建一条新的记录,横向的是一条记录
- 数据库中有很多代表不同类型的表,表里面有很多记录,一般表里面的字段与表里面的属性是对应的
- CRUD:增加,查询,更新(修改),删除
# SQL #
- 结构化查询语言,操作数据库的语言
- 必须掌握不同层面的SQL语句
- 数据库
- 数据库中的表
- 表中的数据
- DDL:数据定义语言
- create,drop.alter
- DCL:数据控制语言
- if,grant
- DML:数据操作语言
- insert,update,delete(删除表中的数据)
- DQL:数据查询语言
- select
- 对数据库的操作(CRUD)
- 不经常用到,一个项目只在刚开始进行数据库的操作除非你当官了
# 約束 #
- 保證數據的完整性,对表的规范
- 主键约束 primary key 默认就是唯一的,非空的
- 一列表从上倒下没有重复的,而且也是非空的
- 唯一约束 unique
- 非空约束 not null
- 删除表
- drop table 表名
- 修改表
- 添加列(字段)# 重要 #
- alter table 表名 add 列名 类型(长度)约束
- 字段名 字段类型(长度)约束
- 修改列类型(字段的类型和长度)# 重要 #,多个修改最后一个值不要加逗号
- alter table 表名 modify 列名 类型(长度)约束
- 删除列
- alter table 表名 drop 列名
- 修改列名
- alter table 表名 change 旧列名 新列名 类型(长度)约束
- 修改表名
- rename table 表名 to 新的表名
- 修改表的字符集
- alter table 表名 character set 字符集
- 对表中记录进行CRUD
- update 表名 set usename='x',password='x' where id ='1'
- sql语句后面加上分号 ; ,养成习惯
- 日期还是用varchaer来表示
- 如果添加的数据是中文,会出现乱码
- 产生的原因:客户端用的是GBK编码,而mysql用的都是UTF8编码
# 表的查询 非常重要 #
- 基本查询
- 语法:select(【distionct】*|列名 from 表名【条件】)
- 带条件就要写where
- 所有的 select*from 表名;
- 查询指定的 select 列名,列名 from 表名
- 去掉重复值 select distionct 列名,列名 from 表名
- 如果是多个字段,必须多个字段都相同才能去重
- 查看姓名和总成绩 select 姓名,列名+列名+... from 表名
- 别名查询,as是命名的,后面跟上新列名,这个命名只是暂时的,不会改变列名,as可以省略,
- select 姓名,列名+列名+... 新的列名 from 表名
- 条件查询
- 语法:>,<,<=,>=,<不等于>,=
- like:模糊查询,_(只代表一个字符)或者%(代表任意个字符)来占位符,用到这个就不用写等于号
- in:范围查询,in(x,xx,xxx)
- 条件关联:and(并且),or(或者),not(非)
- 排序查询
- 使用order by 字段名称 asc(升序)/desc(倒序);
- 默认是 asc 升序的(从小到大)
- 多个排序用,(逗号)隔开
- 有条件先加上条件,再去排序
- 日期的升降序也是一样的
- 分组统计查询
- 聚合函数(后面都可以加上条件)
- Sum(); 总和,select sum(列名),sum(列名)... from 表名;这是先求出一列的再去求和
- select sum(列名+列名+列名) from 表名;这是先求出一行的值再去求和,如果有null值,则应该这样写select sum(ifnull(列名,0)+列名+列名) from 表名;
- count(); 获得个数,select count(*/列名) from 表名();
- max(); 最大值
- min(); 最小值
- avg(); 平均值
# 多表操作 #
- 内链接
- 隐式内链接,经常用,根据关联条件,去两个表中匹配有交集的部分,如果匹配上就返回匹配上的记录,如果匹配不上则不返回
- select * from classes 班级 , student 学生 where 班级.cid = 学生.cno;
- 外连接
- 显示内链接,功能是一样的
- select * from classes c , stuent s on c.cid = s.cno;
- 左外连接
- 以左表为基准,根据关联条件去右表查询,如果匹配上则返回匹配上的数据,如果匹配不上,则返回null
- 右外连接
- select * from classes c right join student s on c.cid = s.cno
- 以右表为基准,根据关联条件去右表查询,如果匹配上则返回匹配上的数据,如果匹配不上,则返回null
- 内连接和外连接的区别
- 内连接
- 子查询
- **外键约束**
- 可以保证数据的完整性
- 添加外键:alter table 表名 add **foreign key** (字段名) **references** 表名(字段名)
- 添加约束:alter table 表名 **modify** 字段名 数据类型 约束
- **多表之间的关系**
- **一对多**:一个部门可以有很多个员工,但是一个员工只能属于某一个部门
- **多对多**:一个学生可以选择多门课程,一门课程可以被多个学生选择
- **一对一**(这个用得少):一个公司可以有一个注册地址,一个注册地址只能对一个公司
- **多表查询**
- (这个很少用到)**交叉连接**:**cross join**:查询到两个表的笛卡尔基,就是相乘
- 用法:select * from 表1 cross join 表2;
- 简易用法:select * from 表1,表2;
- **内连接**,**inner join**(inner可以省略掉)
- **显示内连接**:select * from 表1 join 表2 **on** (后面可以跟关联条件)
- (一般用隐式的比较多一些)**隐式内连接**:select * from 表1,表2 where(也可以跟关联条件)
- **外连接**:outer join(outer 可以省略)
- 左外连接:select * from 表1 left join 表2 on(关联条件)
- 右外连接: select * from 表1 right join 表2 on(关联条件)
- 两个相差不多
- **练习一下**
- 内连接查询,显示式和隐式
SELECT * FROM dept AS d JOIN employee AS e ON d.did = e.dno;
SELECT * FROM dept AS d, employee AS e WHERE d.did = e.dno;
- 外连接查询,左外连接和右外连接
SELECT * FROM dept AS d LEFT JOIN employee AS e ON d.did = e.dno;
SELECT * FROM employee AS e LEFT JOIN dept AS d ON e.dno = d.did;
- **内连接和外连接的区别**
- 内连接是找出多表的共性
- 外连接是找出共性和左边/右边的数据
- **SQL优化**
- **子查询要比多表查询效率低,子查询要查两遍,多表联查是直接去查,效率要高一些**
- **复杂的SQL语句要从里面开始往外看**
- **子查询**
- 一个select...FROM是一个基本查询,如果在一个SELECT...FROM中嵌套着另外一个SELECT...FROM语句,就称之为子查询,其中被嵌套在里面的查询语句为子查询
- 关键字:in,all,any,exists
- **IN**的含义是匹配子查询结果中的任一个值即可("IN" 操作符,能够测试某个值是否在一个列表中)
- **ALL**则必须要符合子查询的**所有的值**即可,与比较符结合使用
- **ANY**要符合子查询结果的**任何一个值**即可,与比较符结合使用
- **注意**:**ALL**和**ANY**操作符不能单独使用,而只能与单行比较符(=、>、< 、>= 、<= 、<>)结合使用;
- **exists**:是否存在该记录,EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False;EXISTS 指定一个子查询,检测 行 的存在。
|
|