MySQL数据库查询与优化数据表

本文详细介绍了SQL查询的基本语法,包括单表查询、聚合函数、条件查询(WHERE、GROUP BY、ORDER BY子句)以及多表连接查询。此外,还探讨了嵌套查询、集合查询和数据表的优化,如索引设计和视图的创建与使用。内容覆盖了从基础的查询操作到复杂的查询技巧,旨在帮助读者深入理解SQL在数据库管理中的应用。
摘要由CSDN通过智能技术生成

目录

查询数据表

单表查询

聚合函数

条件(WHERE子句)

条件(GROUP BY子句)

条件(ORDER BY子句)

多表连接查询

嵌套查询

集合查询

优化数据表

索引

索引类型

设计原则

视图


查询数据表

单表查询

语句格式:

SELECT [ ALL | DISTINCT ] <选项> [ AS <显示列名> ] [ ,<选项2> [ AS <显示列名2> ] [,...] ]

FROM <表名 | 视图名>

[ WHERE 条件表达式1 ]

[ GROUP BY <列名清单> [ HAVING 条件表达式2 ] ]

[ ORDER BY <列名1> [ ,<列名2> ] [,...] ]

[ LIMIT [ M, ] N ] 

;

参数说明

  • ALL,输出所有记录,默认值为ALL
  • DISTINCT,对查询结果去掉重复值
  • LIMIT [ M, ] N,返回查询结果的前N行,加 [ M, ],表示从表的第M行开始,返回N行结果;加M的情况下,如果N=1,则表示返回第M行的记录
  • 选项,查询结果集中的输出列,选项可为字段名表达式函数,星号 “ * ” 意为表中所有字段
  • 显示列名,“ AS ” 可以忽略,显示列名作用为输出表的时候没有制定字段名如使用表达式或函数的选项,其函数名不可与作字段名,显示列名用引号 ' ' 定界,可以不和选项一起使用

聚合函数

函数用途
COUNT(*)统计元组个数
COUNT( [ DISTINCT | ALL ] <列名> )统计一列中值的个数
SUM( [ DISTINCT | ALL ] <列名> )计算一列值的总和,使用该函数时这一列必须为数值型
AVG( [ DISTINCT | ALL ] <列名> )计算一列值的平均值,使用该函数时这一列必须为数值型
MAX( [ DISTINCT | ALL ] <列名> )求一列值中的最大值
MIN( [ DISTINCT | ALL ] <列名> )求一列值中的最小值
-------------
--无条件查询--
-------------

/*
字段输出列
*/

--查询sc表里的所有信息
SELECT * FROM sc;

--查询student表里的sno,sname,ssex,sbirthday信息
SELECT sno,sname,ssex,sbirthday FROM student;

--查询teaching表里的第四行信息
SELECT * FROM teaching LIMIT 3,1;

--查询teacher表里的第11行到第15行信息
SELECT * FROM teacher LIMIT 10,5;

--查询course表里的cno,cname的前十行信息
SELECT cno,cname FROM course LIMIT 10;

--查询class表里的所有专业信息
SELECT DISTINCT speciality FROM class;


/*
函数输出列
*/

--查询student里学生总数
SELECT COUNT(*) number FROM student;

--查询sc表里选修了课程的学生总数
SELECT COUNT(DISTINCT sno) number FROM sc;

--查询sc表里所有成绩的平均成绩
SELECT AVG(degree) avgDegree FROM sc;

--查询class表里的全级人数
SELECT SUM(number) people FROM class;

--查询sc表里的最高成绩
SELECT MAX(degree) Biggest FROM sc;

--查询sc表里的最低成绩
SELECT MIN(degree) Smallest FROM sc;

--查询student表里sname和转化单位后的学生年龄信息
SELECT sname,(YEAR(CURDATE())-YEAR(sbirthday)) AS sage FROM student;

条件(WHERE子句)

其条件表达式通常使用运算符连接

WHERE字句的运算符
比较

等于号 = 、小于号 < 、大于号 > 、 小于且等于号 <= 、 大于且等于号 >= 、

不等于号<> 、 不等于号 != 、 不大于号 !> 、 不小于号 !<

范围BETWEEN AND、NOT BETWEEN AND
列表IN、NOT IN
字符匹配符

LIKE

NOT LIKE

通配符说明示例
%任意多个字符

M%:表以M开头的任意字符串

%M:表以M结尾的任意字符串

%M%:表任意位置带有M的字符串

_

单个字符

可与%搭配使用

