##DDL :操作数据库、表
一.操作数据库: CRUD
1. C(Create):创建
*创建数据库:
create database 数据库名称;
*创建数据库,判断不存在,再创建:
*create database if not exists数据库名称;
*创建数据库,并指定字符集
*create database 数据库名称character set 字符集名;
*练习:创建db4数据库, 判断是否存在,并制定字符集为gbk
* create database if not exists db4 character set gbk;
2. R(Retrieve) :查询
*查询所有数据库的名称:
*show databases;
*查询某个数据库的字符集:查询某个数据库的创建语句
*show create database 数据库名称;
3. U(Update):修改
*修改数据库的字符集
*alter database 数据库名称character set 字符集名称;
4. D(Delete):删除
删除数据库
*drop database 数据库名称;
*判断数据库存在,存在再删除
* drop database if exists 数据库名称;
5.使用数据库
查询当前正在使用的数据库名称
*select database();
二.操作表
1. C(Create):创建
1.语法:
create table 表(
列名1数据类型1,
列名2数据类型2,
列名n数据类型n
);
*注意:最后一列,不需要加逗号(,)
复制表:
create table表名like 被复制的表名;
2. R(Retrieve) :查询
*查询某个数据库中所有的表名称
show tables;
*查询表结构.
*desc表名;
3. U(Update) :修改
1.修改表名
alter table 表名 rename to 新的表名;
2.修改表的字符集
alter table表名character set 字符集名称;
3.添加一列
alter table表名add 列名 数据类型;
4.修改列名称类型
alter table 表名 change 列名 新列别 新数据类型;
alter table 表名modify 列名 新数据类型;
5.删除列
4. D(Delete):删除
drop table表名;
* drop table if exists 表名;
## DML :增删改表中数据
1.添加数据:
*语法:
insert into 表名(列名1,列名2....列名n) values(值1,值2....值n);
*注意:
1.列名和值要一一 对应。
2.如果表名后,不定义列名,则默认给所有列添加值
insert into 表名values(值1,值2,...值n);
3.除了数字类型,其他类型需要使用引号(单双都可以)引起来
2.删除数据:
*语法:
delete from表名[where 条件]
*注意:
1.如果不加条件,则删除表中所有记录。
2.如果要删除所有记录
1. delete from表名;-
--不推荐使用。有多少条记录就会执行多少次删除操作
2. TRUNCATE TABLE名; -- 先删除表,然后再创建一张一样的表。
3.修改数据:
*语法:
update 表名 set 列名1 =值1,列名2 =值2,... [where 条件] ;
## DQL :查询表中的记录
1.语法:
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
2.基础查询
1.多个字段的查询
select 字段名1,字段名2... from 表名;
*注意:
如果查询所有字段,则可以使用*来替代字段列表。
2.去除重复:
distinct
3.计算列
*一般可以使用四则运算计算一些列的值。 (- 般只会进行数值型的计算)
*ifnull(表达式1,表达式2) : null参与的运算,计算结果都为null
*表达式1 :哪个字段需要判断是否为null
*如果该字段为nul1后的替换值。
4.起别名:
*as :Ias也可以省略
3.条件查询
1. where子句后跟条件
2.运算符
>、<、<=、>=、=、<>
BETWEEN. . . AND 在什么和什么之间
IN(集合)
LIKE :模糊查询
*占位符
_单个任意字符
%:多个任意字符
IS NULL 判断一个字段值是空
and 或&&
or或||
not或!
# DQL:查询语句
1.排序查询
*语法: order by子句
*order by排序字段1 排序方式1,排序字段2 排序方式2...
*排序方式:
*ASC :升序,默认的。
*DESC :降序。
*注意:
*如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。|
按照math(数学成绩)排序
2.聚合函数:将一列数据作为一个整体,进行纵向的计算。
1. count :计算个数
2. max :计算最大值
3. min:计算最小值
4. sum:计算和
5. avg:计算平均值
运行效果:
SELECT COUNT (IFNULL (english,0)) FROM student;
SELECT COUNT (id) FROM student;
SELECT MAX (math) FROM student;
3.分组查询
1.语法: group by分组字段;
2.注意:
1.分组之后查询的字段:分组字段、聚合函数
2. where和having 的区别?
1. where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
2. where后不可以跟聚合函数,having可以进行聚合函数的判断。
4.分页查询
1.语法: limit 开始的索引,每页查询的条数;
2.公式:开始的索引= (当前的页码 - 1) * 每页显示的条数
##表约束
*概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
分类:
1.1主键约束: primary key
1.注意:
1.含义:非空且唯一
2. 一张表只能有一个字段为主键
3主键就是表中记录的唯一标识
自动增长
2.非空约束: not null
3.唯一约束: unique
4.外键约束: foreign key
级联操作
##数据库的设计
1.多表之间的关系
1.分类:
1.一对一(了解) :
*如:人和身份证
*分析:一个人只有一个身份证,一个身份证只能对应一个人
2. 一对多(多对一) :
*如:部门和员工
*分析:一个部门有多个员工,一个员工只能对应一个部门
3.多对多:
*如:学生和课程
*分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择
2.实现关系:
1.一对多(多对一) :
*如:部门和员工
实现方式:在多的一方建立外键,指向一的一方的主键。
2.多对多:
*如:学生和课程
实现方式:多对多关系实现需要借助第三张中间表。
中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键
3.一对一:(了解)
实现:对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。
2.三大范式
分类:
1.第一范式(1NF) :每一列都是不可分割的原子数据项
2.第二范式(2NF) :在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
3.第三范式(3NF) :在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
##数据库的备份和还原
命令行:
”语法:
备份: mysqldump -u用户名 -p密码 > 保存的路径
*还原:
1.登录数据库
2.创建数据库
3.使用数据库
4.执行文件。source 文件路径
##多表查询
*笛卡尔积:
*有两个集合A,B . 取这两个集合的所有组成情况。
*要完成多表查询,需要消除无用的数据
*多表查询的分类:
1.内连接查询:
(1)隐式内连接:使用where条件消除无用数据
用别名替换表明
(2)显示内连接查询
语法: select 字段列表from表名1 inner join表名2 on条件 (inner可以省略不写)
内连接查询注意事项:1.从哪些表中查询数据 2.条件是什么 3.查询些字段
2.外链接查询:
(1)左外连接
语法: select字段列表from 表1 left outer join 表2 on条件 ( outer可以省略)
查询的是左表所有数据以及其交集部分。
查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称
select t1*,t2 from emp t1 left dept t2 on t1.`dept_id`=t2.`id` ; (查询左表全部和右表交集部分)
(2)右外连接:
语法: select字段列表from 表1 right outer join 表2 on条件 ( outer可以省略)
查询的是右表所有数据以及其交集部分。
右表 :t2 左表:t1 (查询右表的全部数据和左表的交集数据)
3.子查询:查询嵌套查询
(1)子查询的结果是单行单列的:
*子查询可以作为条件,使用运算符去判断。运算符> >= < <=
两部完成
子查询
(2)子查询的结果是多行单列的:
子查询可以作为条件,使用运算符in来判断
--查询'财务部'和'市场部'所有的员工信息
SELECT id FROM dept WHERE NAME = ' 财务部”OR NAME =” 市场部;
SELECT * FROM emp WHERE dept_ id = 3 OR dept_ id=2;
--子查询
SELECT * FROM emp WHERE dept id IN (SELECT id FROM dept WHERE NAME = ' 财务部' OR NAME =‘市场部 ' ) ;
(3)子查询的结果是多行多列的:子查询可以作为一张虚拟表。
##事务
1.事物的基本介绍
(1)概念:
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
(2)操作:
开启事务: start transaction;
回滚: rollback;
提交: commit;
(3)MySQL数据库中事务默认自动提交
*事务提交的两种方式:
*自动提交:
“mysql就是自动提交的
*一条DML(增删改)语句会自动提交一 次事务。
*手动提交:
*需要先开启事务,再提交
*修改事务的默认提交方式:
查看事务的默认提交方式: SELECT @@autocommit; -- 1代表自动提交 0 代表手动提交
修改默认提交方式: set @@autocommit = 0;
2.事务的四大特征
(1)原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
(2)持久性:当事务提交或回滚后,数据库会持久化的保存数据。
(3)隔离性:多个事务之间。相互独立。,
(4) 一致性:事务操作前后,数据总量不变
3.事务的隔离级别(了解)
概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同-批数据,则会引发一 些问题,设置不同的隔离级别就可以解决这些问题。
存在问题:
1.脏读:一个事务,读取到另一个事务中没有提交的数据
2.不可重复读(虚读) :在同一个事务中,两次读取到的数据不一样。
3.幻读:一个事务操作(DML )数据表中所有记录,另-个事务添加了-条数据,则第一个事务查询不到自 己的修改。
*隔离级别:
1. read uncommitted :读未提交
*产生的问题:脏读、不可重复读、幻读
2. read committed :读已提交(Oracle)
*产生的问题:不可重复读、幻读
3. repeatable read :可重复读(MySQL 默认)
*产生的问题:幻读
4. serializable :串行化
*可以解决所有的问题
*注意:隔离级别从小到大安全性越来越高,但是效率越来越低
*数据库查询隔离级别:
* select @@tx_ isolation;
*数据库设置隔离级别:
* set global transaction isolation level 级别字符串;
## DCL:管理用户,授权
1.管理用户
(1)添加用户:
(2)删除用户
(3)修改用户密码
mysq1中忘记了root用户的密码?
1. cmd -- > net stop mysql 停止mysq1服务
*需要管理员运行该cmd
2.使用无验证方式启动mysql服务: mysqld --skip- grant- tables
3.打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功
4. use mysql;
5. update user set password = password( '你的新密码') where user = ‘root';
6.关闭两个窗口
7.打开任务管理器,手动结束mysqld.exe的进程
8.启动mysq1服务
9,使用新密码登录。
(4)查询用户
1.切换到mysql数据库
USE myql;
2.查询user表
SELECT * FROM USER;
*通配符: %表示可以在任意主机使用用户登录数据库
2.权限管理:
(1)查询权限:
SHOW GRANTS FOR用户名'@'主机名' ;
SHOW GRANTS FOR 'lisi'@'%';
(2)授予权限:
grant权限列表on数据库名.表名to '用户名'@'主机名';
(3)撤销权限:
--撤销权限:
revoke权限列表on数据库名.表名from '用户名'@'主机名';