今天咱们不去学习新的MYSQL知识,统一来复习前几章咱们学过的内容。
客户端和数据库操作
1.登录 mysql -uroot -p
2.查看当前的数据库版本 select version();
3.显示所有数据库 show databases;
4.创建数据库 create [if not exists] database 数据库名 character set 字符编码集 collate 排序规则;
5.选择数据库 use 数据库名
6.查看当前选择了哪个数据库 select database();
7.删除数据库 drop [if exists]database 数据名;//非常危险的操作
8.查看警告信息 show warnings;
9.退出 quit/exit
表操作
1.查看当前数据库中有哪些表 show tables:
2.创建一张新表 create table 表名(列表/字段名 数据类型[,列表/字段名 数据类型]....);
3.査看表结构 desc 表名;
4.删除表 drop 表名;//非常危险的操作
CRUD增删改查
1.新增 -插入
insert into 表名[(列名[,列名]...)] values(值L,值]...);
指定了多少列名,就需要指定多少值,值与列名--对应
不指定列名,值的顺序与个数和表中所有的列一一对应
2.查询操作
a.全列査询 select*from 表名;// 不加限制的査询会把表中所有的数据都査出来
b.指定列査询 select 列名[,列名... from 表名;// 推荐使用
c.列为表达式的査询 select 列名/表达式 from 表名;
d.别名査询 select 列名/表达式 [as]别名 from 表名;//别名中如果包含空格,需要用单引号引起来
e.去重査询 select distinct 列名,[列名]........from 表名去重时只有所有的列都相等,才会判定为重复,才会去重
f.排序 select 列名[,列名].. from 表名 order by列名 asc|desc; // asc 升序 desc 降序
g.条件査询 select 列名[,列名].. from 表名 where 列名/表达式 比较/逻辑运算符 order by 列名 ascldesc;
h.区间査询 where 列名 between 开始条件 and 结束条件;// 等价于 开始条件 <= 列的值<= 结束条件
i.模糊査询 select*from 表名 where 列名 like'%值_;//% 匹配任意字符匹配单个字符
j.分页查询 select*from 表名 where 条件 order by列名 asc|desc limit num; // 查询前num条记录
select* from 表名 where 条件 order by 列名 asc|desc limit start,num;//从第start条开始,向后查num条
select* from 表名 where 条件 order by 列名 asc|desc limit num offset start;//从第start条开始,向后查num条
3.更新
update 表名 set 列名=值 where 条件 order by 子句 limit num; //如果不指定条件和limit的数量就会更新整表·
4.ALTER 关键字使用
a. 添加列: ALTER TABLE 表名 ADD COLUMN 列名 数据类型 【属性】;
b. 删除列: ALTER TABLE 表名 DROP COLUMN 列名;
c 修改列: ALTER TABLE 表名 MODIFY COLUMN 列名 新数据类型 【属性】;
d. 重命名列· ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 数据类型 【属性】;
e 添加索引 ALTER TABLE 表名 ADD INDEX 索引名 (列名);
//在users
表的age
列上添加一个名为idx_age
的索引。
f 添加唯一索引: ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);
//为users
表的email
列添加唯一索引idx_email
,确保email
值唯一。
g.删除索引 :ALTER TABLE 表名 DROP INDEX 索引名;
//从users
表中删除名为idx_age
的索引。
h 添加外键: ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (列名) REFERENCES 参照表名 (参照列名);
在orders
表的user_id
列上添加一个外键fk_user_id
,引用users
表的id
列。
i .删除外键 : ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
//删除orders
表中的外键约束fk_user_id
。
j 设置默认值 : ALTER TABLE 表名 ALTER COLUMN 列名 SET DEFAULT 默认值;
//将users
表的age
列默认值设置为18
。
移除列的默认值: ALTER TABLE 表名 ALTER COLUMN 列名 DROP DEFAULT;
修改自增初始值:ALTER TABLE 表名 AUTO_INCREMENT = 起始值;
添加分区(适用于分区表):ALTER TABLE 表名 ADD PARTITION (PARTITION 分区名 VALUES LESS THAN (值));
删除分区(适用于分区表):ALTER TABLE 表名 DROP PARTITION 分区名;
更改表名:ALTER TABLE 表名 RENAME TO 新表名;
5.删除
delete from 表名 where 条件 order by 子句 limit num;// 如果不指定条件和limit的数量就会删除整表中的数据
数据库约束
1.非空约束:NOT NULL 标记一个字段是否可以为空,指定了这个约束,字段就不能为空
2.唯一约束:UNIQUE 标记一个字段的内容在当前列中唯一,不能重复,但是可以为NULL
3.主键约束:PRIMARY KEY, 在约束的方式上相当于NOT NULL+ UNIQUE
4.默认约束:DEFAULT 当一个字段没有指定值时(为NULL时),不指定列的值的时,就用默认值去填充该列
5.外键约束:FOREIGN KEY 一个表中的字段与另一个表中的主键建立关联关系,当对表中的数据进行增删改的时候数据库会帮我们进行检查
表的设计
三大范式
1.第一范式:要求表中的每一个列不可再分,有一个简单的方法,数据库中提供的数据类型可以描述这个字段不满足第一范式的数据库就不是关系型数据库
2.第二范式:在第一范式的基础上,消除部分函数依赖,只能出现在有复合主键的表中(多个候选键),如果有一字段只依赖于复合主键中的某一个列,那么就需要把这个列剔除,单独建表不满足第二范式的情况下会出现-些数据异常:
数据几余,更新异常,删除异常新增异常
3.第三范式:在第二范式的基本上,消除传递依赖
关系模型
1.一对一关系:各自先建立各自的表,在其中一张表中加一个字段完成对另一张表的引用(建立关系)
2.一对多关系:各自先建立各自的表,不在一这一方设置一个主键,在多这一方加一个字段,两表建立引用关系
3.多对多关系:各自先建立各自的表,另外新加一张关系
聚合函数
1.COUNT(列*); 统计结果的条数
2.SUM(列) 求和
3.AVG(列)求平均值
4.MIN(列)最小值
5.MAX(列)最大值
GROUP BY 分组查询
对某一个字段进行分组操作,分组后可以结合聚合函数进行一些运算
HAVING子句
对GROUP BY 的结果进行过滤的
联合查询(表连接查询)
1.内连接
select*from table1,table2 where table1.xxx= table2.xxxselect*from table1 join table2 on table1.xxx= table2.xxx;select * from table1 inner join table2 on table1.xxx= table2.xxx:
表连接的执行过程:
1.先计算参与表连接的笛卡尔积
2.通过连接条件过滤无效数据
3.加入查询条件得到想要的结果行
4.精减列名得到最终想要查询的列
2.外连接,分为左外连接和右外连接
select* from table1 left ioin table2 on table1.xxx= table
2.xxx;select *from table1 right join table2 on table1.xxx= table2.xxx:
左外连接以左表为基准,左边的表中所有的数据全部显示,右表中没有对应的记录用NULL去填充
右外连接以右表为基准,右边的表中所有的数据全部显示,左表中没有对应的记录用NULL去填充主要应用在两张表数据不一致的场景里
3.自连接
select * from table1 t1, table1 t2 where t1.xxx = t2.xxx;把行转换成列,在查询的时候可以使用WHERE 条件进行过滤,实现行与行之间的比较
4.子查询
单行子查询:select * from table1 where id = (select id from table2 where clo = xxx);多行子査询:select * from table1 where id IN (select id from table2 where clo = xxx);内层查询的结果做为外层查询的条件,把多条语句合并为一条执行子查询可以无限嵌套,层数过多会影响效率
5.合并查询
select * from table1 union select * from table2;
select *from table1 union all select * from table2
作用是把两个结果集中合并成一个返回
注意:合并查询时多个查询的查询列表必须匹配,MYSQL不对结果做校验,写的时候务必注意
6.-条SQL语句中各部分的执行顺序
自己构造一条SQL不一定可以执行成功,但是相关的关键字都包含
select distinct id, name, avg(age) from student join class on student.class id = class.id where class id = 1group by student.id having avg(age)>0 order by student.id asc limit 100;
FROM .> JOIN ON -> WHERE -> GROUP BY -> HAVING -> SELECT .> DISTINCT --> ORDER BY --> LIMIT