本帖最后由 sun2ice 于 2018-2-4 15:47 编辑
#day06数据库回顾
* SQL:结构化的查询语言.
* DDL:数据定义语言
* create,alter,drop...
* DML:数据操纵语言
* update,insert,delete
* DQL:数据查询语言
* select, from , where
* DCL:数据控制语言
* grant,if..
## DDL:数据定义语言 库
* 创建数据库
* 语法:`create database 数据库名称;`
* 查看数据库
* 语法: `show 数据库名称;`
* 删除数据库
* 语法:`drop database 数据库名;`
* 修改数据库
* 语法:`alter database 数据库名 character set`;
* 切换数据库
* 语法: `use 数据库名称;`
## DDL:数据定义语言 表
* 约束
```
单表约束:
* 主键约束:primary key (默认就是唯一非空的)
* 唯一约束:unique
* 非空约束:not null
```
* 创建表
```
* create table 表名 (
字段名 类型(长度) 约束,
字段名 类型(长度) 约束,
字段名 类型(长度) 约束
);
```
* 表的查看
* 语法 `show tables;`
* 表的删除
* 语法 `drop table 表名;`
* 表的修改
* 添加列
* 语法`alter table 表名 add 列名 类型(长度) 约束;`
* 删除列
* 语法`alter table 表名 drop 列名;`
* 修改表的列名
* 语法`alter table 表名 change 旧列名 新列明 类型(长度) 约束;`
* 修改表的列的类型长度及约束
* 语法`alter table 表名 modify 列名 类型(长度) 约束;`
* 修改表名
* 语法`rename table 旧表名 to 新表名;`
* 修改表的字符集
* 语法`alter table 表名 character set 字符集`
## DML:数据操作语言
* 表的插入
* 插入指定列的值
* 语法`insert into 表名(列名,列名...)values(值1,值2,...);`
* 插入所有列的值
* 语法`insert into 表名 values(值1,值2,...);`
```
* 注意事项:
* 列名的个数与值的个数对应.
* 列的类型与值的类型对应.位置也要对应.
* 列的类型如果是字符串或者日期,写值的时候使用单引号将值引起来.
* 插入的值的最大长度不能超过列的最大长度.
```
* 表的修改
* 语法` update 表 set 列名=值,列名=值 where 条件;`
```
注意事项:
* 列名和值类型也要一致.
* 值不能超过列的最大长度.
* 值是字符串或日期,需要使用单引号.
```
* 删除记录
* 语法`delete from 表 where 条件;`
```
注意事项:
* 删除表中的一行记录,不能删除某列值
* 如果没有条件删除表中的所有列.
```
* 删除表中的所有记录truncate table 表名 和 delete from 表 区别?
* 区别:
* truncate table 删除表的记录:将整个表删除掉,重新创建一个新的表.truncate属于DDL.
* delete from 删除表的记录:一条一条进行删除. delete属于DML。
* 事务管理 只能作用在DML语句上.如果再一个事务中使用delete删除所有记录,可以找回.
## DQL:数据查询语言
* 基本查询
```
例如
* 查询所有记录:
select * from exam;
* 查询这个班级人的姓名和英语成绩:
select name,english from exam;
* 查询英语成绩,将重复英语成绩去掉:
select distinct english from exam;
* 查询李四的学生成绩:
select * from exam where name='李四';
* 查询名称叫李四并且英语成绩大于90的
select * from exam where name='李四' and english >90;
* 将成绩+10分进行显示:
select name ,english+10,chinese+10 ,math+10 from exam;
* 显示这个人的名称和对应总成绩的分数:
select name,english+chinese+math from exam;
* 使用as起别名,as可以省略.
select name , english+chinese+math as sum from exam;
```
* 排序查询
* `order by 对数据进行排序.默认升序. (asc升序,desc降序)`
```
例如
* 查询所有学生的信息,并且按语文成绩进行排序.
select * from exam order by chinese;
* 查询所有学生的信息,并且按语文成绩进行降序排序.
select * from exam order by chinese desc;
* 查询学生的信息,按照英语成绩降序排序,如果英语成绩相同,按照语文降序.
select * from exam order by english desc, chinese desc;
* 查询姓李的学生的信息,同时按照英语升序排序.
select * from exam where name like '李%' order by english asc;
```
* 聚合函数
* `sum() count() max() min() avg()`
```
* 查询每个学生总成绩:
* select name,(english+chinese+math) from exam;
* 统计所有学生的总分:
* select sum(english+chinese+math) from exam; -- ifnull(english,0)
* select sum(english)+sum(chinese)+sum(math) from exam;
* 统计学生的个数:
* select count(*) from exam;
* 统计英语成绩的最高分:
* select max(english) from exam;
* 统计语文成绩的最低分:
* select min(chinese) from exam;
* 统计英语成绩平均分:
* select avg(english) from exam;
```
* 分组
* `group by`
* SQL的查询语句的总结
顺序: `select...from...where...group by...having...order by...limit(0,*);`
`Ifnull( ,0)`
##多表查询
##数据库的多表设计
* 一对多
* 多对多
* 一对一
## 多表设计
* 一对多的关系的建表原则:
* 多的一方创建一个字段,这个字段作为外键执向一的一方的主键.
* 多对多的关系的建表原则:
* 创建一个第三种表,中间表中至少需要两个字段分别作为外键执向多对多双方的各自的主键.
* 一对一的关系的建表原则:
* 唯一外键对应:假设一对一的双方是一对多的关系.在多的一方创建外键执向一的一方的主键.需要在外键上添加一个unique约束.
* 主键对应:将一对一的双方的主键建立映射.
##约束:用来保证数据的完整性.
* 多表约束:外键约束!!!
* `alter table 表名 add foreign key (uid) references 表名(uid);`
* `foreign key(uid) references 表名(uid)`
##多表的查询
* 多表的查询的方式: `加 条件 主键和外键相等`
```
* 交叉连接:
* select * from A,B; --- 获得的是两个表的笛卡尔积.
* 内连接: inner join -- inner 可以省略
* 显式内连接:select * from A inner join B on 条件(主键和外键相等);
* SELECT * FROM customer c INNER JOIN orders o ON c.cid = o.cid;
* 隐式内连接:select * from A,B where 条件(主键和外键相等);(常用)
* SELECT * FROM customer c ,orders o WHERE c.cid = o.cid;
* 外连接:outer join -- outer 可以省略
* 左外连接:left outer join -- select * from A left outer join B on 条件(主键和外键相等);
* SELECT * FROM customer c LEFT OUTER JOIN orders o ON c.cid = o.cid;
* 右外连接:right outer join -- select * from A right outer join B on 条件(主键和外键相等);
* SELECT * FROM customer c RIGHT OUTER JOIN orders o ON c.cid = o.cid;
```
##多表查询的子查询
* 一个SQL语句查询的过程中需要依赖另一个查询语句.`使用as起别名,as可以省略.`
* `SELECT * FROM customer c,orders o WHERE c.cid = o.cid AND c.cid IN (SELECT cid FROM orders WHERE addr LIKE '海淀%');`
* `SELECT (CASE gender, WHEN 1 THEN '男'ELSE '女'END )AS '性别'FROM 表名` |
|