_M:表以任意字符开头,后面跟着M的两位字符串

M_:表以M开头,后面跟着任意一个字符串的两位字符串

空值IS NULL、IS NOT NULL
逻辑AND、OR、NOT

条件表达式也可以用正则表达式连接,使用REGEXP指定正则表达式的字符匹配模式,其字符匹配选项列表如下

正则表达式
选项说明匹配值示例
^匹配文本的开始字符' ^b ':匹配以字母b开头的字符串,如bruh,bastard
$匹配文本的结束字符' st$ ':匹配以st结尾的字符串,如list,artist
.匹配任何单个字符' b.t ':匹配任何b和t之间有一个字符的字符串,如bit,byte
*匹配零个或多个在它前面的字符

' aa*n ':匹配字符a后面和n前面有0或多个a的字符串,如an,aan,aaaan

+匹配前面的字符一次或多次' ad+ ':匹配字符a后面至少一个d的字符串,如ad,admin
?匹配前面的字符一次或零次' abc? ' 匹配c后的字符一次或者c匹配零次,如ab,abcd
字符串匹配包含指定字符的文本' fu ':匹配带有fu的字符串,如fuck,funny,confuse
[ 字符集合 ]匹配字符集合中的任意一个元素' [ gkd ] ':匹配g或者k或者d,如dude,kerberos,gentoo
字符串 { n }匹配前面的字符串至少n次' t{ 2 } ':匹配连续带t至少两次的字符串,如bitter,better
字符串 { m,n }

匹配前面的字符串至少m次,至多n次

' h{ 3,8 } ':匹配连续带至少3个h,至多8个h的字符串,如ohhh,ohhhhh,ohhhhhhhh
-----------
--条件查询--
-----------

/*
WHERE子句
*/

--查询student表中性别为男的学生的所有信息
SELECT * FROM student WHERE ssex='男';
SELECT * FROM student WHERE NOT ssex='女';

--查询student表中姓刘的学生的所有信息
SELECT * FROM student WHERE sname LIKE '刘%';
SELECT * FROM student WHERE sname REGEXP '^刘';

--查询student表中sname第二位为“小”的sname和saddress信息
SELECT sname,saddress FROM student WHERE sname LIKE '_小%';

--查询student表中saddress不在山东省的所有信息
SELECT * FROM student WHERE saddress NOT LIKE '%山东省%';

--查询course表中cname以“计算机”开头的cname信息
SELECT cname FROM course WHERE cname REGEXP '^计算机';

--查询student表中saddress以“号”结尾的sname,sno,saddress信息
SELECT sname,sno,saddress FROM student WHERE saddress REGEXP '号$';

--查询student表中sname头尾分别为“李”和“明”的sno,sname信息
SELECT sno,sname FROM student WHERE sname REGEXP '李.明';

--查询student表中sphone里“6”和“5”中间有0或多个“7”的所有信息
SELECT * FROM student WHERE sphone REGEXP '67*5';

--查询student表中sphone里“6”和“5”中间至少有1个“7”的所有信息
SELECT * FROM student WHERE sphone REGEXP '67+5';

--查询student表中sno里带有“0502”且其后可能为空或者是带有左边为0的两个字符
SELECT * FROM student WHERE sno REGEXP '05020?';

--查询course表中cno带“01”的所有信息
SELECT * FROM course WHERE cno REGEXP '01';

--查询student表中sno带有8或9的所有信息
SELECT * FROM student WHERE sno REGEXP '[89]';

--查询student表中sno带有两个连续的“1”的所有信息
SELECT * FROM student WHERE sno REGEXP '1{2}';

--查询student表中sphone带有至少两个,至多4个“6”的所有信息
SELECT * FROM student WHERE sphone REGEXP '6{2,4}';

--查询sc表中成绩为空的所有信息
SELECT * FROM sc WHERE degree IS NULL;

--查询sc表中成绩非空的sno信息
SELECT sno FROM sc WHERE degree IS NOT NULL;

--查询sc表中成绩在80到90之间的sno,cno信息
SELECT sno,cno FROM sc WHERE degree BETWEEN 80 AND 90;

--查询sc表中成绩为79,89,99的所有信息
SELECT * FROM sc WHERE degree=79 OR degree=89 OR degree=99;

条件(GROUP BY子句)

将查询结果集中的各行按列名清单分组,在列名清单上对应值相同的记录分在同一组,各组分别输出,加上HAVING子句可筛选条件输出

-----------
--条件查询--
-----------

/*
GROUP BY 子句
*/

