一、安装和配置数据库:

  1. 下载mysql地址:https://dev.mysql.com/downloads/mysql/
  2. windows下载的版本是installer msi版本:https://dev.mysql.com/downloads/windows/installer/5.7.html
  3. 环境变量的配置:
  4. 书上80页。
  5. 路径:C:\Program Files\mysql\MySQL Server 5.7\bin
  6. 环境变量配置地址:电脑——》属性——》系统属性——》高级——》环境变量——》Path
  7. 启动命令行:windows键+R键,输入CMD
  8. 启动数据库:net start mysql57
  9. 关闭数据库:net stop mysql57

二、连接数据库的方式:

1、连接本地数据库:

  1. mysql -h localhost -u root -p 回车后输入密码

如果是连接远程的数据库的话,将localhost 换为数据库服务器的ip地址。

2、navicat连接数据库:

左上角的连接——》选择Mysql——》输入连接名(任意)——》输入数据库的密码——》测试连接——》保存——》双击连接名。

三、关于数据库的操作

  1. 查看当前所有的数据库:show databases;
  2. mysqlinformation_schemaperfermance_schemasys这四个是系统自带的数据库,不用动它。
  3. 创建数据库:create database 数据库名;
  4. e.g create database mydb;
  5. 打开数据库:use 数据库名;
  6. e.g use mydb;
  7. 删除数据库:drop database 数据库名;
  8. e.g drop database mydb;
  9. 查看单个数据库信息: show create database 数据库名;
  10. e.g show create database mydb;
  11. 查看系统支持的存储引擎类型:
  12. SHOW ENGINES;

四、关于表的操作

1、创建表

约束条件与数据类型的宽度一样,都是可选参数。

作用:用于保证数据的完整性和一致性。

  1. PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
  2. FOREIGN KEY (FK) 标识该字段为该表的外键
  3. NOT NULL 标识该字段不能为空
  4. UNIQUE KEY (UK) 标识该字段的值是唯一的
  5. AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
  6. DEFAULT 为该字段设置默认值
  7. UNSIGNED 无符号
  8. ZEROFILL 使用0填充
  1. create table 表名 (
  2. 字段1 数据类型(长度) 完整性约束,
  3. 字段2 数据类型(长度) 完整性约束
  4. );
  5. e.g create table t1 (
  6. id int(4) NOT NULL,
  7. name varchar(14) default 'allen'
  8. );

2、查看表

1)查看表结构

  1. describe 表名; || desc 表名;
  2. e.g desc t1;

2)查看表详细结构

  1. show create table 表名\G;
  2. \G:帮助整理结果的格式
  3. e.g show create table course\G;

3)查看所有的表

  1. show tables;

3、修改表结构

1)修改表名

  1. -- 语法:ALTER TABLE 表名 RENAME 新表名;
  2. ALTER TABLE sc RENAME score;

2)增加字段

  1. -- 语法:ALTER TABLE 表名 ADD 新字段名 数据类型 [完整性约束条件];
  2. -- 增加一个字段
  3. ALTER TABLE student ADD motor varchar(30) DEFAULT 'cb300r';
  4. -- 增加多个字段
  5. ALTER TABLE teacher ADD motor varchar(30) DEFAULT 'cb500r',
  6. ADD car varchar(30) DEFAULT 'BMW7';
  7. -- 增加字段到第一项
  8. ALTER TABLE score ADD semester varchar(30) DEFAULT '2021' FIRST;
  9. -- 增加新字段到指定字段之后
  10. ALTER TABLE student ADD salary int DEFAULT 1000 AFTER ssex;

3)删除字段

  1. -- 删除字段:ALTER TABLE 表名 DROP 字段名;
  2. ALTER TABLE student DROP salary;

4)修改字段类型和名称

  1. -- 修改字段类型
  2. -- 语法:ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…];
  3. ALTER TABLE student MODIFY salary MEDIUMINT DEFAULT 3000;
  4. -- 修改字段名称
  5. -- 语法: ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
  6. ALTER TABLE student CHANGE salary living_cost MEDIUMINT DEFAULT 3000;
  7. -- 修改字段类型和名称
  8. -- 语法:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
  9. ALTER TABLE student CHANGE living_cost capital INT NOT NULL DEFAULT 300000;

4、删除表

  1. -- 语法:DROP TABLE 表名;
  2. DROP TABLE ts;

五、表记录相关操作

