A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 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 指定一个子查询,检测 行 的存在。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马