--查询sc表中每个cno及相应的选课人数
SELECT cno,COUNT(sno) Number FROM sc GROUP BY cno;

--查询sc表中每个cno的选课人数和degree的最大值
SELECT COUNT(sno),MAX(degree) FROM sc GROUP BY cno;

--查询sc表中选修了三门课以上的sno
SELECT sno FROM sc GROUP BY sno HAVING COUNT(*)>3;

--查询sc表中至少选修了一门课的sno
SELECT sno FROM sc GROUP BY sno HAVING COUNT(*)>=1;

--查询student表中各班的男女生人数
SELECT classno,COUNT(*),ssex FROM student GROUP BY ssex,classno;

--查询sc表中挂科超过三人的课程号
SELECT cno,COUNT(cno) cFail FROM sc WHERE degree<60 GROUP BY cno HAVING COUNT(degree)>3;

条件(ORDER BY子句)

将查询结果按照一个或多个字段进行排序,有ASC升序和DESC降序两种排序,默认是升序

-----------
--条件查询--
-----------

/*
ORDER BY 条件
*/

--查询sc表中不及格的学生sno,cno,并按degree降序排列
SELECT sno,cno FROM sc WHERE degree<60 ORDER BY degree DESC;

--查询sc表中选修了“C03”课程的学生sno,degree并按degree降序排列
SELECT sno,degree FROM sc WHERE cno='C03' ORDER BY degree DESC;

--查询sc表中选修了“C01”课程的学生sno和对应的cno,按sno升序排列
SELECT sno,cno FROM sc WHERE cno='C01' ORDER BY sno ASC;

--查询sc表中每个学生的选课门数、考试总成绩和sno,按选课门数降序排列
SELECT sno,COUNT(cno) Cnum,SUM(degree) sumD FROM sc GROUP BY sno ORDER BY COUNT(cno) DESC;

多表连接查询

语句格式:

交叉连接

SELECT [ ALL | DISTINCT ]

[ 别名. ] <选项1> [ AS<显示列名> ] [, [ 别名. ] <选项2> [ AS<显示列名2> ] [,...] ]

FROM <表名1> [ 别名1 ], <表名2> [ 别名2 ] [,...] ;

内连接

SELECT [ ALL | DISTINCT ]

[ 别名. ] <选项1> [ AS<显示列名> ] [, [ 别名. ] <选项2> [ AS<显示列名2> ] [,...] ]

FROM <表名1> [ 别名1 ] INNER JOIN <表名2> [ 别名2 ]

ON <表名1.列1>=<表名2.列2> [,...]

[ WHERE <条件表达式> ] ;

自连接

SELECT [ ALL | DISTINCT ]

[ 别名. ] <选项1> [ AS<显示列名> ] [, [ 别名. ] <选项2> [ AS<显示列名2> ] [,...] ]

FROM <表名1> [ 别名1 ], <表名1> [ 别名2 ] [,...]

WHERE <表名1.列1>=<表名2.列2> [ AND <条件表达式> ] ;

外连接

SELECT [ ALL | DISTINCT ]

[ 别名. ] <选项1> [ AS<显示列名> ] [, [ 别名. ] <选项2> [ AS<显示列名2> ] [,...] ]

FROM <表名1> LEFT | RIGHT [ OUTER ] JOIN <表名2>

ON <表名1.列1>=<表名2.列2> WHERE <条件表达式> [,...] ;

------------
--连表查询--
------------

/*
交叉连接
*/

--查询a表每一行对应b表的所有数据(实际很少有应用场景,敲一敲看看会发生什么)
SELECT a.*,b.* FROM department a,class b;


/*
内连接
*/

#两张表相连,连接类型在WHERE子句中制定

--查询每门课信息及其排课情况
SELECT a.*,b.* FROM course a,teaching b WHERE a.cno=b.cno;

--查询选修“高等数学”课程且成绩在80~90分的学生学号与成绩
SELECT a.sno,a.degree FROM sc a,course b WHERE a.cno=b.cno AND b.cname='高等数学' AND a.degree BETWEEN 80 AND 90;

--查询选修“C04”课程的学生的平均年龄
SELECT AVG(YEAR(CURDATE())-YEAR(a.sbirthday)) avgAge,b.cno FROM student a,sc b WHERE a.sno=b.sno AND cno='C04';

--查询专业为计算机网络技术或者软件技术的学生的所有信息
SELECT student.* FROM student,class WHERE student.classno=class.classno AND class.speciality IN ('计算机网络技术','软件技术');