1、添加表记录

  1. insert into 表名(列名) values (常量清单);
  2. -- 单条数据
  3. insert into student(sno, sname) values
  4. ('2005010104', '张三');
  5. -- 多条数据
  6. insert into student(sno, sname) values
  7. ('2001010101', '李四'),
  8. ('2002020202', '王五');
  9. -- 不使用可选列名:
  10. insert into t1 values
  11. (1,'egon','male',18),
  12. (2,'alex','female',81);

2、删除表记录

  1. -- 语法:DELETE FROM 表名 WHERE 条件;
  2. DELETE FROM student
  3. WHERE sno='2005030301';

3、修改表记录

  1. -- 语法:UPDATE 表名 SET 关系式 (WHERE 条件);
  2. -- 改单个记录
  3. UPDATE student SET ssex='女'
  4. WHERE sname='张丽';
  5. -- 改多个记录
  6. UPDATE sc SET degree=0
  7. WHERE sno IN (
  8. SELECT sno
  9. FROM student
  10. WHERE sdept='计算机工程系'
  11. );
  12. -- 改单个记录多项
  13. UPDATE student SET ssex='女', capital=300000
  14. WHERE sname='张立';

六、关于表的查询的操作:

select 要查询的字段:1、*,2、name,sex,age

DISTINCT 去重

SELECT DISTINCT sno FROM sc;

from 要查询的表名

where 要查询结果的筛选条件

  • 1、比较运算符:=、>、<、>=、<=、 两个不等于符号:<>、!= (不大于!>和不小于!< 在mysql中执行失败)

    ```

    SELECT sname, ssex, YEAR(CURRENT_DATE)-YEAR(sbirthday) as age

    FROM student

    WHERE YEAR(CURRENT_DATE)-YEAR(sbirthday) > 33;

    1. SELECT sname, ssex, YEAR(CURRENT_DATE)-YEAR(sbirthday) as age
    2. FROM student
    3. WHERE YEAR(CURRENT_DATE)-YEAR(sbirthday) != 33;
    4. ```
  • 2、范围运算符 between and 、not between and

    ```

    SELECT sname, ssex, YEAR(CURRENT_DATE)-YEAR(sbirthday) as age

    FROM student

    WHERE YEAR(CURRENT_DATE)-YEAR(sbirthday) BETWEEN 30 AND 33;

    1. SELECT sname, ssex, YEAR(CURRENT_DATE)-YEAR(sbirthday) as age
    2. FROM student
    3. WHERE YEAR(CURRENT_DATE)-YEAR(sbirthday) NOT BETWEEN 30 AND 33;
    4. ```
  • 3、列表运算符 in、 not in

    SELECT sname, ssex, YEAR(CURRENT_DATE)-YEAR(sbirthday) as age FROM student WHERE YEAR(CURRENT_DATE)-YEAR(sbirthday) IN (30,32,33);

  • 4、字符匹配符 LIKE、NOT LIKE

    SELECT * FROM student WHERE sdept LIKE '%程%';

  • 5、空值判断 IS NULL、IS NOT NULL

    SELECT * FROM student WHERE sdept IS NULL;

  • 6、逻辑运算符 AND、OR、NOT

    ```

    SELECT *

    FROM student

    WHERE ssex='女' AND sdept LIKE '%数学%';

    1. SELECT *
    2. FROM student
    3. WHERE ssex='女' OR ssex='男';
    4. ```

group by 指定查询结果的分组条件

SELECT * FROM student WHERE ssex='女' OR ssex='男' GROUP BY sdept;

having 分组或集合的查询条件 (在group by后执行)

SELECT * FROM student WHERE ssex='女' OR ssex='男' GROUP BY sdept HAVING ssex='女';

ORDER BY 指定查询结果排序 DESC:逆向排序

LIMIT 指定结果输出范围

```

SELECT *

FROM student

WHERE ssex='女'

ORDER BY sbirthday DESC

LIMIT 1;

  1. SELECT *
  2. FROM student
  3. WHERE ssex='女'
  4. ORDER BY sbirthday
  5. LIMIT 1;
  6. ```

1、通配符:

  1. 1、%:任意多个字符
  2. 1)以什么开头的模糊查询
  3. SELECT *
  4. FROM student
  5. WHERE sdept LIKE '信%';
  6. 2)以什么结尾的模糊查询
  7. SELECT *
  8. FROM student
  9. WHERE saddress LIKE '%州';
  10. 3)包含有什么字段的模板查询
  11. SELECT *
  12. FROM student
  13. WHERE sdept LIKE '%程%';
  14. 2_:单个字符
  15. SELECT *
  16. FROM student
  17. WHERE sname LIKE '王_';
  18. SELECT *
  19. FROM student
  20. WHERE sname LIKE '王%';

