一、数据库函数
1.合计/统计函数(count)
count()函数,返回行的总数
#统计函数
#统计表中一共有多少条数据
select count(*) from student
#统计表中数学大于80分的总人数
select count(*) AS '优秀人数' from student where math > 80
#统计总分大于250分的总人数
select count(*) as '优秀人数' from student where (math + chinese + english) > 200
#count(*) 和 count(列) 的区别
#count(*)会统计总人数,count(列)与count(*)相仿,但是不会统计null
insert into student values (null,90,90,90)
select count(*) from student
select count(sname) from student
2.sum函数(总值函数)
#获得一个班级math的总值
select sum(math) from student
#统计一个班级各科的总成绩和所有成绩总和
select sum(math) as '数学',sum(chinese) as '语文',sum(english) as '英语',sum(math+chinese+english) as '总和' from student
#不使用avg获得班级语文平均分
select sum(chinese) / count(chinese) as '语文平均分' from student
3.avg函数(平均值函数)
#求一个班的数学平均分
select avg(math) from student
#求一个班的总分平均分
select avg(math + chinese + english) from student
4.max和min函数(最大最小值函数)
#求班级最高分和最低分
select max(math + chinese + english) as '最高分',min(math + chinese + english) as '最低分' from student
5.分组group by与筛选 having
(1)编撰测试表
#创建用于测试的表
CREATE TABLE dept( /*部门表*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, dname VARCHAR(20) NOT NULL DEFAULT "", loc VARCHAR(13) NOT NULL DEFAULT ""
)
select * from dept
INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK'), (20, 'RESEARCH', 'DALLAS'), (30, 'SALES', 'CHICAGO'), (40, 'OPERATIONS', 'BOSTON');
-- 员工表
CREATE TABLE emp
(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
mgr MEDIUMINT UNSIGNED ,/*上级编号*/
hiredate DATE NOT NULL,/*入职时间*/
sal DECIMAL(7,2) NOT NULL,/*薪水*/
comm DECIMAL(7,2) ,/*红利 奖金*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
);
INSERT INTO emp VALUES(7369, 'SMITH', 'CLERK', 7902, '1990-12-17', 800.00,NULL , 20), (7499, 'ALLEN', 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30), (7521, 'WARD', 'SALESMAN', 7698, '1991-2-22', 1250.00, 500.00, 30), (7566, 'JONES', 'MANAGER', 7839, '1991-4-2', 2975.00,NULL,20), (7654, 'MARTIN', 'SALESMAN', 7698, '1991-9-28',1250.00,1400.00,30),(7698, 'BLAKE','MANAGER', 7839,'1991-5-1', 2850.00,NULL,30), (7782, 'CLARK','MANAGER', 7839, '1991-6-9',2450.00,NULL,10), (7788, 'SCOTT','ANALYST',7566, '1997-4-19',3000.00,NULL,20), (7839, 'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10), (7844, 'TURNER', 'SALESMAN',7698, '1991-9-8', 1500.00, NULL,30), (7900, 'JAMES','CLERK',7698, '1991-12-3',950.00,NULL,30), (7902, 'FORD', 'ANALYST',7566,'1991-12-3',3000.00, NULL,20), (7934,'MILLER','CLERK',7782,'1992-1-23', 1300.00, NULL,10)
select * from emp
-- 工资级别
#工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*工资级别*/
losal DECIMAL(17,2) NOT NULL, /* 该级别的最低工资 */
hisal DECIMAL(17,2) NOT NULL /* 该级别的最高工资*/
);
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);
select * from salgrade
select * from emp
select * from dept
(2)group by的使用
#测试表已经实现,使用group by进行分组,having进行筛选
#显示每个部门的平均、最低和最高工资
#使用科学记数法保留小数数据,使用FORMAT关键字,format(x,d)x为该小数,d为要保留的位数
select deptno,format(avg(sal),2) as '平均工资' ,format(min(sal),2) as '最低工资',max(sal) as '最高工资'
from emp group by deptno
#显示平均工资低于2000的部门号和平均工资
SELECT format(avg(sal),2) AS '平均工资',deptno AS '部门'
FROM emp GROUP BY deptno
HAVING AVG(sal) < 2000
6.字符串相关函数
7.数字相关函数
8.时间与日期相关函数
9.加密与系统函数
#加密函数
#查看用户,DUAL属于模拟表,在不需要from后条件时,又要保证语句的正确性,加上DUAL
select user() from DUAL
#查看数据库信息,会得到数据库名称
select database()
#MD5(STR)加密,给字符串一个MD5的密码值
SELECT MD5('我的马') FROM DUAL
#PASSWORD(STR) 从原文密码中计算一个密码字符串
DROP TABLE `lock`
CREATE TABLE `lock` (
uesrname VARCHAR(10),
pwd CHAR(32)
)
insert into `lock` values('aaa',md5('tan'))
select * from `lock`
10.流程控制函数
#使用流程控制函数,类似于java中的逻辑运算符
#IF与IFNULL的使用
SELECT ename,IF(comm IS NULL,0.0,comm) FROM emp
SELECT ename,IFNULL(0.0,comm) from emp
SELECT * FROM emp
#SELECT CASE WHEN THEN的使用
SELECT ename,(SELECT CASE
WHEN job = 'CLERK' THEN '职员'
WHEN job = 'SALESMAN' THEN '售货员'
WHEN job = 'MANAGER' THEN '经理'
WHEN job = 'PRESIDENT' THEN '老板'
ELSE job END)
FROM emp
二、MYSQL表查询
1.表查询-加强
(1)回顾like和order by
#查找1992年1月1日后入职的员工
select * from emp where hiredate > '1992-1-1'
#like关键字的使用
#%表示0到多个字符 _表示一个字符
#显示首字符为S的员工姓名与工资
select ename,sal from emp where ename like 'S%'
#显示第三个字符为O的员工姓名和工资
select ename,sal from emp where ename like '__O%'
#显示没有上级的雇员情况
select * from emp where mgr is null
#使用order by子句
#按照工资的从高到低的顺序显示员工信息
select * from emp order by sal desc
#按照部门升序和员工工资降序排序
select * from emp order by deptno,sal desc
(2)分页查询
#分页查询
#使用select...limit start,end 从第start+1行开始取,取end行
#按照一页三条数据,写出前三页
select * from emp order by empno limit 0,3
select * from emp order by empno limit 3,3
select * from emp order by empno limit 6,3
(3)使用分组函数和分组子句
select count(job),job,format(avg(sal),2) from emp group by job
select count(*) as '总员工数',count(comm) as '补贴人数' from emp
#distinct去重复值
select count(distinct mgr) as '管理者总数' from emp
select max(sal) - min(sal) as '最大差额' from emp
-- 应用案例:请统计各个部门 group by 的平均工资 avg,
-- 并且是大于 1000 的 having,并且按照平均工资从高到低排序, order by
-- 取出前两行记录 limit 0, 2
select deptno,avg(sal) as 'avg_sal' from emp
group by deptno
having (avg_sal > 1000)
order by avg_sal DESC
limit 0,2
2.多表查询
注意:多表查询的条件不能少于表的个数-1,否则会出现笛卡尔集
(1)多表查询练习
#多表查询
#查询雇员名,雇员工资以及所对应的部门名称
select ename,sal,dname from emp,dept where emp.deptno = dept.deptno
#显示部门号为10的部门名,员工名和工资
select dname,ename,sal from emp,dept where emp.deptno = dept.deptno and emp.deptno = 10
#显示各个员工的姓名,工资和工资级别
select ename,sal,grade from emp,salgrade where sal > losal and sal < hisal
(2)自连接
#自连接
#显示员工名字和上级名字
#自连接意味着把一张表当两张表使用,在from后将这张表赋予两个变量名,一个为worker,一个为boss
select worker.ename as '员工名称', boss.ename as '上司名称' from emp worker,emp boss where worker.mgr = boss.empno
3.子查询
(1)单行子查询
#返回与SMITH同一个部门的所有员工
/*
1. 先查询到 SMITH 的部门号得到
2. 把上面的 select 语句当做一个子查询来使用
*/
select * from emp where deptno =
(select deptno from emp where ename = 'SMITH')
(2)多行子查询
#查询和部门10的工作相同的员工的名字、岗位、工资、部门号,但是不包括部门10
#<>这是不等号,类似于!=
select ename,job,sal,deptno from emp where job in
(select distinct job from emp where deptno = 10) and deptno <> 10
(3)all与any的使用
#all与any的使用
#显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
select ename,sal,deptno from emp where sal > all(select sal from emp where deptno = 30)
#显示工资比部门 30 的其中一个员工的工资高的员工的姓名、工资和部门号
select ename,sal,deptno from emp where sal > any(select sal from emp where deptno = 30)
(4)多列子查询
#查询与 allen 的部门和岗位完全相同的所有雇员(并且不含 allen 本人
select * from emp where deptno =
(select deptno from emp where ename = 'ALLEN')
and job = (select job from emp where ename = 'ALLEN')
and ename <> 'ALLEN'
#简化版
select * from emp where (deptno,job) =
(select deptno,job from emp where ename = 'ALLEN')
and ename <> 'ALLEN'
(5)在from子句中使用子查询
#查询每个部门工资高于该部门平均工资的员工信息
#可以把查询到的含有多个数据的结果当做一张表
select ename,sal,temp.avg_sal,emp.deptno
from emp,(select deptno,avg(sal) as avg_sal
from emp
group by deptno
)temp
where emp.deptno = temp.deptno and emp.sal > temp.avg_sal
三、表复制
1.自我表复制(蠕虫复制)
#表复制
#为了对某个 sql 语句进行效率测试,我们需要海量数据时,可以使用此法为表创建海量数据
CREATE TABLE my_tab01
( id INT, `name` VARCHAR(32), sal DOUBLE, job VARCHAR(32), deptno INT);
DESC my_tab01
SELECT * FROM my_tab01;
#使用插入其他表中对应数据的方法进行复制
insert into my_tab01 (id,`name`,sal,job,deptno) select empno,ename,sal,job,deptno from emp
#表的自我复制,把表中的数据重新插入表中
insert into my_tab01 select * from my_tab01
select * from emp
2.删除表中重复项
#删除表中的重复项
#使用like可以复制表结构
create table tab02 like emp
insert into tab02
select * from emp
select * from tab02
select count(*) from tab02
#考虑去重 my_tab02 的记录
/*
思路
(1) 先创建一张临时表 my_tmp , 该表的结构和 my_tab02 一样
(2) 把 my_tmp 的记录 通过 distinct 关键字 处理后 把记录复制到 my_tmp
(3) 清除掉 my_tab02 记录
(4) 把 my_tmp 表的记录复制到 my_tab02
(5) drop 掉 临时表 my_tmp
*/
create table temp_01 like tab02
insert into temp_01 select distinct * from tab02
#使用delete清除表中数据,drop是删除表
delete from tab02
insert into tab02 select * from temp_01
#删除临时表
drop table temp_01
select * from temp_01
四、合并查询
#合并查询
#使用union,union all在两个select语句之间,可以将两个查询结果放在同一个结果中显示
#区别:union可以去重,union all不会去重
select * from emp where sal > 2500
union select * from emp where job = 'MANAGER'
select * from emp where sal > 2500
union all select * from emp where job = 'MANAGER'
五、外连接
#外连接
#列出部门名称和这些部门的员工名称和工作,同时显示出那些没有员工的部门
select * from emp
select * from dept
select dept.dname,emp.ename,emp.job from emp,dept where emp.deptno = dept.deptno order by dname
#左外连接,在from后使用 表一 left join 表二 on 条件,表一就是左表
#使用on后就可以不用使用where
select dept.dname,emp.ename,emp.job from dept left join emp on emp.deptno = dept.deptno order by dname
#右外连接,在from后使用 表一 right join 表二 on 条件,表二就是右表
select dept.dname,emp.ename,emp.job from emp right join dept on emp.deptno = dept.deptno order by dname
#创建stu表与exam表并存入信息
CREATE TABLE stu (
id INT, `name` VARCHAR(32));
INSERT INTO stu VALUES(1, 'jack'),(2,'tom'),(3, 'kity'),(4, 'nono');
SELECT * FROM stu;
CREATE TABLE exam(
id INT, grade INT);
INSERT INTO exam VALUES(1, 56),(2,76),(11, 8);
SELECT * FROM exam;
#左外连接
#显示所有人的成绩,如果没有成绩,也要显示该人的姓名和 id 号,成绩显示为空
select grade,`name`,stu.id from stu left join exam on stu.id = exam.id
#右外连接
#显示所有成绩,如果没有名字匹配,显示空
select grade,`name`,stu.id from stu right join exam on stu.id = exam.id
六、约束
1.primary key主键的使用
#约束
#主键的使用
#创建主键表
create table key_01(
id INT primary key,
kname VARCHAR(32)
)
SELECT * FROM key_01
#主键特点
#主键的值不能重复且非空
insert into key_01 values(0,'kai');
insert into key_01 values(null,'kai');-- 运行失败
insert into key_01 values(0,'bob');-- 运行失败
#主键只能有一个,但是可以是复合主键
create table key_02(
id INT primary key,
`name` VARCHAR(32) primary key
) -- 运行失败
#复合主键,以如下方式即可运行成功,且是复合主键
create table key_02(
id INT,
`name` VARCHAR(32),
PRIMARY KEY(id,`name`)
)
#主键的注入方式如上两种,一种是写在列名之后,一种是在()的最后写上primary key(),括号中标注要设置为主键的列名
2.非空not null
同样是在创建表的列名的后面标注该规则
#非空
create table key_03(
id int not null,
`name` varchar(32)
)
insert into key_03 values (NULL,'sss') -- 运行失败
3.unique唯一
定义了unique之后,该列的字段是不能重复的,如果该列没有定义not null,那么是可以存在多个null值的,且一个表中可以存在多个unique值
#unique唯一
create table key_04(
id int unique,
`name` varchar(32)
)
insert into key_04 values(0,'ss') -- 运行成功
insert into key_04 values(0,'ss') -- 运行失败
insert into key_04 values(null,'ss')-- 运行成功
insert into key_04 values(null,'ss')-- 运行成功
4.foreign key(外键)
#外键
#创建表一
create table tab_1(
id int primary key,
`name` varchar(32)
)
#创建外键表二
#要作为外键连接的字段连接到的字段必须是主键或者unique
create table tab_2(
id int primary key,
`name` varchar(32),
id_2 int,
foreign key (id_2) references tab_1(id)
)
desc tab_2
#为外键的表插入值时,外键所对应的字段的值必须存在主表对应的值,否则插入失败
insert into tab_1 values(1,'luolin'),(2,'sky'),(3,'hukong');
insert into tab_2 values(1,'luoxiangtian',1),(2,'linhaoran',2),(3,'huyue',3)
insert into tab_2 values(4,'jiase',4) -- 运行失败
#存在外键,不能随意删除数据
delete from tab_1 where id = 1
#没有设置not null,则可以插入null值
insert into tab_2 values(4,'jiase',null)
5.check
check仅在oracle和sql server中生效,仅作为了解
#一旦被设置check校准,那插入数据时,必须满足check条件,否则就会插入失败
CREATE TABLE t23 (
id INT PRIMARY KEY, `name` VARCHAR(32) , sex VARCHAR(6) CHECK (sex IN('man','woman')), sal DOUBLE CHECK ( sal > 1000 AND sal < 2000)
);
6.练习
create table goods(
goods_id int primary key,
goods_name varchar(32),
unitprice float check(unitprice > 1.0 and unitprice < 9999.99),
category varchar(32),
provider varchar(32)
)
create table customer(
customer_id int primary key,
`name` varchar(32) not null,
address varchar(64),
email varchar(32) unique,
sex char(2) check (sec in('男','女')),
card_Id char(18)
)
create table purchase (
order_id int primary key,
customer_id int,
goods_id int,
num int,
foreign key (customer_id) REFERENCES customer(customer_id),
foreign key (goods_id) REFERENCES goods(goods_id)
)
七、自增长
#自增长
#使用auto_increment 实现自增长,默认值为1
#一般与主键一块使用,且默认是int类型,如果不使用主键,也可以使用unique
create table temp00(
id int primary key auto_increment,
`name` varchar(32)
)
#使用了自增长就可以传入null值,他会自动赋予新值,如果传入固定值,那么会代替自增长值,且下次自增长会从传入的值这开始
insert into temp00 values (null,'sa')
insert into temp00 values (9,'sa')
#修改自增长值的方法
#直接在创建表的时候使用auto_increment = num ,num为要修改的自增长值
#或者使用alter
ALTER TABLE temp00 auto_increment = 2
八、索引
1.索引介绍
索引是用来提高数据库性能最物美价廉的东西,不用加内存,不用改程序,不用调sql,极大地提高了查询速度
2.创建海量表的方式
-- 创建测试数据库 tmp
CREATE DATABASE tmp;
CREATE TABLE dept( /*部门表*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, dname VARCHAR(20) NOT NULL DEFAULT "", loc VARCHAR(13) NOT NULL DEFAULT ""
) ;
#创建表 EMP 雇员
CREATE TABLE emp
(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上级编号*/
hiredate DATE NOT NULL,/*入职时间*/
sal DECIMAL(7,2) NOT NULL,/*薪水*/
comm DECIMAL(7,2) NOT NULL,/*红利*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
) ;
#工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, losal DECIMAL(17,2) NOT NULL, hisal DECIMAL(17,2) NOT NULL
);
#测试数据
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);
DELIMITER $$
#创建一个函数,名字 rand_string,可以随机返回我指定的个数字符串
CREATE FUNCTION rand_string(n INT)
RETURNS VARCHAR(255) #该函数会返回一个字符串
BEGIN
#定义了一个变量 chars_str, 类型 varchar(100)
#默认给 chars_str 初始值 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ' DECLARE chars_str VARCHAR(100) DEFAULT
'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
DECLARE return_str VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
# concat 函数 : 连接函数 mysql 函数
SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
SET i = i + 1;
END WHILE;
RETURN return_str;
END $$
#这里我们又自定了一个函数,返回一个随机的部门号
CREATE FUNCTION rand_num( )
RETURNS INT(5)
BEGIN
DECLARE i INT DEFAULT 0;
SET i = FLOOR(10+RAND()*500);
RETURN i;
END $$
#创建一个存储过程, 可以添加雇员
CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
#set autocommit =0 把 autocommit 设置成 0
#autocommit = 0 含义: 不要自动提交
SET autocommit = 0; #默认不提交 sql 语句
REPEAT
SET i = i + 1;
#通过前面写的函数随机产生字符串和部门编号,然后加入到 emp 表
INSERT INTO emp VALUES ((START+i) ,rand_string(6),'SALESMAN',0001,CURDATE(),2000,400,rand_num());
UNTIL i = max_num
END REPEAT;
#commit 整体提交所有 sql 语句,提高效率
COMMIT;
END $$
#添加 8000000 数据
CALL insert_emp(100001,8000000)$$
#命令结束符,再重新设置为;
DELIMITER ;
SELECT COUNT(*) FROM emp;
-- 在没有创建索引时,我们的查询一条记录
SELECT *
FROM emp
WHERE empno = 1234567;
-- 使用索引来优化一下, 体验索引的牛
-- 在没有创建索引前 , emp.ibd 文件大小 是 524m
-- 创建索引后 emp.ibd 文件大小 是 655m [索引本身也会占用空间.]
-- 创建 ename 列索引,emp.ibd 文件大小 是 827m
-- empno_index 索引名称
-- ON emp (empno) : 表示在 emp 表的 empno 列创建索引
CREATE INDEX empno_index ON emp (empno);
-- 创建索引后, 查询的速度如何
SELECT *
FROM emp
WHERE empno = 1234578; -- 0.003s 原来是 4.5s
-- 创建索引后,只对创建了索引的列有效
SELECT *
FROM emp
WHERE ename = 'PjDlwy'; -- 没有在 ename 创建索引时,时间 4.7s
CREATE INDEX ename_index ON emp (ename); -- 在 ename 上创建索
3.创建索引与分类
CREATE INDEX ename_index ON emp (ename) -- 在 ename 上创建索
#主键索引与unique索引
#主键与unique本身就是索引的一种,因为他们不重复,都可以加快查找速度
#一般这两种索引在创建表的时候创建,也可以使用alter进行创建
#添加索引
create table index01(
id int primary key,
`name` varchar(32)
)
#查看表中索引
show index from index01
#创建唯一索引
create unique index index_id on index01(id)
#创建普通索引
#方式一
create index index_id on index01(id)
#方式二
alter table index01 add index index_id(id)
#删除索引
drop index index_id on index01
#删除主键索引
alter table index_id drop primary key -- 因为主键只有一个,所以直接删除
#查询索引的三种方式
#方式一
show index from index01
#方式二
show indexes from index01
#方式三
show keys from index01
4.创建索引的练习
#方式一
create table order1(
id int primary key,
goods_name varchar(32),
order_people varchar(32),
num int
)
#方式二
create table order2(
id int,
goods_name varchar(32),
order_people varchar(32),
num int
)
alter table order2 add primary key(id)
show keys from order2
#方式一
create table menu1(
id int unique,
cook_name varchar(32),
cooker varchar(32),
id_card char(18),
price float
)
#方式二
create table menu2(
id int,
cook_name varchar(32),
cooker varchar(32),
id_card char(18),
price float
);
create unique index index_id on menu2(id);
show keys from menu2
#方式一
create table sportman1(
id int,
`name` varchar(32),
long_part varchar(32)
);
create index index_id on sportman1(id);
#方式二
create table sportman2(
id int,
`name` varchar(32),
long_part varchar(32)
);
alter table sportman2 add index index_id(id);
九、事务
1.事务的特性
-
- 原子性:一个事务的操作要么全部成功,要么全部失败
- 一致性:事务的操作要实现减少多少就要增加多少,举例:如银行转账,A转给B,A转出多少钱,B就一定要收到多少钱
- 隔离性:事务与事务之间要互不影响
- 持久性:事务操作提交后的结果要保证永久有效
2.事务的操作
#事务
create table commit_01(
id int,
`name` varchar(32)
)
#开启事务,在开启事务之后的操作,都是可以回滚回当前状态
start TRANSACTION
insert into commit_01 values(1,'sda');
insert into commit_01 values(2,'daw');
#事务回滚,回到最近存档点
ROLLBACK
#提交事务
commit;
十、事务的隔离级别
十一、类型和存储引擎
1.基本介绍
2.主要存储引擎或表的类型特点
3.各引擎特点说明
4.如何选择引擎
5.修改引擎
alter table '表名' engine = 引擎名
十二、视图
1.视图使用
视图目的是只显示可以让他人访问的数据,其他数据无法被访问到
#视图
#创建视图
create view my_view as select losal,hisal from salgrade
#查看视图
desc salgrade
select * from my_view
select * from salgrade
#也能对视图进行操作,操作会影响到基表,基表中没有显示的数据会插入默认值
insert into my_view values(702,432)
#查看创建视图
show create view my_view
2.视图细节
3.视图练习
create view my_view as
select emp.empno,emp.ename,dept.dname,salgrade.grade
from emp,dept,salgrade
where emp.deptno = dept.deptno and emp.sal > salgrade.losal and emp.sal < salgrade.hisal