MySQL的数据结构:数据库->表->数据
一、管理数据库
1.1查看所有数据库
show databases;
1.2创建数据库
1)create database 数据库名;
2)指定默认字符集与字符集的默认校验规则
create databases 数据库名 default character set utf8 collate utf8_general_ci;
1.3选择数据库
use 数据库名;
1.4查看数据库的状态
show create database 数据库名;
1.5删除数据库
drop database 数据库名
1.6修改数据库
alter database 数据库名 default character set gbk;
二、管理表
2.1查询所有表
show tables;
2.2创建表
create tables 表名{
字段1名 字段1类型,
字段2名 字段2类型,
}
2.3查看表的结构
1)show create table 表名; 以sql格式返回
2)desc 表名; 以表格形式返回
2.4删除表
drop table 表名
2.4修改表
1)添加字段
alter table 表名 add column 字段名 字段类型;
alter table 表名 add 字段1名 字段1类型,字段2名 字段2类型;(添加多个字段)
2)修改字段类型
alter table 表名 modify column 字段名 新字段类型;
3)修改字段名称
alter table 表名 change column 旧字段名 新字段名 字段类型;
4)删除字段
alter table 表名 drop column 字段名1,drop column 字段名2;
5)修改表名
alter table 旧表名 rename to 新表名;
三、管理数据
3.1查看表的数据
select * from student;
3.2插入数据
1)插入所有列(所有列的值都要按顺序依次插入)
insert into 表名values(字段1值,字段2值....);
2)插入部分列(列的数据和值的顺序和数量一定保持一致!)
insert into 表名 (字段1,字段2...)values(字段1值,字段2值....);
3.3修改数据
1)修改所有
update 表名 set 字段名 = "字段新值";
2)修改某个某些条件的数据
update 表名 set 字段1名 = "字段1新值" where 字段2 = “字段2值”;
3)修改多个列(SET 列名=值,列名=值...)
update 表名 set 字段1名 = "字段1新值" ,字段2名 = "字段2新值"where 字段3 = “字段3值”;
3.4删除数据
1)删除表的所有数据
delete from 表名;
truncate table 表名;
2)删除部分
delete from 表名 were 字段名 = 字段值;
注意:
①delete只能删除表中的数据,不能影响表中的自增长约束。truncate既能删除表的数据,也能够把表的子增长约束置为0.
②使用delete删除的数据,通过事务可以回滚。使用truncate删除的数据,不能回滚
③使用delete后面带条件。使用truncate后面不能带条件。
4查询数据
4.1查询所有列
select * from 表名;
4.2查询指定列
select 列名1,列名2 from 表名;
4.3查询时指定别名
select 列名1 as “别名1”,列名2 as “别名2” from 表名;(as可省略)
4.4合并列查询
select 列名1 “列名1的别名”,(列名2+列名3)“列名2+列名3的别名” from 表名; (和数值以外合并没有意义)
4.5查询添加常量列
select 列名1 “列名1的别名”,“常量” as “常量对应的列名”;
4.6查询去除重复数据
select distinct 列名 from 表名;
4.7条件查询
1)逻辑条件
select * from 表名 where 字段1 = 字段1值 and 字段2 = 字段2值;
2)比较条件
select * from 表名 where 字段1 >值1;
select * from 表名 where 字段1 >=值1;
select * from 表名 where 字段1 >值1 or 字段1 < 值1;
select * from 表名 where 字段1 >值1 and 字段1 < 值1;
select * from 表名 where 字段1 between 值1 and 值2;
3)判空条件
select * from 表名 where 字段1名 is null;
select * from 表名 where 字段1名 = "'";
select * from 表名 where 字段1名 is null or 字段1名 = "'"; 为空,或初始值为""
select * from 表名 where 字段1名 is not null and 字段1名 = <>; 不为空,且初始值不为""
4)模糊条件
%:表示任意0或多个字符
_表示一个字符
select * from 表名 where 字段名 like "%z%"
5)聚合查询
select sum(字段名) from 表名; 求和
select avg(字段名) from 表名; 平均数
select max(字段名) from 表名; 最大值
select min(字段名) from 表名; 最小值
select count(字段名) from 表名; 统计数量,会排除null值的数据
6)分页查询
①select 字段名,count(*) "别名" from 表名 group by 字段名;
②select count(*) from 表名 group by 字段名;
③select count(1) from 表名 group by 字段名; ②和③基本一样,可能③的性能更高
7)分组筛选
select gender,count(*) "别名" from 表名 group by 字段名 having count(*)>2;
五、数据约束
5.1默认值
作用:当用户对使用默认值的字段不插入值的时候,就使用默认值。
注意:①对默认值字段插入null是可以的。
②对默认值字段可以插入非null。
字段名 字段类型 defalult 默认值;
5.2非空
作用: 限制字段必须赋值
注意:①非空字符必须赋值
②非空字符不能赋null
字段名 字段类型 not null;
5.3唯一
作用: 对字段的值不能重复
注意:①唯一字段可以插入null
②唯一字段可以插入多个null
字段名 字段类型 unique;
5.4主键
作用: 非空+唯一
注意:①通常情况下,每张表都会设置一个主键字段。用于标记表中的每条记录的唯一性。
②建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的 id字段。
字段名 字段类型 primary key;
5.5自增长
作用: 自动递增
注意:①自增长字段可以不赋值,自动递增
②查询操作不影响自增长约束
③truncate会影响自增长约束
5.6外键
作用:约束两种表的数据
出现两种表的情况:
解决数据冗余高问题: 独立出一张表
例如: 员工表 和 部门表
问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入!!!!!
使用外键约束:约束插入员工表的部门ID字段值
解决办法: 在员工表的部门ID字段添加一个外键约束
部门表(主表)
create table dept(
id int primary key;
dept_name varchar(20);
)
修改员工表(副表/从表)
create table employee(
id int primary key,
emp_name varchar(20),
dep_id int,-- 把部门名称改为部门ID
-- 声明一个外键约束
constraint emloyee_dept_fk foreign key(deptId) references dept(id)
-- 外键名称 外键 参考表(参考字段)
)
注意:
1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!
2)主表的参考字段通用为主键!
3)添加数据: 先添加主表,再添加副表
4)修改数据: 先修改副表,再修改主表
5)删除数据: 先删除副表,再删除主表
5.7级联操作
问题: 当有了外键约束的时候,必须先修改或删除副表中的所有关联数据,才能修改或删除主表!但是,我们希望直接修改或删除主表数据,从而影响副表数据。可以使用级联操作实现!!!
级联修改:on update cascade
级联删除:on delete cascate
create table employee(
id int primary key,
emp_name varchar(20),
dep_id int,-- 把部门名称改为部门ID
-- 声明一个外键约束
constraint emlyee_dept_fk foreign key(deptId) references dept(id) on update cascade on delete cascade
)
--级联修改
update dept set id = 5,where id = 4;
--级联删除
delete from dept where id= 1;
六、三大范式
第一范式: 要求表的每个字段必须是不可分割的独立单元
第二范式: 在第一范式的基础上,要求每张表只表达一个意思。表的每个字段都和表的主键有依赖。
第三范式: 在第二范式基础,要求每张表的主键之外的其他字段都只能和主键有直接决定依赖关系。
七、关联查询(多表查询)
7.1交叉连接查询
不推荐。产生笛卡尔乘积现象:m * n,有些是重复记录
select emp_ame,dept_name from employee,dept;
7.2内连接查询
只有满足条件的结果才会显示(使用最频繁)
1)select emp_name,dept_name from employee,dept where employeee.dep_id = dept.id;
2)select emp_name,dept_name from employee inner join dept on employeee.dep_id = dept.id;
3))select emp_name,dept_name from employee e inner join dept d on e.dep_id = d.id;(别名)
7.3左(外)连接查询
使用左边表的数据去匹配右边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null
注意:左外连接:左表的数据一定会完成显示!
select emp_name,dept_name from employee e letf outer join dept d on e.dep_id = d.id;
7.4右(外)连接查询
使用右边表的数据去匹配左边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null
注意:右外连接:右表的数据一定会完成显示!
select emp_name,dept_name from employee e right outer join dept d on e.dep_id = d.id;