2、正则表达式:

  1. 1、^以什么开头
  2. SELECT *
  3. FROM student
  4. WHERE sname REGEXP '^王';
  5. 2$以什么结尾
  6. SELECT *
  7. FROM student
  8. WHERE speciality REGEXP '务$';
  9. 3、.匹配任意单字符(不支持中文,仅支持数字和字母字符串)
  10. SELECT *
  11. FROM student
  12. WHERE sno REGEXP '2.050301';
  13. 4、*匹配任意个前面的字符串(不生效)
  14. SELECT *
  15. FROM student
  16. WHERE sno REGEXP '2*50301';
  17. SELECT *
  18. FROM student
  19. WHERE sno REGEXP '2*5*';
  20. 5、+匹配前面的字符1次或多次
  21. SELECT *
  22. FROM student
  23. WHERE sbirthday REGEXP '198+-0';
  24. SELECT *
  25. FROM student
  26. WHERE sno REGEXP '20+303';
  27. 6、匹配指定字符串文本
  28. SELECT *
  29. FROM student
  30. WHERE sdept REGEXP '机工';
  31. 7、[]匹配字符串集合中任意一个字符(中文无法过滤,仅支持数字和字母字符串)
  32. SELECT *
  33. FROM sc
  34. WHERE cno REGEXP '[13]';
  35. 8、[^]匹配不在括号内的任何字符(没有发生作用)
  36. 9、字符串{n}匹配前面的字符串至少n次(不支持中文,仅支持数字和字母字符串)
  37. SELECT *
  38. FROM student
  39. WHERE sno REGEXP '21{3}';
  40. 10、字符串{m,n}匹配前面的字符串至少m次,至多n
  41. SELECT *
  42. FROM student
  43. WHERE sno REGEXP '21{4,7}';
  44. SELECT *
  45. FROM student
  46. WHERE sno REGEXP '21{5,7}';

七、多表连接查询

注意:当对多个表进行查询时,要在 SELECT 语句后面指定字段是来源于哪一张表。

因此,在多表查询时,SELECT 语句后面的写法是表名.列名。

另外,如果表名非常长的话,也可以给表设置别名,这样就可以直接在 SELECT 语句后面写上表的别名.列名。

1、交叉连接

  1. 交叉连接(CROSS JOIN)一般用来返回连接表的笛卡尔积。
  2. 两个表的笛卡尔积,返回结果数量就是两个表的数据行相乘。

(1)语法格式:

  1. 方法一:
  2. SELECT <字段名>
  3. FROM <表1> CROSS JOIN <表2>;
  4. 方法二:
  5. SELECT <字段名>
  6. FROM <表1>, <表2>;

(2)示例:

  1. SELECT * FROM student CROSS JOIN sc;
  2. SELECT * FROM student, sc;

2、内连接

内连接(INNER JOIN)主要通过设置连接条件的方式,来移除查询结果中某些数据行的交叉连接。

即取两张表共同部分,相当于上面利用条件从笛卡尔积结果中筛选出正确结果。

- INNER JOIN 关键字连接两张表

- ON 子句来设置连接条件

(1)语法格式:

  1. 方法一:
  2. SELECT <字段名>
  3. FROM <表1> INNER JOIN <表2>
  4. ON <连接条件表达式>;
  5. 方法二:
  6. SELECT <字段名>
  7. FROM <表1>, <表2>
  8. where <连接条件>;

(2)示例:

  1. SELECT * FROM student INNER JOIN sc ON student.sno=sc.sno;
  2. SELECT * FROM student, sc WHERE student.sno=sc.sno;

(3)多表连接查询

多个表内连接时,在 FROM 后连续使用 INNER JOIN 或 JOIN 即可。

  1. SELECT * FROM student INNER JOIN sc ON student.sno=sc.sno
  2. INNER JOIN course ON sc.cno=course.cno;

3、自连接

一张表内可以进行自身连接操作——同一个表的不同行连接起来。

- 必须为表指定两个别名(逻辑上成两个表)

(1)语法格式:

  1. SELECT <字段名>
  2. FROM <表1> [别名1], <表1> [别名2]
  3. WHERE <连接条件表达式>;

(2)示例:

  1. -- 查询同时选修C01C04课程的学生学号
  2. SELECT A.sno
  3. FROM sc A, sc B
  4. WHERE A.sno=B.sno AND A.cno='C01' AND B.cno='C04';
  5. -- 查询与 王智刚 同在一个系的学生的学号、姓名、系
  6. SELECT stu2.sno, stu2.sname, stu2.sdept
  7. FROM student stu1, student stu2
  8. WHERE stu1.sdept=stu2.sdept AND stu1.sname='王智刚' AND stu2.sname!='王智刚';

