一:MYSQL语言分类:
五类,数据查询语言、数据操纵语言、数据定义语言、数据控制语言、事务控制语言。SQL语言适用于所有数据库。
DQL(数据查询语言):select(查询),凡是select语句都是DQL语言。select语句使用频次占数据库使用语句的80%左右(使用频率超高)。
DML(数据操纵语言):insert(插入)、delete(删除)、update(更新、更改),主要对“表DDL(数据定义语言):create(创建)、drop(删除)、alter(更改)。主要对“表结构”进行增、删、改。 例如:对表中的某个字段进行增、删、改,或者改变表字段的类型等。一般表结构在数据库开发时就确定了,后期很少修改。
DCL(数据控制语言):grant(授权)、revoke(撤销)。主要是创建用户,对用户进行授权。
TCL(事务控制语言):commit(提交事务)、rollback(回滚事务)。 transaction(事务),事务是一个最小的工作单元,不可再分。只有DML语句(insert、delete、update)中才有事务,其它语句和事务无关。
二:创建表&修改表&删除表
创建表(create table) 第一步:打开使用的数据库,语法为:use 数据库名; 第二步:创建表,语法为:create table 表名 (字段名1 数据类型 primary key,字段名2 数据类型,字段名3 数据类型,..............); 第三步:查看表结构,语法为:desc 表名;
修改表(alter table) 第一步:查看表结构,命令为:desc 表名; 第二步:修改表。 1.修改表名语法为:alter table <原表名> rename to <新表名>;
修改字段名语法为:alter table <表名> change <原字段名> <新字段名> <新字段数据类型>;
修改字段数据类型语法为:alter table <表名> modify <字段名> <字段数据类型>;
添加字段语法:alter table <表名> add <字段名> <字段数据类型>;
删除字段语法:alter table <表名> drop <字段名> ;
添加外键约束语法:alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 对应主键所在表 (主键字段名);
删除外键约束语法:alter table 表名 drop foreign key(外键名称);
删除表(drop table) 删除单个表:drop table 表名; 删除多个表:drop table 表1名,表2名,表3名.......;
显示数据库编码格式:show variables like 'char%';
修改数据库字符集及校对规则:Alter database 数据库名 Default Character set utf8 Collate utf8_general_ci;
修改表中的字符集及校对规则:Alter table 数据表名 Default Character set utf8 Collate utf8_general_ci; (注:此句把表默认的字符集和所有字符列改为新的字符集) 数据约束:目的是保证表中数据的合法性、完整性、有效性。
常见的约束: 1.非空约束(not null):字段不能为空。
唯一约束(unique):字段不能重复。 create table stuinfo(id int(4) primary key, name varchar(20) unique, #列级约束 namecode varchar(10) unique, #列级约束 sex varchar(2), brithday datetime, phone varchar(13)); create table stuinfo(id int(4) primary key, name varchar(20) , namecode varchar(20) , sex varchar(2), brithday datetime, phone varchar(13), unique(name,namecode )); #表级约束
主键约束(primary key):简称PK,不能为空,也不能重复。
外键约束(foreign key):简称FK。 5.检查约束(check),mysql中没有,不支持该约束。但是Oracle数据库中有check约束。
三:增加索引&限制条件索引&删除索引
索引作用:用来提高数据查询速度,提高查询时效。同时可以提高多表之间的连接速度。
索引类型:
①:primary key 主键索引(自动创建一个聚簇索引);②:fulltext 全文索引;③:normal 正常索引; ④:spatial 空间索引;⑤:unique 唯一索引;⑥:复合索引(即给多字段添加一个索引)。
索引方式(即查询方式):
顺序查找、二分查找、二叉树查找(B-tree)、hash树查找等。
A.在创建表时创建索引:index 索引名 (字段名 asc/desc) ; #普通索引。索引名通常为:字段名_index 举例:index xh_index(xh asc) ; #xh代表学号 unique index 索引名 (字段名 asc/desc) ; #唯一索引。索引名通常为:字段名_index 举例:unique index xh_index(xh desc); #xh代表学号
B.在已经建好的表中创建索引: create index 索引名 on 表名(字段名 ASC/DESC); #创建单个字段索引。字段名不允许加单引号。 create index 索引名 on 表名(字段名1 ASC,字段名2 DESC); #创建多个字段索引。字段名不允许加单引号。 create unique index 索引名 on 表名(字段名 ASC/DESC); #创建唯一限制条件字段索引。字段名不允许加单引号。
C.查看索引:
查看一个表中的所有索引:show index from 数据库名 . 表名;(或者show index from 表名;) 举例:查看学生表中所有详细信息。show index from 学生课程 . 学生;
展示MySQL如何使用索引来处理select语句以及连接表。即只需要在select前面加上Explain。 explain select 字段名 from 表名 where 字段名='xxx'/xxx;
添加索引语法:alter table 表名 add index 索引名 (字段名1[,字段名2 …]); 例如:alter table employee add index emp_name (name);
添加主关键字索引语法:alter table 表名 add primary key (字段名); 例如:alter table employee add primary key(id);
添加唯一限制条件的索引语法:alter table 表名 add unique 索引名 (字段名); 例如:alter table employee add unique emp_name(number);
删除某个索引语法:alter table 表名 drop index 索引名; drop index 索引名 on 表名; 例如:alter table employee drop index emp_name;
数据操纵语言(insert\update\delete) 数据定义语言(create) 创建一个学生数据表(stuinfo),包含字段id,name,sex,brithday,phone
创建表:create table 表名(字段1 数据类型 约束条件,字段2 数据类型,字段3 数据类型,......); (举例):create table stuinfo(id int(4) primary key,name varchar(20),sex varchar(2), brithday datetime,phone varchar(13)); insert into stuinfo (id,name,sex,brithday,phone) values(1,'lilei','男',19830909,'12345678900'); #一次赋值一条数据。 insert into stuinfo values(2,'malin','男',19830809,'12345678901'); #省略字段名,赋值必须按照字段顺序进行,否则,赋值不成功。 insert into stuinfo (id,name,sex,brithday,phone) values(3,'rose','女',20000909,'12345678902'),(4,'liyang','女',20011009,'12345678903'); #一次赋值多条数据。 查询表:select * from stuinfo; #查询stuinfo表中所有信息
更新表信息:update stuinfo set name='adsn' where id=1; -- 把id=1的名字改为adsn
删除表信息:delete from stuinfo where id=3;
删除大表数据(截断,保留字段属性,不可回滚,数据永久丢失,需要谨慎操作): truncate table 表名;
复制表: 语法:create table 表名 AS select 查询语句; #将查询结果当着表创建出来。 举例:create table www1 as select * from abc; #将表abc查询结果当着www1表创建出来。 create table www2 as select 字段1,字段2,字段3 from stu00; #将表stu00中字段1、字段2、字段3查询出来,当着www2表创建出来。
批量插入数据:语法:insert into 表名 select 查询语句; 简单查询。select(DQL语言)、AS关键字取别名 1. select 字段1,字段2,..... from 表名; #单个字段查询 举例:select name, sal*12 from emp; #查询emp表中员工的年薪工资 (其中“sal*12”字段是可以参加运算的) select name, sal*12 AS yearsal from emp; #将sal*12字段重新加别名为"yearsal" 或者select name, sal*12 yearsal from emp; #将sal*12字段重新加别名为"yearsal",AS关键字可以省略,直接用空格分开 select name, sal*12 AS 年薪 from emp; #将sal*12字段重新加别名为“年薪“(语法错误,中文汉字未加单引号或双引号) select name, sal*12 AS '年薪' from emp; #将sal*12字段重新加别名为“年薪“(语法正确,即当别名为中文时,汉字须加单引号或者双引号) 注意:(1)在mysql数据库中对字符串使用单引号或者双引号都可以,规范要求使用单引号。因为双引号在Oracle、SQL server等数据库中一般都不能正常执行。 (2)AS关键字可以省略。 2. select * from 表名; #查询表中全部信息(*代表全部信息)。 注意:实际开发中不建议使用*,因为运行中*要先转换为字段,效率相对较低。
四:WHERE条件查询
语法格式:select 字段1,字段2,.... from 表名 where 条件; 举例: select name, sal from emp where sal >= 3000; #查询工资大于等于3000元人员 select name, sal from emp where sal <= 3000; #查询工资小于等于3000元人员 select name, sal from emp where sal <> 3000;或者 select name, sal from emp where sal != 3000; #查询工资不等于3000元人员
使用比较运算符的条件查询(>、>=、<、<=、!=、<>) 举例:select * from 选课 where 成绩<60; #查询选课表中成绩小于60分的学生信息。 select 班级名称,所属学院 from 班级 where 所属学院!=‘外国语学院’; #查询班级表中非外国语学院的班级名称和所属学院。
使用IN操作符的条件查询(in、not in) 举例:select 学号,籍贯 from 学生 where 籍贯 in('湖北武汉','河南郑州'); #查询学生表中籍贯是湖北武汉或者河南郑州的学生学号和籍贯。
between........and.........操作符条件查询 举例:select name, sal from emp where sal between 1000 and 3000; #查询工资在1000到3000元之间人员(含1000和3000元人员) 注意:between........and......... 当取值是数字时,为闭区间取值,且左小右大。当取值是字符串时,为左闭右开区间取值。 like操作符条件查询(属于模糊查询)。 比较字段类型必须是字符串,通配符(“%”或者“_”),“%”可以匹配任意数目的字符,"_”只能匹配单位字符。 举例:select 学号,姓名 from 学生 where 姓名 like '吴%'; #查询学生表中姓吴的学生的学号和姓名。 select 学号,姓名 from 学生 where 姓名 like '_吴%'; #查询学生表中第二个字带"吴"的学生的学号和姓名。 select 学号,姓名 from 学生 where 姓名 like '%\_%'; #查询学生表中姓名带"_"的学生的学号和姓名。 注意:\代表把下划线转化为字符。
用and或or连接多个表达式 举例:select 学号 from 选课 where 课程='001’and 成绩>90; #查询选修了001课程且成绩在90分以上的学生学号。 select 学号,课程号 from 选课 where 课程='001’or 课程='002’; #查询选修了001课程或者002课程的学生的学号和课程号。
查询结果排序(order by 字段 <asc/desc>)。asc代表升序,desc代表降序。
举例:select 学号,成绩 from 选课 where 课程='001’or 课程='002’order by 成绩 desc; #将查询结果降序排列。 select 学号,成绩 from 选课 where 课程='001’or 课程='002’order by 成绩 asc; #将查询结果升序排列。
*****ANY&ALL操作符查询 *****
嵌套查询中,ANY或ALL操作符必须与比较运算符配合使用。
>ANY或者>=ANY:大于或大于等于子查询结果集中的某个值,即大于或大于等于子查询结果集中的最小值。
<ANY或者<=ANY:小于或小于等于子查询结果集中的某个值,即小于或小于等于子查询结果集中的最大值。 注意:用Any取值的时,大于等于取最小值,小于等于取最大值。 >ALL或者>=ALL:大于或大于等于子查询结果集中的所有值,即大于或大于等于子查询结果集中的最大值。 举例:select 学号,年龄 from 学生 where 年龄>=all(select 年龄 from 学生 where 班级='机电2班')
<ALL或者<=ALL:小于或小于等于子查询结果集中的所有值,即小于或小于等于子查询结果集中的最小值。 注意:用ALL取值的时,大于等于取最大值,小于等于取最小值。 分组函数(也称聚合函数、统计函数),是多行处理函数。
.所有分组函数都是对“某一组”数据进行操作,都是忽略null。
.分组函数包含5类:count() 计数;max() 最大值;min() 最小值;avg() 平均值;sum ()总和。 举例: select count(薪资) from emp; #查询薪资总人数 或者 select count(*) from emp; #查询薪资总人数 select max(薪资) from emp; #查询最高薪资 select avg(薪资) from emp; #查询最低薪资 select sum(薪资) from emp; #查询薪资总和 重点注意:只要有null参与的运算,结果一定是null,所有的数据管理系统都是这样规定的。 —— ifnull()函数,可以对null进行预处理,单行处理函数。 格式:ifnull(可能为null的数据,被当做什么处理)。例如:ifnull(comm ,0); select ename,ifnull(comm,0) as comm from emp; #将comm中null全部转换为0。 select ename,(sal+ifnull(comm,0))*12 as yearsal from emp; #查询员工姓名和年薪,comm中null全部转换为0,再与月薪计算。 ——分组函数不能直接使用在where子句中。 select ename,sal from emp where sal >avg(sal); #语法有误,是无效的使用分组函数。
.count(*)和 count(字段名)的区别 count(*),统计总记录条数,与某个字段无关。 count(字段名),统计字段中不为null的数据总数。
.分组函数可以组合使用 举例:select count(*),max(字段名1),min(字段名1),avg(字段名1),sun(字段名1) from emp;
.分组函数一般都会与group by 联合使用,先运行group by进行分组,再进行函数运算。 举例:select job,max(sal) from emp group by job; 完整的DQL查询语句执行顺序 select 5 字段名1,字段名2 from 1 表名 where 2 执行第一层过滤
***** group by 3 字段名 having 4 分组后执行第二层过滤(不可以单独使用,一定要与group by 联合使用。)
***** order by 6 asc/desc 注意:能在where中过滤的数据,尽量在where中过滤,执行效率较高。 having过滤是专门对分组后的数据进行再过滤。 重点规则1:当一条select查询语句中有 group by的话,select后面只能跟分组函数和参与分组的字段。
举例:select 字段1,字段2,分组函数 from 表名 group by 字段2; #在MySQL中执行没有问题,但是没有意义,在Oracle中一定会出现语法错误。 单个字段分组: select 字段1,分组函数 from 表名 group by 字段1;
#正确语法,即分组后面有什么字段,select后面跟什么字段。 多个字段联合分组:select 字段1,字段2,分组函数 from 表名 group by 字段1,字段2 重点规则2:当一条select查询语句中有 group by***having的话。having是对分组之后的数据再次过滤。having使用必须有group by,二者是搭档。 (group by可以单独使用,having不可单独使用。) 举例:select deptno,avg(sal) from emp group by deptno having max(sal) > 2000;
*****去重查询 distinct *****
distinct 只能出现在查询的所有字段的最前端;其后的所有字段都是联合去重。 举例:select distinct ename,job from emp;
*****连接查询 *****
.内连接(等值连接、不等值连接) ——等值连接。语法:select * from 表1 join 表2 on 表1.字段=表2.字段 #on后面是两个表的连接条件。 注意:此种连接查询,查询结果中存在重复字段。 举例:select * from 学生 join 课程 on 学生.学号=课程.学号; ——自然连接(是一种特殊的等值连接,要求两个表的关联字段必须相同) 注意:此种连接查询,查询结果中去掉重复字段。 语法:select * from 表1 natural join 表2; 举例:select * from 学生 natural join 课程; ——不等值连接。实际操作中很少用到,不做详细讲解。 #(即交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积现象,即行数的乘积。) 语法:select * from 表1 cross join 表2; #cross可以省略。 2.外连接(左连接、右连接 、全连接)left join\right join\all join (left outer join\right outer join中的outer可以省略) (1)左连接,查询结果中保留左表中的未匹配字段。 语法:select * from 表1 left join 表2 on 表1.字段=表2.字段。 (2)右连接,查询结果中保留右表中的未匹配字段。 语法:select * from 表1 right join 表2 on 表1.字段=表2.字段。 (3)全连接,查询结果中保留两个表中的未匹配字段。 mysql中暂时不支持all join。
*****高级子查询 *****
.带子查询的数据插入(即向表中插入的数据可以来自另一个表) 语法:insert into 表名 <子查询>; #表名后面的字段若省略,则子查询的目标列与表中的字段的数目、顺序和数据类型要一致。 举例:insert into 学生 select * from 学生 where 性别='男'; ——不等值连接。实际操作中很少用到,不做详细讲解。 2.带子查询的数据修改 语法:update 表名 set 字段判定条件 where子句 ; 举例:update 课程 set 成绩=成绩*1.1 where 课程号 in(select 课程号 from 课程 where 课程名='大学英语'); #将课程表中“大学英语”课程的成绩提高10%。 3.带子查询的数据删除 语法:delete from 表名 where子句 ; 举例:delete from 课程 where 课程号 in(select 课程号 from 课程 where 课程名='高等数学'); #将课程表中“高等数学”课程的课程记录删除。
五:存储引擎
.存储引擎只有在MYSQL中存在,(Oracle中有对应的机制,但不叫存储引擎,叫存储方式。)
.MYSQL支持多种存储引擎,每一个存储引擎都对应一种存储方式。每一个存储引擎都有自己的优缺点。
.查看存储引擎: show engines \g
.存储引擎有9中,常见的有INnoDB 、MYISAM、MRG_MYISAM、BLACKHOLE 、MEMORY、CSV 、ARCHIVE 、PERFORMANCE_SCHEMA、 FEDERATED。 (1)MYISAM:不默认的存储引擎,有3个文件:xxx.FRM、xxx.MYD、xxx.MYI;存储表结构的文件、存储数据的文件、存储索引的文件。 优点:可压缩、节省存储空间; 缺点:不支持事务。 (2)INnoDB:默认的存储引擎,表结构存储在xxx.FRM文件中;用commit(提交)、rollback(回滚)支持事务处理。 优点:INnoDB存储引擎在mysql数据库崩溃之后,提供自动恢复机制;支持级联更新和级联删除。 ...........
.MYSQL中默认使用的存储引擎是InnoDB;默认使用的字符集是Utf8。
*****视图*****
.视图是数据库中根据子模式设计的虚拟表, 数据库中只存放视图定义的语句,其数据存储在对应的表中。
.用户可以根据个性化的需要,从一个或者多个表中抽取部分字段定义成新的虚拟表(即视图)。
.视图中的数据依赖于其对应表中的数据,一旦表中的数据发生变化,视图中的数据也会发生变化。
.视图的作用:简化用户的操作,实现数据库系统的安全性,提高数据的逻辑独立性。 5.视图的创建、删除、更新和查看
(1)创建视图:create view 视图名称【字段名列表】 AS 子查询 【with check option】 注意:AS不能删除和省略;【】中的内容可以省略。 举例:create view jdxy_vi as select * from stu00 where depno='02' or depno='03';
(2)更新视图:update 视图名称 set 字段条件 where 查询条件; 举例:update jdxy_vi set stuname='古天' where stuno='2022003';
(3)删除视图:drop view 视图名称; drop view 视图1名称,视图2名称,.... 举例:drop view jdxy_view; drop view jdxy_view,xy_view; (4)查看视图结构:desc 视图名称; 举例:desc jdxy_vi;
(5)查看视图:show tables; #视图是一个虚拟的表,即查看数据库中表即可。
六:触发器
.触发器是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程。
.触发器的执行不是有程序员调用,而是由事件来触发的。
.触发器经常用于加强数据的完整性约束和业务规则等。
.触发器创建语法四要素:
(1)触发地点(table):触发器对哪个表起作用。
(2)触发事件(insert、delete、update):对表执行什么操作时触发。
(3)触发时间(before、after):在表执行操作前还是操作后触发。
(4)触发器程序体(begin...end):触发后执行的动作。
.每个表的每个事件每次只允许一个触发器;每个表最多支持6个触发器(before insert、before delete、before update;after insert、after delete、after update) ——创建触发器:create trigger <触发器名> <after/before > <insert/delete/update> on <表名> for each row <begin SQL语句 end > 举例:create trigger 选课_cfq after insert on 选课 for each row begin update 学生成绩统计 set 课程数=课程数+1 where 学号=new.学号 end; 说明:for each row 一般是指行级触发,对于受触发事件影响的每一行都要激活触发器的动作。 ——查看触发器:show triggers; ——删除触发器:drop trigger 触发器名;
七:数据库设计三范式
范式概念:规范化的关系模式(Normal Form),是衡量关系模式好坏的一组规则的集合。 范式类型:1NF、2NF、3NF(Third Normal Form,3NF),级别越高,其包含的限制约束条件越严格。 范式作用:减少数据冗余和操作异常情况发生。 规范化过程:一个关系模式规范化的过程,就是将低级别范式的关系模式经过模式分解转换成若干高级别范式的关系模式的集合。
.第一范式(1NF):任何一张表都应该有主键,并且每个字段原子性不可再分。
.第二范式(2NF):基于第一范式,所有非主键字段完全依赖于主键,不能产生部分依赖关系。 多对多关系:3张表,关系表中有2个外键。 复合主键:即表中有2个以上的主键(不推荐使用,不符合第二范式标准)。
.第三范式(3NF):基于第二范式,所有非主键字段直接依赖于主键,不能产生传递依赖关系。 一对多关系:2张表,多的表加外键。 一对一关系:主键共享,外键唯一。 特别提醒:实际数据库开发中,以满足客户的需求为主,有时会以数据冗余换执行速度。
*****事务*****
(transaction)事务存在意义:保障数据的完整性和安全性。
.一个事务是一个完成的逻辑单元,不可以再分。一个事务是由DML语言的多条指令来联合完成。 .事务必须保障数据的一致性,即事件发生同时成功,或者同时失败,不允许出现一条成功,一条失败。
.事务只存在于DML语句中(insert、delete、update语句),其它的指令语句与事务无关。 .事务处理流程: 事务开启(开始)—> insert\delete\update操作(不会真正修改硬盘上的数据,只会记录操作历史<即事务性活动的日志文件中>)—>提交或者回滚事务(commit\rollback)。
(1)事务开启命令: start transaction;
(2) commit的作用:提交事务,将事务中所有对数据的更新写回到磁盘上的物理数据库中,事务正常结束;
(3)rollback的作用:回滚事务,即事务运行发生故障,不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤回,回滚到事务初始状态。
.事务的特性:ACID。A.原子性、C.一致性、I.隔离性、D.持久性。 A.原子性:事务里面的操作要么都执行,要么都不执行。 C.一致性:事务执行之前和执行之后数据库状态保持一致。 I.隔离性:一个事务的执行不被其他事务干扰。隔离级别有4级,其中mysql数据库中默认的隔离级别是“可重复读”;oracle数据库中默认的隔离级别是“读已提交”。 D.持久性:事务对数据库的该表是永久的。
.MYSQL中默认操作模式是Autocommit模式,可以通过设置Autocommit的值来开启和禁用模式。