数据库概念
什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?
数据库:英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。 顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。
数据库管理系统:DataBaseManagement,简称DBMS。数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行增删改查。
常见的数据库管理系统:MySQL、Oracle、MS SqlServer、DB2、sybase等....
SQL:结构化查询语言,学习者需要学习SQL语句,通过编写SQL语句,然后DBMS负责执行SQL 语句,最终来完成数据库中数据的增删改查操作。
三者之间的关系:DBMS--执行--> SQL --操作--> DB 先安装数据库管理系统MySQL,然后学习SQL语句怎么写,编写SQL语句之后,DBMS对SQL语句进行执行,最终来完成数据库的数据管理。
安装MySQL数据库
安装一般选择经典版进行安装,需要进行一些MySQL数据库实例配置,一般采用默认配置就可以,默认下一步安装完成
注意事项:
端口号port是任何一个软件/应用都会有的,端口号是应用的唯一代表。在同一台计算机上,端口号不能重复,具有唯一性。
设置mysql数据库的字符编码方式为 UTF8
服务名称默认为MySQL
环境变量path=其它路径;C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin
mysql超级管理员用户名不能改,一定是:root
卸载MySQL数据库
1、双击安装包进行卸载,用程序自带的卸载包卸载,残留文件会少很多
2、删除目录:
把C:\ProgramData下面的MySQL目录干掉。
把C:\Program Files (x86)下面的MySQL目录干掉。
3、卸载结束
关于MySQL服务
计算机-->右键-->管理-->服务和应用程序-->服务-->找mysql服务
MySQL的服务,默认是“启动”的状态,只有启动了mysql才能用。默认情况下是“自动”启动,自动启动表示下一次重启操作系统的时候自动启动该服务。
服务上点击右键:启动-->重启服务-->停止服务
改变服务的默认配置:服务上点击右键,属性,然后可以选择启动方式
在windows操作系统当中,如何使用命令来启动和关闭mysql服务
net start 服务名称;
net stop 服务名称;
其它服务的启停都可以采用以上的命令。
MySQL基础操作
使用客户端登录mysql数据库?
使用bin目录下的mysql.exe命令来连接mysql数据库服务器
退出mysql客户端?
命令行输入exit退出客户端
查看mysql中有哪些数据库?
show databases;
注意:以分号结尾,分号是英文的分号。
如何使用某个数据库?
use test;
如何查看某个数据库下有哪些表?
show tables;
如何查看mysql数据库的版本号?
select version();
查看当前使用的是哪个数据库?
select database();
注:在MySQL中,\c用来终止一条命令的输入,不见分号(英文)不执行,分号(英文)表示语句的结束!
MySQL常识
数据库当中最基本的单元是表:table
什么是表table?为什么用表来存储数据呢?
姓名 性别 年龄(列:字段)
---------------------------------------------------------
张三 男 20 ------->行(记录)
李四 女 21 ------->行(记录)
王五 男 22 ------->行(记录)
数据库当中是以表格的形式表示数据的,表具有简洁直观的效果。
任何一张表都有行和列:
行(row):被称为数据/记录。
列(column):被称为字段。
每一个字段都有:字段名、数据类型、约束等属性。
数据类型:字符串,数字,日期等。
约束:
非空约束:not null
唯一性约束: unique
主键约束: primary key (简称PK)
外键约束:foreign key(简称FK)
检查约束:check(mysql不支持,oracle支持)
主键:
主键约束:一种约束。
主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段。
主键值:主键字段中的每一个值都叫做:主键值。
主键的作用:主键值是每一行记录的唯一标识。任何一张表都应该有主键,没有主键,表可以称为无效!!
主键的特征:not null + unique(主键值不能是NULL,同时也不能重复!)
外键:
外键约束:一种约束(foreign key)。
外键字段:该字段上添加了外键约束。
外键值:外键字段当中的每一个值。
外键的作用:防止数据冗余,空间浪费,使其字段更具科学性,唯一性
外键的特征:子表中的外键引用的父表中的某个字段,被引用的这个字段不一定是主键,但至少具有unique约束,外键值可以为NULL。
注:非空约束not null约束的字段不能为NULL,not null只有列级约束,没有表级约束!
唯一性约束unique约束的字段不能重复,但是可以为NULL。
MySQL语句分类:
DQL:数据查询语言(带有select关键字的都是查询语句) select...
DML: 数据操作语言(对表当中的数据进行增删改的都是DML)insert-->增 delete-->删 update-->改 主要进行的是对表中数据的操作
TCL: 事务控制语言 事务提交:commit ; 事务回滚:rollback;
DDL: 数据定义语言(带有create、drop、alter的都是DDL)create-->创建 drop-->删除 alter-->修改 主要进行的是对表结构的操作
DCL: 数据控制语言 授权grant、撤销权限revoke....
数据库DQL操作
注:查询不会对数据库中的数据进行修改,只是一种显示数据的方式而已。
简单查询
查询数据表
SELECT 列名 FROM 表名 [WHERE 条件表达式]
#使用*表示所有列,字段 SELECT * FROM 表名; #查询所有的学生信息: select * from student; #查询指定字段的数据,多个字段之间以逗号分隔 SELECT 字段名 1, 字段名 2, 字段名 3, ... FROM 表名; #查询 student 表中的 name 和 age 字段 select name,age from student;
使用别名
SELECT 字段名1 AS 别名, 字段名2 AS 别名 FROM 表名;
对字段和表使用别名
SELECT 字段名1 AS 别名, 字段名2 AS 别名 FROM 表名 AS 表别名;
#使用别名 select name as 姓名,age as 年龄 from student; #表使用别名 select st.name as 姓名,age as 年龄 from student as st
注:表使用别名主要是用于多表联合查询,方便快捷,as关键字可以省略
数据去重
SELECT DISTINCT 字段名 FROM 表名;
#查询学生来自于哪些地方 select address from student; #去掉重复的记录 select distinct address from student;
条件查询
条件查询:不需要将表中所有数据都查出来,只查询出来符合条件的,对记录进行过滤。
SELECT 字段名 FROM 表名 WHERE 条件;
数据表准备
CREATE DATABASE bjpowernode; use bjpowernode; CREATE TABLE DEPT( DEPTNO int(2) not null , DNAME VARCHAR(14) , LOC VARCHAR(13), primary key (DEPTNO)); CREATE TABLE EMP( EMPNO int(4) not null , ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT(4), HIREDATE DATE DEFAULT NULL, SAL DOUBLE(7,2), COMM DOUBLE(7,2), primary key (EMPNO), DEPTNO INT(2)); CREATE TABLE SALGRADE( GRADE INT, LOSAL INT, HISAL INT ); INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 10, 'ACCOUNTING', 'NEW YORK'); INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 20, 'RESEARCH', 'DALLAS'); INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 30, 'SALES', 'CHICAGO'); INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 40, 'OPERATIONS', 'BOSTON'); commit; INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7369, 'SMITH', 'CLERK', 7902, '1980-12-17' , 800, NULL, 20); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20' , 1600, 300, 30); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7521, 'WARD', 'SALESMAN', 7698, '1981-02-22' , 1250, 500, 30); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7566, 'JONES', 'MANAGER', 7839, '1981-04-02' , 2975, NULL, 20); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28' , 1250, 1400, 30); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01' , 2850, NULL, 30); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7782, 'CLARK', 'MANAGER', 7839, '1981-06-09' , 2450, NULL, 10); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19' , 3000, NULL, 20); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7839, 'KING', 'PRESIDENT', NULL, '1981-11-17' , 5000, NULL, 10); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08' , 1500, 0, 30); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7876, 'ADAMS', 'CLERK', 7788, '1987-05-23' , 1100, NULL, 20); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7900, 'JAMES', 'CLERK', 7698, '1981-12-03' , 950, NULL, 30); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7902, 'FORD', 'ANALYST', 7566, '1981-12-03' , 3000, NULL, 20); INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7934, 'MILLER', 'CLERK', 7782, '1982-01-23' , 1300, NULL, 10); commit; INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 1, 700, 1200); INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 2, 1201, 1400); INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 3, 1401, 2000); INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 4, 2001, 3000); INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 5, 3001, 9999); commit;
注:查看数据表内容
注:查看数据表结构
1、计算员工年薪?
select ename,sal*12 from emp;
2、查询薪资等于800的员工姓名和编号?
select empno,ename from emp where sal = 800;
3、查询SMITH的编号和薪资?
select empno,sal from emp where ename = 'SMITH';
4、查询薪资不等于800的员工姓名和编号?
select empno,ename from emp where sal <> 800;
5、查询薪资小于2000的员工姓名和编号?
select empno,ename,sal from emp where sal < 2000;
6、 查询薪资在2450和3000之间的员工信息?
select empno,ename,sal from emp where sal between 2450 and 3000;
注:between … and …. 两个值之间, 等同于 >= and <= 并且between and是闭区间,包括两端的值,必须遵循左小右大。
7、查询哪些员工的津贴/补助为null?
select empno,ename,sal,comm from emp where comm is null;
注: is null 为 空(is not null 不为空),在数据库中null不能使用等号进行衡量,需要使用 is null 因为数据库中的null代表什么也没有,它不是一个值,所以不能使用等号衡量。
8、查询哪些员工的津贴/补助不为null?
select empno,ename,sal,comm from emp where comm is not null;
9、查询工作岗位是MANAGER并且工资大于2500的员工信息?
select empno,ename,job,sal from emp where job = 'MANAGER' and sal > 2500;
10、查询工作岗位是MANAGER和SALESMAN的员工?
select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
11、查询工作岗位是MANAGER和SALESMAN的员工?
select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');
注:in不是一个区间, in后面跟的是具体的值,相当于选择。
like关键字
注:称为模糊查询,支持%或下划线匹配 %匹配任意多个字符 下划线:任意一个字符。(%是一个特殊的符号,_ 也是一个特殊符号)
1、找出名字中含有O的?
select ename from emp where ename like '%O%';
2、找出名字以T结尾的?
select ename from emp where ename like '%T';
3、找出第二个字每是A的?
select ename from emp where ename like '_A%';
排序
1、查询所有员工薪资,排序?(默认为升序)
select ename,sal from emp order by sal;
2、 查询所有员工薪资,排序?(降序)
select ename,sal from emp order by sal desc;
3、查询员工名字和薪资,要求按照薪资升序,如果薪资一样,再按照名字升序排列?
select ename,sal from emp order by sal asc, ename asc;
4、 查询工资在1250到3000之间的员工信息,要求按照薪资降序排列?
select ename,sal from emp where sal between 1250 and 3000 order by sal desc;
注:执行顺序 from--> where--> select--> order by(排序最后执行)
分组函数
多行处理函数的特点:输入多行,最终输出一行。
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注:分组函数在使用的时候必须先进行分组,然后才能使用,如果没有对数据进行分组,整张表默认为一组。
1、找出最高工资?
select max(sal) from emp;
2、找出最低工资?
select min(sal) from emp;
3、计算工资和?
select sum(sal) from emp;
4、计算平均工资?
select avg(sal) from emp;
5、 计算员工数量?
select count(ename) from emp;
分组函数自动忽略NULL,你不需要提前对NULL进行处理。
count(具体字段):表示统计该字段下所有不为NULL的元素的总数。
count(*):统计表当中的总行数。
分组函数不能够直接使用在where子句中。
所有的分组函数可以组合起来一起用。
分组查询
注:先进行分组,然后对每一组的数据进行操作。
select ... from ... group by ...
1、查询每个工作岗位的工资和?
select job,sum(sal) from emp group by job;
2、查询每个部门的最高薪资?
实现思路:按照部门编号分组,求每一组的最大值。
select deptno,max(sal) from emp group by deptno;
3、查询“每个部门,不同工作岗位”的最高薪资?
实现思路:两个字段联合成一个字段来看(两个字段联合分组)
select deptno, job, max(sal) from emp group by deptno, job;
having关键字
注:使用having可以对分完组之后的数据进一步过滤,having不能单独使用,having不能代替where,having必须和group by联合使用。
1、查询每个部门最高薪资,要求显示最高薪资大于3000的?
第一步:找出每个部门最高薪资按照部门编号分组,求每一组最大值。
select deptno,max(sal) from emp group by deptno;
第二步:显示最高薪资大于3000的部门编号。
select deptno,max(sal) from emp group by deptno having max(sal) > 3000;
2、查询每个部门平均薪资,要求显示平均薪资高于2500的部门?
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2500;
注:此条案例单靠where是完成不了的,所以这时候引入了having关键字来进行进一步筛选。
思路优化:where和having,优先选择where,where完成不了需求,再选择 having。
连接查询
连接查询:从一张表中单独查询,称为单表查询。emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字, 这种跨表查询,多张表联合起来查询数据,被称为连接查询。
内连接:等值连接,非等值连接,自连接
外连接:左连接,右连接
全连接: 了解
引入
当两张表进行连接查询时,没有任何条件的限制会发生什么现象?
1、查询每个员工所在部门名称?
select ename,deptno from emp;
select * from dept;
两张表连接没有任何条件限制:
select ename,dname from emp, dept;
笛卡尔积现象:当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积 。
如何避免笛卡尔积现象?
连接时添加条件,满足这个条件的记录被筛选出来!
select emp.ename,dept.dname from emp, dept where emp.deptno = dept.deptno;
注:最终查询的结果条数是14条,但是匹配的过程中,匹配的次数并没有减少还是56次,只不过进行了四选一,次数没有减少。
总结:通过笛卡尔积现象得出,表的连接次数越多效率越低,所以尽量避免表的连接次数过多。
内连接和外连接
1、查询每个员工所在部门名称,显示员工名和部门名?(等值连接)
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;
2、查询每个员工的薪资等级,要求显示员工名、薪资、薪资等级?(非等值连接)
select e.ename, e.sal, s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
注:on后面 e.deptno = d.deptno 条件是等量关系,所以被称为等值连接。on后面 e.sal between s.losal and s.hisal 条件不是一个等量关系,称为非等值连接。
3、查询员工的上级领导,要求显示员工名和对应的领导名?(内连接之自连接)
select a.ename as '员工名', b.ename as '领导名' from emp a join emp b on a.mgr = b.empno;
4、 (内连接)
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;
5、(右外连接)
select e.ename,d.dname from emp e right join dept d on e.deptno = d.deptno;
6、(左外连接)
select e.ename,d.dname from emp e left join dept d on e.deptno = d.deptno;
注:带有right的是右外连接,又叫做右连接。带有left的是左外连接,又叫做左连接。right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表,left同理。在外连接当中,两张表连接,产生了主次关系。所以:外连接的查询结果条数一定是 >= 内连接的查询结果条数!!!
子查询
子查询:select语句中嵌套select语句,被嵌套的select语句称为子查询。
子查询可以在哪里出现:
select ..(select). from ..(select). where ..(select).
1、找出比最低工资高的员工姓名和工资?
第一步:查询最低工资是多少
select min(sal) from emp;
第二步:找出>800的
select ename,sal from emp where sal > 800;
第三步:合并
select ename,sal from emp where sal > (select min(sal) from emp);
from子句中的子查询:from后面的子查询,可以将子查询的查询结果当做一张临时表。
2、找出每个岗位的平均工资的薪资等级?(格式化后看的会明显一些,写一行是为了节约空间(哭哭哭......))
select t.*, s.grade from (select job,avg(sal) as avgsal from emp group by job) t join salgrade s on t.avgsal between s.losal and s.hisal;
注:这样去理解 :t表和s表进行表连接,条件为 t表avg(sal) between s.losal and s.hisal;
limit关键字
limit作用:将查询结果集的一部分取出来。通常使用在分页查询当中。
eg: 百度一页的记录条数默认为10,分页的作用是为了提高用户的体验,因为一次全部都查出来,用户体验差,这样可以一页一页翻页看。
完整用法:limit startIndex, length startIndex是起始下标,length是长度。起始下标从0开始。
缺省用法:limit 5; 这是取前5。
1、取出工资排名在[3-5]名的员工?
select ename,sal from emp order by sal desc limit 2, 3;
2、按照薪资降序,取出排名在前5名的员工?
select ename,sal from emp order by sal desc limit 5;
数据库DML操作
DML操作语句主要进行的是对数据的增删改操作。
insert插入
插入记录
INSERT [INTO] 表名 [字段名] VALUES (字段值)
样例
#将表中的所有字段写出 INSERT INTO 表名 (字段名 1, 字段名 2, 字段名 3…) VALUES (值 1, 值 2, 值 3); #只写插入数据 INSERT INTO 表名 VALUES (值 1, 值 2, 值 3…); #插入部分数据 INSERT INTO 表名 (字段名 1, 字段名 2, ...) VALUES (值 1, 值 2, ...);
注:字段名和值要一一对应,数量要对应。数据类型也要对应。insert语句一旦执行成功,那么必然会多一条记录。如果没有给其它字段指定值的话,默认值是NULL。
update修改
修改数据
update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3... where 条件;
注:如果没有条件限制会导致所有数据全部更新。
样例
#不带条件修改数据(修改所有) UPDATE 表名 SET 字段名=值; #带条件修改数据 UPDATE 表名 SET 字段名=值 WHERE 字段名=值;
delete删除
删除数据
delete from 表名 where 条件;
注:没有条件,整张表的数据会全部删除!
样例
#不带条件删除数据 DELETE FROM 表名; #带条件删除数据 DELETE FROM 表名 WHERE 字段名= 值; #使用 truncate 删除表中所有记录 TRUNCATE TABLE 表名;
数据库TCL操作
事务
事务(transaction):一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分。
eg: 假设转账,从A账户向B账户中转账10000.
第一步:将A账户的钱减去10000(update语句)
第二步:将B账户的钱加上10000(update语句)
这就是一个完整的业务逻辑,以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分。这两个update语句要求必须同时成功或者同时失败,这样才能保证钱是正确的。
注:事务是基于DML语句的,只有以上的DML语句是数据库表中数据进行增、删、改的。因为在实际生活中很多事是不能依靠一条DML语句就能完成的,需要多条DML语句共同联合起来才能完成,这便是事务存在的意义。
简单理解:由多条DML语句组成,构成的一个完整事务逻辑。
提交事务:清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中,提交事务标志着,事务的结束,并且是一种全部成功的结束
回滚事务:将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件,回滚事务标志着,事务的结束。并且是一种全部失败的结束。
1、回滚事务
2、提交事务
3、事务的特征
原子性 :说明事务是最小的工作单元,不可再分。
一致性:所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,以保证数据的一致性。
隔离性:A事务和B事务之间具有一定的隔离,不会对同一张表同时操作。
持久性:事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上!
4、事务和事务之间的隔离级别
脏读:所谓的脏读就是指一个事务读取了另外一个事务未提交的数据。
不可重复读:所谓的不可重复读是指事务中两次查询的结果不一致,原因是在查询的过程中其他事务做了更新的操作。
幻读:又被称为虚读,是指在一个事务内两次查询中数据条数不一致,幻读和不可重复读有些类似,同样是在两次查询过程中,不同的是,幻读是由于其他事务做了插入记录的操作,导致记录数增加。
可串行化:事务的最高隔离级别,效率最低,解决了所有的问题,这种隔离级别表示事务排队,不能并发! 每一次读取到的数据都是最真实的,并且效率是最低的。
数据库DDL操作
数据库操作
创建数据库
CREATE DATABASE 数据库名;
判断数据库是否已经存在,不存在则创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名;
创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
样例
#创建数据库 test1 create database test1; #判断是否存在,如果不存在则创建数据库 test2 create database if not exists test2; #创建数据库并指定字符集为 gbk create database db3 character set gbk;
删除数据库
DROP DATABASE 数据库名;
修改数据库
#修改数据库默认的字符集 ALTER DATABASE 数据库名 DEFAULT CHARACTER SET; #将数据库test2的字符集改成 utf8 alter database test2 character set utf8;
数据表操作
创建数据表
CREATE TABLE 表名 ( 字段名 1 字段类型 1, 字段名 2 字段类型 2 );
样例
#创建 student 表包含 id,name,birthday 字段 create table student ( id int, name varchar(20), birthday date );
删除数据表
DROP TABLE 表名;
样例
#直接删除表 s1 表 drop table s1; #判断表是否存在并删除 s1 表 drop table if exists `create`;
修改数据表
#添加数据表表列 ADD ALTER TABLE 表名 ADD 列名 类型; #修改列类型 MODIFY ALTER TABLE 表名 MODIFY 列名 新的类型; #修改列名 CHANGE ALTER TABLE 表名 CHANGE 旧列名 新列名 类型; #删除列 DROP ALTER TABLE 表名 DROP 列名; #修改表名 RENAME TABLE 表名 TO 新表名; #修改字符集 character set ALTER TABLE 表名 character set 字符集;
样例
#为学生表添加一个新的字段 remark,类型为 varchar(20) alter table student add remark varchar(20); #将 student 表中的 remark 字段的改成 varchar(100) alter table student modify remark varchar(100); #将 student 表中的 remark 字段名改成 intro,类型 varchar(30) alter table student change remark intro varchar(30); #删除 student 表中的字段 intro alter table student change remark intro varchar(30); #将学生表 student 改名成 student2 rename table student to student2; #将 student2 表的编码修改成 gbk alter table student2 character set gbk;
数据库DCL操作
用户
DBA:数据库管理员
DCL:管理用户,授权
管理用户
#添加用户 CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; #删除用户 DROP USER '用户名'@'主机名'; #修改用户密码 UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名'; UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi'; SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码'); SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');
权限
权限管理
#查询权限 SHOW GRANTS FOR '用户名'@'主机名'; SHOW GRANTS FOR 'lisi'@'%'; #授予权限 grant 权限列表 on 数据库名.表名 to '用户名'@'主机名'; #授予tuomasi全部权限 GRANT ALL ON *.* TO 'tuomasi'@'localhost'; #撤销权限 revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'; REVOKE UPDATE ON test.`test1` FROM 'lisi'@'%';
数据库三范式
数据库设计三范式
第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分依赖。
第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。
注:设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。