4、外连接

外连接分为三种:左外连接,右外连接,全外连接。对应SQL:LEFT/RIGHT/FULL OUTER JOIN。

通常省略 outer 这个关键字。写成:

LEFT JOIN:保留左边表中的非匹配记录。

RIGHT JOIN:保留右边表中的非匹配记录。

FULL JOIN:保留两边表的所有行。

(1)语法格式:

  1. SELECT <字段名>
  2. FROM <表1> LEFT/RIGHT/FULL JOIN <表2>
  3. ON <连接条件表达式>;

(2)示例:

  1. select * from student LEFT JOIN sc ON student.sno=sc.sno;
  2. select * from sc RIGHT JOIN course ON course.cno=sc.cno;

(3)数据库不支持FULL JOIN

mysql不支持FULL JOIN,方法是使用 UNION ALL 模拟全连接。

  1. SELECT * FROM sc
  2. LEFT JOIN course ON course.cno=sc.cno
  3. UNION ALL
  4. SELECT * FROM sc
  5. RIGHT JOIN student ON student.sno=sc.sno;

八、嵌套查询(子查询)

查询块:一个SELECT-FROM-WHERE语句称为一个查询块。

嵌套查询(子查询):将一个查询块嵌套在另一个查询块的WHERE子句或HAVING子句的条件中。简单来说,一个查询语句嵌套在另一个查询语句内部的查询。

子查询中的SELECT语句用一对括号“( )”定界,查询结果必须确定。

SELECT语句中不能使用ORDER BY子句,ORDER BY子句永远只能对最终查询结果排序。

求解方法:由里向外处理的,即每个子查询在其上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。

  • 常用关键字:IN 、NOT IN 、ANY 、ALL、EXISTS 和 NOT EXISTS 等。
  • 比较运算符:>, >=, <, <=, != 等
  • 子查询一般分为两种:嵌套子查询和相关子查询。

1、嵌套子查询

嵌套子查询(不相关子查询):嵌套子查询的执行不依赖于外部嵌套。

  • 执行顺序:先执行子查询,子查询的结果集传给外部查询作为条件使用,再执行外部查询,显示查询结果。
  • 子查询可以多层嵌套。

(1)子查询返回单个值

子查询返回的单个值,被外部查询的比较操作使用。

  1. -- 平均年龄
  2. SELECT AVG(YEAR(CURDATE()) - YEAR(sbirthday))
  3. FROM student;
  4. -- 结果:25
  5. -- 查询所有年龄大于25的学生姓名
  6. SELECT *
  7. FROM student
  8. WHERE YEAR(CURDATE()) - YEAR(sbirthday) > 25;
  9. -- 查询所有年龄大于平均年龄的学生姓名
  10. SELECT *
  11. FROM student
  12. WHERE YEAR(CURDATE()) - YEAR(sbirthday) > (SELECT AVG(YEAR(CURDATE()) - YEAR(sbirthday)) FROM student);

(2)子查询返回一个值列表(用IN操作符实现查询)

IN表示属于,判断外部查询某个属性是否在子查询结果中。

  1. -- 找出‘C01’这门课有成绩的学生
  2. SELECT sname
  3. FROM student
  4. WHERE sno IN(
  5. SELECT sno FROM sc WHERE cno='C01');

(3)子查询返回一个值列表(用ANY或ALL操作符实现查询)

  • ANY和SOME关键字是同义词。
  • ANY和ALL操作符都必须与比较运算符一起使用。
  • 常用的比较运算符:>,<,>=,<=,=,!=,<>
  1. # 查询其他系中比数学系某一学生年龄大的学生姓名和年龄 ANY
  2. select YEAR(CURDATE()) - YEAR(sbirthday)
  3. FROM student
  4. where sdept='数学系';
  5. select sname, YEAR(CURDATE()) - YEAR(sbirthday) as age
  6. from student
  7. where YEAR(CURDATE()) - YEAR(sbirthday) > ANY(
  8. select YEAR(CURDATE()) - YEAR(sbirthday)
  9. FROM student
  10. where sdept='数学系'
  11. ) AND sdept!='数学系';
  12. # 查询其他系中比数学系全部学生年龄大的学生姓名和年龄
  13. select sname, YEAR(CURDATE()) - YEAR(sbirthday) as age
  14. from student
  15. where YEAR(CURDATE()) - YEAR(sbirthday) > ALL(
  16. select YEAR(CURDATE()) - YEAR(sbirthday)
  17. FROM student
  18. where sdept='数学系'
  19. ) AND sdept!='数学系';