--查询至少选修一门课程的女生的姓名
SELECT a.sname FROM student a,sc b WHERE a.sno=b.sno AND a.ssex='女' GROUP BY a.sno HAVING COUNT(b.sno)>1;

--查询各专业的男女生人数
SELECT b.speciality,a.ssex,COUNT(a.sno) FROM student a,class b WHERE a.classno=b.classno GROUP BY a.ssex,b.speciality;

--查询各系老师的人数,并按人数降序排列
SELECT COUNT(a.tno) People,b.deptname FROM teacher a,department b WHERE a.deptno=b.deptno GROUP BY b.deptname ORDER BY people DESC;

#三张表相连

--查询姓“王”的学生姓名及所学课程的名称
SELECT a.sname,c.cname FROM student a,sc b,course c WHERE a.sno=b.sno AND b.cno=c.cno and a.sname REGEXP '^王';

#四张表相连

--查询软件技术专业成绩在90分以上的学生姓名、性别和课程名称
SELECT a.sname,a.ssex,b.cname FROM student a,course b,class c,sc d WHERE a.classno=c.classno AND a.sno=d.sno AND b.cno=d.cno AND d.degree>=90 AND c.speciality='软件技术';


#两张表相连,连接类型在FROM子句中制定( INNER 可写可不写,JOIN默认是INNER JOIN)

--查询女学生的学号sno,姓名sname,成绩degree
SELECT a.sno,a.sname,b.degree FROM student a INNER JOIN sc b ON a.sno=b.sno WHERE a.ssex='女';

#三张表相连

--查询“李新”教师所授课程的课程名称
SELECT a.tname,c.cname FROM (teacher a INNER JOIN teaching b ON a.tno=b.tno) JOIN course c ON b.cno=c.cno WHERE tname='李新';


/*
自连接
*/

--查询跟“金羽”同学一个班的学生学号,姓名,住址
SELECT b.sno,b.sname,b.saddress FROM student a,student b WHERE a.classno=b.classno AND a.sname='金羽' AND b.sname<>'金羽';

--查询同时选修了“A01”和“A03”课程的学生姓名和成绩
SELECT a.sname sname,b.degree A01,c.degree A03 FROM student a,sc b,sc c WHERE a.sno=b.sno AND a.sno=c.sno AND b.cno='A01' AND c.cno='A03';


/*
外连接
*/

--查询所有学生的学号、姓名、性别及可能存在的课程号,成绩( OUTER 可写可不写,但LEFT/RIGHT必须选一个,否则是内连接)
SELECT student.sno,sname,ssex,cno,degree FROM student LEFT OUTER JOIN sc ON student.sno=sc.sno;

--查询所有课程及可能存在的教师编号和学期数,按教师编号降序排列
SELECT tno,cname,cterm FROM teaching a RIGHT JOIN course b ON a.cno=b.cno ORDER BY tno DESC;

嵌套查询

嵌套子查询

SELECT <字段名清单> FROM <表1> WHERE <单个字段名>

<运算符> <( SELECT 单个字段名 FROM 表2 [ 条件表达式 ] )> ;

相关子查询

SELECT <字段名清单> FROM <表1> WHERE

<EXISTS> <( SELECT 字段名清单2 FROM 表2 [ WHERE 连接条件 [ AND 条件表达式 ] ])> ;

ANY 和 ALL 的具体用法和含义
用法含义
>ANY大于子查询结果中的某个值
>ALL大于子查询结果中的所有值
<ANY小于子查询结果中的某个值
<ALL小于子查询结果中的所有值
>=ANY大于等于子查询结果中的某个值
>=ALL大于等于子查询结果中的所有值
<=ANY小于等于子查询结果中的某个值
<=ALL小于等于子查询结果中的所有值
=ANY等于子查询结果中的某个值
=ALL等于子查询结果中的所有值
!=ANY 或 <>ANY 不等于子查询结果中的某个值
!=ALL 或 <>ALL不等于子查询结果中的所有值
------------
--嵌套查询--
------------

/*
嵌套子查询
*/

#单纯的嵌套

--查询王刚同学所选课程及其成绩
SELECT cno,degree FROM sc WHERE sno IN (SELECT sno FROM student WHERE sname='王刚');

--查询不讲授“C01”课程的教师姓名
SELECT tname FROM teacher WHERE tno NOT IN (SELECT tno FROM teaching WHERE cno='01');

--查询女教师所授课程的课程号和课程名称
SELECT cname,cno FROM course WHERE cno IN (SELECT cno FROM teaching WHERE tno IN (SELECT tno FROM teacher WHERE tsex='女'));

