语法:
create table 表名( 列名1 数据类型, 列名2 数据类型, ...... 列名n 数据类型 ); -- 注意:最后一个列名不需要加逗号
常见数据类型
复制表
查询数据
where字句后跟条件
运算符
> 、 < 、 >= 、 <= 、 = 、 <> BETWEEN...AND IN(集合) LIKE 占位符: _ :单个任意字符 % :多个任意字符 IS NULL and 或 && or 或 || not 或 !
将一列数据作为一个整体,进行纵向的一些计算
注意:聚合函数的计算,排除null值的计算
解决方案:
1.选择不包含空值的列进行计算
2.使用IFNULL函数将空值替换
对表中的数据进行限定,保证数据的正确性、有效性和完整性
非空且唯一
一张表只能有一个字段为主键
主键就是表中记录的唯一标识
如果某列是数值类型的,使用 auto_increment 可以来完成值的自动增长
某一列的值不能重复
在创建表时,可以添加外键
语法:
create table 表名{ ... 外键列 -- 外键约束 constraint 外键约束名称 foreign key (外键列名称) references 外表名称(外表列名称) };
创建表之后给某列添加外键约束
删除外键约束
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,
这些不同的规范要求被称为不同的范式,各种范式呈递次规范,
越高的范式,数据库冗余越小
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF,又称完美范式)
每一列都是不可分割的原子数据项
在1NF的基础上,非码属性必须完全依赖于候选码
(在1NF基础上,消除非主属性对主码的部分函数依赖)
函数依赖 | A-->B,如果通过A属性(属性组)的值,可以确认唯一B属性的值,则称B依赖于A 例如:学号-->姓名 (学号,课程名称)-->分数 |
---|---|
完全函数依赖 | A-->B,如果A是一个属性组,则B属性值需要确认依赖于A属性组中所有的属性值 例如:(学号,课程名称)-->分数 |
部分函数依赖 | A-->B,如果A是一个属性组,则B属性值需要确认依赖于A属性组中某一些属性的值即可 例如:(学号,课程名称)-->分数 |
传递函数依赖 | A-->B,B-->C。如果通过A属性(属性组)的值,可以确认唯一B属性的值, 再通过B属性(属性组)的值确认唯一C属性的值,则称C属性传递函数依赖于A 例如:学号-->系名,系名-->系主任;可以得出 学号-->系主任 |
码 | 如果一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码 主属性:码属性组中的所有属性 非主属性:除了码属性组中的属性外其他的属性 |
在2NF基础上,任何非主属性不依赖于其他非主属性
(在2NF基础上,消除传递依赖)
隐式内连接:使用where条件消除无用数据
select t1.name, -- 员工表姓名 t1,gerder, -- 员工表性别 t2.name -- 部门表名称 from emp t1, -- 员工表 dept t2 -- 部门表 where t1.dept_id = t2.id;
显示内连接
select t1.name, -- 员工表姓名 t1,gerder, -- 员工表性别 t2.name -- 部门表名称 from emp t1 -- 员工表 inner join -- inner可以省略 dept t2 -- 部门表 on t1.dept_id = t2.id;
内连接查询思路:
左外连接
查询的是左表所有的数据以及其交集部分
-- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称 select t1.*, t2.name from emp t1 -- 员工表 left join dept t2 -- 部门表 on t1.dept_id = t2.id;
右外连接
查询的是右表所有的数据以及其交集部分
-- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称 select t1.*, t2.name from dept t2 -- 部门表 right join emp t1 -- 员工表 on t1.dept_id = t2.id;
查询中嵌套查询,我们称被嵌套的查询为子查询
-- 1.查询最高工资是多少? 9000 select max(salary) from emp; -- 2.查询员工信息,并且工资等于9000的 select * from emp where emp.salary = 9000; -- 3.查询员工信息,并且工资是最高的 select * from emp where emo.salary = ( select max(salary) from emp );
1.子查询的结果是单行单列的:
2.子查询的结果是多行单列的:
3.子查询的结果是多行多列的:
子查询可以作为一张虚拟表参与查询
-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息 select * from dept t1, ( select * from emp where emp.join_date > '2011-11-11' ) t2 where t1.id = t2.dept_id; -- 使用 普通内连接 实现 select * from emp t1, dept t2 where t1.dept_id = t2.id and t1.join_date > '2011-11-11';
如果一个包含多个步骤的业务操作,被事务管理,
那么这些操作要么同时成功,要么同时失败。
事务提交的两种方式:
修改事务的默认提交方式:
查看事务的默认提交方式:
select @@autocommit;
修改事务的默认提交方式:
set @@autocommit = 0;
多个事务之间是隔离的,相互独立的。
但是如果多个事务操作同一批数据,则会引发一些问题,
设置不同的隔离级别就可以解决这些问题。
数据库查询隔离级别:
select @@tx_isolation;
数据库设置隔离级别:
set global transaction isolation level 级别字符串; -- 例如 set global transaction isolation level serializable;
DBA数据库管理员
创建用户
create user '用户名'@'主机名' identified by '密码'; -- 例如:创建一个账户为zhangsan密码为123只能在本机登录数据库的用户 create user 'zhangsan'@'localhost' identified by '123'; -- 例如:创建一个账户为lisi密码为123可以在任意主机登录的用户 create user 'lisi'@'%' identified by '123';
删除语法
drop user '用户名'@'主机名'; -- 例如:删除刚刚创建的zhangsan用户 drop user 'zhangsan'@'localhost';
修改用户密码语法
-- 方式一: update user set password=password('新密码') where user='用户名'; -- 例如:修改刚刚创建的lisi用户的密码为abc update user set password=password('abc') where user='lisi'; -- 方式二: set password for '用户名'@'主机名' = password('新密码'); -- 例如:修改刚刚创建的lisi用户的密码为abc set password for 'lisi'@'%' = password('abc');
切换到mysql数据库
use mysql;
查询user表
select * from user;
通配符(%):表示可以在任意主机上使用该用户登录数据库
查询权限
show grants for '用户名'@'主机名'; -- 例如:查询root用户的权限 show grants for 'root'@'%';
授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'; -- 例如:授予用户lisi对于数据库db1中t1表的查询和修改权限 grant select,update on db1.t1 to 'lisi'@'%'; -- 例如:授予用户zhangsan对于所有数据库中的所有表的所有权限 grant all on *.* to 'zhangsan'@'localhost';
撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'; -- 例如:将用户lisi对于数据库db1中t1表的查询权限撤销掉 revoke select on db1.t1 from 'lisi'@'%';