2、相关子查询

相关子查询:子查询的执行依赖于外部查询,即子查询的查询条件依赖于外部查询的某个属性值。

执行过程:

  • 1)子查询为外部查询的每一个元组(行)执行一次,外部查询将子查询引用列的值传给子查询。
  • 2)如果子查询的任何行与其匹配,外部查询则取此行放入结果表。
  • 3)再回到 1),直到处理完外部表的每一行。

经常要用到 EXISTS 操作符,代表存在量词。

  1. -- 查询所有选修C01课程的学生姓名
  2. select sname from student
  3. where EXISTS (
  4. select * from sc
  5. where sno=student.sno AND cno='C01'
  6. );
  7. -- 查询选修了全部课程的学生姓名。
  8. SELECT sname FROM student
  9. WHERE NOT EXISTS
  10. (SELECT * FROM course
  11. WHERE NOT EXISTS
  12. (SELECT * FROM sc
  13. WHERE sno=student.sno AND cno=course.cno));

九、集合查询

SELECT的查询结果是元组的集合,所以可以对SELECT的结果进行集合操作。

但是MySQL语言只支持UNION(并操作)运算,对于INTERSECT(交操作)和EXCEPT(差操作)没有实现。

  1. -- 查询计算机工程系的学生及年龄不大于19岁的学生。
  2. select * from student
  3. where sdept='计算机工程系'
  4. UNION
  5. select * from student
  6. where year(curdate())-year(sbirthday)<=19;

十、索引

索引是一种有效组合数据的方式。通过索引,可以快速快速查询到数据库表对象中的特定记录,是一种提供性能的常用方式。

1、关于索引

使用索引可以提高从表中检索数据的速度,索引由表中的一个字段和多个字段生成的键组成。

索引按存储类型可分为:B型树索引(BTREE)和哈希索引。

MySQL支持6种索引,分别为普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引。

过多的索引会占据大量的磁盘空间。

以下情况适合创建索引:

  • 经常被查询的字段,即在WHERE子句中经常出现的字段
  • 在分组的字段,即在GROUP BY子句中出现的字段
  • 存在依赖关系的子表和父表之间的联合查询,即主键或外键字段
  • 设置唯一完整性约束的字段

2、创建表时创建普通索引