--查询选修“大学英语”课程且成绩在80~90分的学生学号与成绩
SELECT sno,degree FROM sc WHERE cno IN (SELECT cno FROM course WHERE cname='大学英语') AND degree BETWEEN 80 AND 90;

--查询学号比“刘影”同学大,年龄比她小的学生的学号,姓名和出生日期
SELECT sno,sname,sbirthday FROM student WHERE sno > (SELECT sno FROM student WHERE sname='刘影') AND sbirthday > (SELECT sbirthday FROM student WHERE sname='刘影');


#内连接加嵌套

--查询在第2学期开课的课程名称及学生的成绩
SELECT a.cname,b.sno,b.degree FROM course a,sc b WHERE a.cno=b.cno AND a.cno IN (SELECT cno FROM teaching WHERE cterm=2);


#自连接加内连接加嵌套

--查询与李扬同个班的学生的姓名
SELECT b.sname FROM student a,student b,class c,class d WHERE a.classno=c.classno AND b.classno=d.classno AND c.classno=d.classno AND a.sname='李扬' AND b.sname<>'李扬';

--查询年龄大于所有女生的男生的姓名及可能存在的系别
SELECT a.sname,b.speciality FROM student a LEFT JOIN class b ON a.classno=b.classno WHERE a.sbirthday <= ALL(SELECT sbirthday FROM student WHERE ssex='女') AND a.ssex='男' GROUP BY a.sname;

--查询选课成绩比被选的课平均成绩高的学生的学号及成绩
SELECT a.sno,c.degree FROM student a,(SELECT cno,AVG(degree) avgDegree FROM sc GROUP BY cno) b,sc c WHERE a.sno=c.sno AND b.cno=c.cno AND c.degree>avgdegree;

--查询选修了“思想品德教育”课程的学生学号,姓名及系别
SELECT a.sno,a.sname,b.speciality FROM student a LEFT JOIN class b ON a.classno=b.classno WHERE a.sno IN (SELECT sno FROM sc WHERE cno IN (SELECT cno FROM course WHERE cname='思想品德教育'));


/*
相关子查询
*/

--查询有选课的同学的信息
SELECT * FROM student WHERE EXISTS (SELECT sno FROM sc WHERE sc.sno=student.sno);

--查询“马栋”同学所在班级的学生学号,姓名,班级号
SELECT sno,sname,classno FROM student s1 WHERE EXISTS (SELECT * FROM student s2 WHERE s1.classno=s2.classno AND s2.sname='马栋');

--查询哪些学生没有选课
SELECT sno,sname FROM student WHERE NOT EXISTS (SELECT * FROM course WHERE EXISTS (SELECT * FROM sc WHERE sno=student.sno AND cno=course.cno));

集合查询

SELECT <字段名清单> FROM <表名> [ WHERE 条件表达式 ]

UNION SELECT <字段名清单> FROM <表名> [ WHERE 条件表达式 ] ;

------------
--集合查询--
------------

--查询sc表中不及格和未参加期末考的所有信息
SELECT * FROM sc WHERE degree<60 UNION SELECT * FROM sc WHERE degree IS NULL;

--查询20070101班及年龄小于或等于32岁的学生信息
SELECT * FROM student WHERE classno='20070101' UNION SELECT * FROM student WHERE YEAR(CURDATE())-YEAR(sbirthday)<=32;

优化数据表

索引

索引是一种可以加快数据检索的数据库结构,主要用于提高性能,它是一个单独的、物理的数据库结构,是某个表中一列或若干列的集合以及相应的标识这些值所在的数据页的逻辑指针清单。

MySQL的所有存储引擎都最少能支持每个表16个索引,最少能支持256字节的总索引长度,但每种存储引擎不一定支持所有索引类型;索引一旦建立,将由数据库自动管理和维护,对数据表的增删查改,数据库都会自动在索引中作出相应的修改,但要避免在一张表上创建过多的索引,以免降低系统维护速度

索引类型

普通索引和唯一索引

普通索引是基本索引类型,允许在定义索引的列中插入重复值和空值

唯一索引是指索引列的值必须唯一,但允许有空值,如果是组合索引,则列值的组合必须唯一

单列索引和组合索引

单列索引是指一个索引只包含一个列;一张表可以有多个单列索引

组合索引是指在表的多个字段组合上创建的索引

全文索引

