1. 客户端和数据库操作
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
2 表操作
1.查看当前数据库中有哪些表show tables;
**2.创建一张新表create table表名(列表/字段名数据类型[,列表/字段名数据类型]...);
**3.查看表结构desc表名;
4.删除表drop表名;非常危险的操作
3 CRUD增刪改查
3.1新增-插入
insert into表名[(列名[,列名]...)] values(值[,值]...);
指定了多少列名,就需要指定多少值,值与列名一一对应
不指定列名,值的顺序与个数和表中所有的列一一对应
3.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 列名l,列名]...from表名 where 列名/表达式比较/逻辑运算符order by 列名asc|desc;==
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.3更新
==update 表名set 列名=值where条件order by 子句 limit num; =={如果不指定条件和limi的数量就会更新整表}
3.4删除
delete from表名where条件order by子句limit num; {如果不指定条件和limi的数量就会删除整表中的数据}
4 数据库约束
1.非空约束:NOT NULL标记一个字段是否可以为空,指定了这个约束,字段就不能为空
2.唯一约束:UNIQUE 标记一个字段的内容在当前列中唯一,不能重复,但是可以为NULL
3.主键约束:PRIMARY KEY,在约束的方式上相当于NOT NULL+UNIQUE
4.默认约束:DEFAULT 当一个字段没有指定值时(为NULL时),不指定列的值的时,就用默认值去填充该列
5.外键约束:FOREIGN KEY一个表中的字段与另一个表中的主键建立关联关系,当对表中的数据进行增删改的时候数据库会帮我们进行检查
5 表的设计(三大范式)
1.第一范式:要求表中的每一个列不可再分,有一个简单的方法,数据库中提供的数据类型可以描述这个字段不满足第一范式的数据库就不是关系型数据库
**2.第二范式:在第一范式的基础上,消除部分函数依赖,只能出现在有复合主键的表中(多个候选键),如果有一字段只依赖于复合主键中的某一个列,那么就需要把这个列剔除,单独建表不满足第二范式的情况下会出现一些数据异常数据冗余更新异常,删除异常,新增异常
3.第三范式:在第二范式的基本上,消除传递依赖
6 关系模型
**1.一对一关系:各自先建立各自的表,在其中一张表中加一个字段完成对另一张表的引用(建立关系)
**2.一对多关系:各自先建立各自的表,在一这一方设置一个主键,在多这一方加一个字段,两表建立引用关系
3.多对多关系:各自先建立各自的表,另外新加一张关系
7 聚合函数
==1.COUNT(列|*);统计结果的条数
==2.SUM(列)求和
==3.AVG(列)求平均值
==4.MIN(列)最小值
==5.MAX(列)最大值
8 GROUP BY
GROUP BY 分组查询对某一个字段进行分组操作,分组后可以结合聚合函数进行一些运算
9 HAVING
HAVING子句对GROUP BY的结果进行过滤的
10 联合查询(表连接查询)
1.内连接
select from table1, table2 where table1.xxx = table2.xxx;
select * 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 join table2 on table1.xxx = table2.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