普通索引:在创建索引时,不附加任何限制条件(唯一,非空等限制),该类型的索引可以创建在任何数据类型的字段上。

  1. 语法形式:
  2. create table 表名(
  3.   属性名 数据类型,
  4.   ……
  5.   index|key [索引名](属性名1 [长度] [ASC|DESC])
  6. 示例:
  7. create table t_dept(
  8. deptno int,
  9. dname varchar(20),
  10. location varchar(40),
  11. index index_deptno(deptno)
  12. );

3、在已经存在的表上创建普通索引

  1. 语法形式:
  2. create index 索引名 on 表名 (属性名 [长度] [ASC|DESC]);
  3. 示例:
  4. create index index_dname on t_dept(dname);

4、通过SQL中语句alter table创建普通索引

  1. 语法形式:
  2. alter table 表名 add index|key 索引名(属性名 [长度] [ASC|DESC]);
  3. 示例:
  4. ALTER table t_dept add index index_deptno(deptno);

5、创建表时创建唯一索引

唯一索引:在创建索引时,限制索引的值必须是唯一的。

在MySQL中,根据索引的创建方式,分为手动索引和自动索引两种。

  • 自动索引,是指在数据库表里设置完整性约束时,该表会被系统自动创建索引。
  • 手动索引,是指手动在表上创建索引。当设置表的某个字段为主键或唯一完整性约束时,系统就会自动创建关联该字段的唯一索引。
  1. 语法形式:
  2. create table 表名(
  3.   属性名 数据类型,
  4.   ……
  5.   unique index|key [索引名](属性名1 [长度] [ASC|DESC])
  6. );
  7. 示例:
  8. create table t_dept1(
  9. deptno int,
  10. dname varchar(20),
  11. location varchar(40),
  12. unique index index_deptno(deptno)
  13. );

6、在已经存在的表上创建唯一索引

  1. 语法形式:
  2. create unique index 索引名 on 表名 (属性名 [长度] [ASC|DESC]);
  3. 示例:
  4. create unique index index_dname on t_dept1(dname);

7、通过alter table 创建唯一索引

  1. 语法形式:
  2. alter table table_name add unique index|key 索引名(属性名 [长度] [ASC|DESC]);
  3. 示例:
  4. alter table t_dept1 add unique index index_deptno on t_dept1(deptno);

8、删除索引

删除索引即删除表中已存在的索引。之所以要删除索引,是由于这些索引会降低更新速度,影响数据库的性能。

  1. 语法形式:
  2. drop index 索引名 on 表名;
  3. 示例:
  4. drop index index_deptno on t_dept;
  5. drop index index_dname on t_dept;

9、索引改名

对于MySQL 5.7及以上版本,可以执行以下命令:

  1. -- 语法:
  2. ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name;
  3. -- 示例:
  4. ALTER TABLE workinfo RENAME INDEX index_t TO index_taddress;

对于MySQL 5.7以前的版本,可以执行下面两个命令:

  1. -- 语法:
  2. ALTER TABLE tbl_name DROP INDEX old_index_name;
  3. ALTER TABLE tbl_name ADD INDEX new_index_name(column_name);
  4. -- 示例:
  5. drop index index_t on workinfo;
  6. create index index_taddress on workinfo(type,address);

十一、视图

视图是一种数据库对象,是从一个或多个基表(或视图)导出的虚表。可以被看成是虚拟表存储查询

  • 视图的结构和数据是对数据表进行查询的结果。
  • 创建视图通过定义 SELECT 语句检索将在视图中显示的数据。
  • 视图的基表是SELECT 语句引用的数据表称。
  • 视图被定义后便存储在数据库中,通过视图看到的数据只是存放在基表中的数据。

数据修改:当对通过视图看到的数据进行修改时,相应的基表的数据也会发生变化;同时,若基表的数据发生变化,这种变化也会自动地反映到视图中。

视图产生:视图可以是一个数据表的一部分,也可以是多个基表的联合;视图也可以由一个或多个其他视图产生。(视图可以从表的数据查询产生,也可以从其他视图查询数据产生)

1、视图常用操作:

(1)筛选表中的行。

(2)防止未经许可的用户访问敏感数据。

(3)将多个物理数据表抽象为一个逻辑数据表。

注意:视图上的操作和基表类似,但是 DBMS对视图的更新操作(INSERT、DELETE、UPDATE)往往存在一定的限制。

2、视图优点

(1)视图能够简化用户的操作。

(2)视图使用户能从多种角度看待同一数据。

(3)视图对重构数据库提供一定程序的逻辑独立性。

(4)视图能够对机密数据提供安全保护。

3、创建视图

语法:

  1. CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
  2. VIEW 视图名[(字段名列表)]
  3. AS
  4. select语句
  5. [ WITH [CASCADED|LOCAL] CHECK OPTION ]  
  6. 说明:
  7. 1OR REPLACE:表示当已具有同名的视图时,将覆盖原视图。
  8. 2ALGORITHM子句:可选项,表示视图选择的算法。ALGORITHM可取三个值:MERGETEMPTABLEUNDEFINED
  9. 如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。
  10. MERGE:会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
  11. TEMPTABLE:视图的结果将被置于临时表中,然后使用它执行语句。
  12. UNDEFINED:由MySQL选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。
  13. 3WITH CHECK OPTION:对于可更新视图,给定WITH CHECK OPTION子句用来防止插入或更新行,除非作用在行上的select_statement中的WHERE子句为“真”。
  14. 在可更新视图中加入WITH CHECK OPTION子句,当视图是根据另一个视图定义时,LOCALCASCADED关键字决定了检查测试的范围。
  15. LOCAL关键字对CHECK OPTION进行了限制,使其仅作用在定义的视图上,
  16. CASCADED会对该视图相关的所有视图和基表进行检查。
  17. 如果未给定任一关键字,默认值为CASCADED

例子:

  1. -- 查询其他系中比数学系全部学生年龄大的学生姓名和年龄
  2. select sname, YEAR(CURDATE()) - YEAR(sbirthday) as age
  3. from student
  4. where YEAR(CURDATE()) - YEAR(sbirthday) > ALL(
  5. select YEAR(CURDATE()) - YEAR(sbirthday)
  6. FROM student
  7. where sdept='数学系'
  8. ) AND sdept!='数学系';
  9. -- 定义视图(保存上面查询语句的结果)
  10. create view stu_older_info
  11. AS
  12. select sname, YEAR(CURDATE()) - YEAR(sbirthday) as age
  13. from student
  14. where YEAR(CURDATE()) - YEAR(sbirthday) > ALL(
  15. select YEAR(CURDATE()) - YEAR(sbirthday)
  16. FROM student
  17. where sdept='数学系'
  18. ) AND sdept!='数学系';
  19. -- 查询视图数据
  20. SELECT * FROM stu_older_info;
  21. SELECT * FROM stu_older_info WHERE age=33; -- 视图的查询跟查询数据表一样可以条件查询 及其他各种查询方式

4、修改视图

  1. -- 语法:alter view 视图名称 as 修改后的查询语句;
  2. -- 示例:
  3. ALTER VIEW stu_no
  4. AS
  5. SELECT *
  6. FROM sc
  7. WHERE degree > ANY(
  8. SELECT degree FROM sc where sno='20050301'
  9. ) AND sno!='20050301';
  10. SELECT * FROM stu_no;

视图修改完成后,再次查询视图,此时视图的数据变成执行修改后的查询语句。

修改视图的名称:可以先将视图删除,然后按照相同的定义语句进行视图的创建,并命名为新的视图名称

5、删除视图

  1. -- 语法:drop view 视图名称
  2. -- 示例:
  3. drop view stu_no;

6、查看视图信息

1)使用DESCRIBE查看视图