全文索引是指定义索引的列上支持值的全文查找,允许这些索引列中插入重复值和空值。全文索引可以在char、varchar和text这三种数据类型的列上创建,但MySQL中只有MyISAM存储引擎支持全文索引

空间索引

空间索引是对空间数据类型的字段建立的索引,不允许插入空值,空间索引可以在geometry、point、linestring和polygon这四种数据类型的列上创建,同全文索引,存储引擎只有MyISAM支持这种索引,而且这类索引新手会很少用到(比如我)

设计原则

索引并非越多越好

太多索引又占空间又影响增删改的速度

频繁更新的表最好不要建立太多索引

索引过多的话每个操作可能都会卡一下

数据量小的表最好不用索引

数据少的表直接查询速度比遍历索引还快,索引起不到优化效果

不同值少的列上不要建立索引

如果在只有“是”和“否”两个值的字段上建立索引,不仅不提高查询速度,还降低了更新速度

指定唯一索引是由某种数据本身的特征决定的

例如“学号”字段的值就具有唯一性,对该字段建立唯一索引可以很快确定某个学生信息

经常需要排序、分组和联合操作的字段应建立索引

建立索引后可大幅度提高查询速度,如果是多个字段可以建立组合索引

创建索引

创表时

CREATE TABLE <表名>(

<创表语句> [ UNIQUE | FULLTEXT | SPATIAL ] < INDEX | KEY > [ 索引名 ]

( 字段名 [ (长度) ] [,...] )

);

创表后

CREATE [ UNIQUE | FULLTEXT | SPATIAL ] INDEX <索引名> ON <表名> ( [ 字段名 [ (长度) ] ] );

ALTER TABLE <表名> ADD [ UNIQUE | FULLTEXT | SPATIAL ] INDEX <索引名> ON <表名> ( [ 字段名 [ (长度) ] ] );

修改索引

MySQL中无法直接修改索引(只能改名字),要修改索引结构就只能删除索引重新定义

删除索引

DROP INDEX <索引名> ON <表名>;

参数说明

UNIQUE | FULLTEXT | SPATIAL:可选参数,三选一,分别表示唯一索引、全文索引和空间索引

INDEX或KEY:同义词,二选一

字段名:指定索引对应的字段名称,必须是表内已存在的字段

长度:指定索引的长度,必须是字符串类型才可以使用

#创表时创建索引
CREATE TABLE workinfo(
id int(10) PRIMARY KEY AUTO_INCREMENT,
name varchar(20) NOT NULL,
type varchar(20),
address varchar(50),
wages int,
contents tinytext,
extra text,
UNIQUE INDEX index_id(id DESC)    #定义索引
);

#创表后添加索引
CREATE INDEX id_name ON workinfo (name);    #创建单列索引
CREATE INDEX index_t ON workinfo (type,address);    #创建组合索引
CREATE FULLTEXT INDEX index_ext ON workinfo (extra);    #创建全文索引
ALTER TABLE workinfo ADD INDEX index_wages (wages);    #创建单列索引

#重命名索引
ALTER TABLE workinfo RENAME INDEX index_t TO index_taddress;

#删除索引
DROP INDEX index_id ON workinfo;

视图

视图是从一个或多个基本表,或者视图中导出的虚拟表,存储虚拟表的定义在数据库中,但不存放数据,依靠视图查找对应的原表数据;引用视图时的操作与引用表一致

创建视图

CREATE VIEW <视图名> [ (字段名 [ ,...n ] ) ]

AS

        <查询语句>

        [ WITH CHECK OPTION ] ;

修改视图

ALTER VIEW <视图名> [ (字段名 [ ,..n ] ) ]
AS

        <查询语句>

        [ WITH CHECK OPTION ] ;

删除视图

DROP VIEW <视图名> ;

参数说明

查询语句:SELECT语句里不能包含ORDER BY子句

WITH CHECK OPTION:强制所有通过视图修改的数据必须满足查询语句里携带的WHERE子句条件

#创建视图(带where子句限制)
CREATE VIEW v_student
AS
    SELECT a.sno,sname,cname,degree
    FROM student a,course b,sc c
    WHERE a.sno=c.sno AND b.cno=c.cno AND cname='大学英语'
    WITH CHECK OPTION;

#创建视图
CREATE VIEW v1_student
AS
    SELECT sno,sname,saddress FROM student;

#修改视图
ALTER VIEW v1_student
AS
    SELECT sno,sname FROM student;

#删除视图
DROP VIEW v1_student;

上一篇入口:

        MySQL数据库创建与维护数据表

下一篇入口:

        SQL编程基础

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值