在MySQL中,使用权DESCRIBE语句可以查看视图的字段信息,包括字段名、字段类型等信息。

  1. -- DESCRIBE语句的语法格式如下所示:
  2. DESCRIBE 视图名;
  3. -- 或简写为:
  4. DESC 视图名;
  5. -- 示例:
  6. desc stu_older_info;

查看信息结果说明:Field:视图中的字段名;Type:字段的数据类型;Null:表示该字段是否允许存放空值;Key:表示该字段是否已经建有索引;Default:表示该列是否有默认值;Extra:表示该列的附加信息。

2)使用SHOW TABLE STATUS语句查看视图

  1. -- 语法:
  2. SHOW TABLE STATUS LIKE '视图名称';
  3. -- 示例
  4. SHOW TABLE STATUS LIKE 'stu_older_info';

从查询中可以看到,Comment的值为VIEW,说明所查看的teacher_view是一个视图。

存储引擎(Engine)、数据长度(Data_length)、索引长度(Index_length)等信息都显示为NULL,说明视图是虚拟表。

3)查看视图的创建语句:SHOW CREATE VIEW语句

在查询结果的create view字段,可以查看定义视图的语句

  1. SHOW CREATE VIEW stu_older_info;

7、通过视图更新数据

  1. insert ,update ,delete
  2. -- 通常是对基表的数据进行跟新,视图的数据随着更新
  3. UPDATE t_stuinfo SET c_id=1 WHERE s_id=8 -- 更新基表
  4. SELECT * FROM vi_stu_class -- 查询视图(数据已改变)
  5. -- 能不能通过视图修改数据(把修改的数据保存到基表),可以,但是有很多限制
  6. UPDATE vi_stu_class SET s_sex='女' WHERE s_id=8 -- 修改视图数据
  7. SELECT * FROM t_stuinfo; -- 查询基表数据已修改

8、注意事项

  1. (1) 创建,删除视图等操作需要权限
  2. (2) 视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中创建视图,创建时,应将名称指定为数据库名.视图名。
  3. 如:当前数据库t4 ,想在t9中创建 名为 vi_stu_sc的视图
  4. create view t9.vi_stu_sc as 查询语句
  5. (3) 如果视图的基表有多张,多张表有共同的字段,查询select字句后要指定 该字段所属的表
  6. 如:select * from 1 inner join 2 on 1.id=表2.id
  7. 在创建视图时的sql语句 select 1.id ,表1.某字段。。。。。from 1 inner join 2 on 1.id=表2.id
  8. (4) 通过修改视图从而修改基表数据的注意事项有:
  9. 使用INSERT语句进行插入操作的视图必须能够在基表中插入数据,否则插入操作会失败。
  10. 如果视图上没有包括基表中所有属性为NOT NULL 的字段,那么插入操作会由于那些字段的NULL值而失败。
  11. 如果在视图中使用聚合函数的结果,或者是包含表达式计算的结果,则插入操作不成功。
  12. 不能在使用了DISTINCT,UNIONTOPGROUP BY HAVING语句的视图中插入数据。
  13. 如果在创建视图的CREATE VIEW语句中使用了WITH CHECK OPTION ,那么所有对视图进行修改的语句必须符合WITH CHECK OPTION中限定条件。
  14. 对于由多个基表联接查询而生成的视图来说,一次插入操作只能作用于一个基表上。
  15. 在视图中更新数据与在基表中更新数据一样,使用UPDATE语句。
  16. 但是当视图是来自多个基表中的数据时,与插入操作一样,每次更新操作只能更新一个基表中的数据,
  17. 如果通过视图修改存在于多个基表中的数据时,则对不同的基表要分别使用UPDATE语句来实现。
  18. 在视图中使用UPDATE语句进行更新操作也受到与插入操作一样的限制。
  19. 当一个视图联接了两个以上的基表时,对数据的删除操作则不允许的

mysql数据库总结笔记的更多相关文章

  1. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  2. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. Mysql数据库学习笔记之数据库索引(index)

    什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...

  5. MYSQL数据库学习笔记1

      MYSQL数据库学习笔记1 数据库概念 关系数据库 常见数据库软件 SQL SQL的概念 SQL语言分类 数据库操作 创建数据库 查看数据库的定义 删除数据库 修改数据库 创建表 数据类型 约束 ...

  6. MySQL数据库学习笔记(四)----MySQL聚合函数、控制流程函数(含navicat软件的介绍)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. MySQL数据库学习笔记(三)----基本的SQL语句

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  8. MySQL数据库入门笔记

    2 数据库入门 2.1引入 数据保存到内存: 优点: 1)读写非常快 缺点: 1)程序关闭导致数据丢失 数据保存到文件: 优点: 1)数据可以永久保存 缺点: 1)频繁地IO操作,效率不高! 2)数据 ...

  9. mysql 数据库学习笔记一

    一.navicat的引入: (第三方可视化的客户端,方便MySQL数据库的管理和维护)安装网址:https://www.navicat.com.cn/ NavicatTM是一套快速.可靠并价格相宜的数 ...

  10. MySql数据库学习笔记(1)

    MySql数据库 下载地址 https://dev.mysql.com/downloads/mysql/5.1.html#downloads 连接到本机上的MYSQL mysql -u root -p ...

随机推荐

  1. CF1036F

    考虑这种一堆数字\(gcd = k\) 有经典做法. 考虑设\(f(x)\)为\(gcd\)是\(x\)的倍数的方案数. \(g(x)\)为\(gcd\)刚好为\(x\)的方案数. 则有 \(f(x) ...

  2. 洛谷 P3644 [APIO2015]八邻旁之桥(对顶堆维护中位数)

    题面传送门 题意: 一条河将大地分为 \(A,B\) 两个部分.两部分均可视为一根数轴. 有 \(n\) 名工人,第 \(i\) 名的家在 \(x_i\) 区域的 \(a_i\) 位置,公司在 \(y ...

  3. Codeforces 917D - Stranger Trees(矩阵树定理/推式子+组合意义)

    Codeforces 题目传送门 & 洛谷题目传送门 刚好看到 wjz 在做这题,心想这题之前好像省选前做过,当时觉得是道挺不错的题,为啥没写题解呢?于是就过来补了,由此可见我真是个大鸽子(( ...

  4. Matlab矢量图图例函数quiverkey

    Matlab自带函数中不包含构造 quiver 函数注释过程,本文参照 matplotlib 中 quiverkey 函数,构造类似函数为 Matlab 中 quiver 矢量场进行标注. quive ...

  5. Docker实用命令介绍

    Docker实用命令介绍 1. docker启动.关闭.停止 ╭─wil-xz in ~ 12:15:44 ╰─٩(ŏ﹏ŏ.)۶ service docker restart Redirecting ...

  6. 12-Add Digits

    寻找一个数的数根,用了暴力破解的方式,时间复杂度比较高 暂未想到O(1)的方式 Given a non-negative integer num, repeatedly add all its dig ...

  7. SpringBoot整合Shiro 三:整合Mybatis

    搭建环境见: SpringBoot整合Shiro 一:搭建环境 shiro配置类见: SpringBoot整合Shiro 二:Shiro配置类 整合Mybatis 添加Maven依赖 mysql.dr ...

  8. A Child's History of England.29

    You have not forgotten the New Forest which the Conqueror made, and which the miserable people whose ...

  9. EDA简介

    Electronic design automation (EDA), also referred to as electronic computer-aided design (ECAD),[1] ...

  10. Oracle—数据库名、数据库实例名、数据库域名、数据库服务名的区别

    Oracle-数据库名.数据库实例名.数据库域名.数据库服务名的区别 一.数据库名 1.什么是数据库名       数据库名就是一个数据库的标识,就像人的身份证号一样.他用参数DB_NAME表示,如果 ...