该博文转载(https://www.cnblogs.com/whwh/p/16200066.html)

一、安装和配置数据库:

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

二、连接数据库的方式:

1、连接本地数据库:

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

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

2、navicat连接数据库:

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

三、关于数据库的操作

查看当前所有的数据库:show databases;
mysql、information_schema、perfermance_schema、sys这四个是系统自带的数据库,不用动它。
创建数据库:create database 数据库名;
e.g create database mydb;
打开数据库:use 数据库名;
e.g use mydb;
删除数据库:drop database 数据库名;
e.g drop database mydb;
查看单个数据库信息: show create database 数据库名;
e.g show create database mydb;
查看系统支持的存储引擎类型:
SHOW ENGINES;

四、关于表的操作

1、创建表

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

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

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

2、查看表

1)查看表结构

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

2)查看表详细结构

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

3)查看所有的表

show tables;

3、修改表结构

1)修改表名

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

2)增加字段

-- 语法:ALTER TABLE 表名 ADD 新字段名 数据类型 [完整性约束条件];

-- 增加一个字段
ALTER TABLE student ADD motor varchar(30) DEFAULT 'cb300r'; -- 增加多个字段
ALTER TABLE teacher ADD motor varchar(30) DEFAULT 'cb500r',
ADD car varchar(30) DEFAULT 'BMW7'; -- 增加字段到第一项
ALTER TABLE score ADD semester varchar(30) DEFAULT '2021' FIRST; -- 增加新字段到指定字段之后
ALTER TABLE student ADD salary int DEFAULT 1000 AFTER ssex;

3)删除字段

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

4)修改字段类型和名称

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

4、删除表

-- 语法:DROP TABLE 表名;
DROP TABLE ts;

五、表记录相关操作

1、添加表记录

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

2、删除表记录

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

3、修改表记录

-- 语法:UPDATE 表名 SET 关系式 (WHERE 条件);
-- 改单个记录
UPDATE student SET ssex='女'
WHERE sname='张丽'; -- 改多个记录
UPDATE sc SET degree=0
WHERE sno IN (
SELECT sno
FROM student
WHERE sdept='计算机工程系'
); -- 改单个记录多项
UPDATE student SET ssex='女', capital=300000
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;

      SELECT sname, ssex, YEAR(CURRENT_DATE)-YEAR(sbirthday) as age
    FROM student
    WHERE YEAR(CURRENT_DATE)-YEAR(sbirthday) != 33;
    ```
  • 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;

      SELECT sname, ssex, YEAR(CURRENT_DATE)-YEAR(sbirthday) as age
    FROM student
    WHERE YEAR(CURRENT_DATE)-YEAR(sbirthday) NOT BETWEEN 30 AND 33;
    ```
  • 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 '%数学%';

      SELECT *
    FROM student
    WHERE ssex='女' OR ssex='男';
    ```

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;

	SELECT *
FROM student
WHERE ssex='女'
ORDER BY sbirthday
LIMIT 1;
```

1、通配符:

	1、%:任意多个字符
1)以什么开头的模糊查询
SELECT *
FROM student
WHERE sdept LIKE '信%'; 2)以什么结尾的模糊查询
SELECT *
FROM student
WHERE saddress LIKE '%州'; 3)包含有什么字段的模板查询
SELECT *
FROM student
WHERE sdept LIKE '%程%'; 2、_:单个字符
SELECT *
FROM student
WHERE sname LIKE '王_'; SELECT *
FROM student
WHERE sname LIKE '王%';

2、正则表达式:

	1、^以什么开头
SELECT *
FROM student
WHERE sname REGEXP '^王'; 2、$以什么结尾
SELECT *
FROM student
WHERE speciality REGEXP '务$'; 3、.匹配任意单字符(不支持中文,仅支持数字和字母字符串)
SELECT *
FROM student
WHERE sno REGEXP '2.050301'; 4、*匹配任意个前面的字符串(不生效)
SELECT *
FROM student
WHERE sno REGEXP '2*50301'; SELECT *
FROM student
WHERE sno REGEXP '2*5*'; 5、+匹配前面的字符1次或多次
SELECT *
FROM student
WHERE sbirthday REGEXP '198+-0'; SELECT *
FROM student
WHERE sno REGEXP '20+303'; 6、匹配指定字符串文本
SELECT *
FROM student
WHERE sdept REGEXP '机工'; 7、[]匹配字符串集合中任意一个字符(中文无法过滤,仅支持数字和字母字符串)
SELECT *
FROM sc
WHERE cno REGEXP '[13]'; 8、[^]匹配不在括号内的任何字符(没有发生作用) 9、字符串{n}匹配前面的字符串至少n次(不支持中文,仅支持数字和字母字符串)
SELECT *
FROM student
WHERE sno REGEXP '21{3}'; 10、字符串{m,n}匹配前面的字符串至少m次,至多n次
SELECT *
FROM student
WHERE sno REGEXP '21{4,7}'; SELECT *
FROM student
WHERE sno REGEXP '21{5,7}';

七、多表连接查询

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

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

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

1、交叉连接

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

(1)语法格式:

方法一:
SELECT <字段名>
FROM <表1> CROSS JOIN <表2>;
方法二:
SELECT <字段名>
FROM <表1>, <表2>;

(2)示例:

SELECT * FROM student CROSS JOIN sc;
SELECT * FROM student, sc;

2、内连接

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

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

- INNER JOIN 关键字连接两张表

- ON 子句来设置连接条件

(1)语法格式:

方法一:
SELECT <字段名>
FROM <表1> INNER JOIN <表2>
ON <连接条件表达式>;
方法二:
SELECT <字段名>
FROM <表1>, <表2>
where <连接条件>;

(2)示例:

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

(3)多表连接查询

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

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

3、自连接

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

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

(1)语法格式:

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

(2)示例:

-- 查询同时选修C01和C04课程的学生学号
SELECT A.sno
FROM sc A, sc B
WHERE A.sno=B.sno AND A.cno='C01' AND B.cno='C04'; -- 查询与 王智刚 同在一个系的学生的学号、姓名、系
SELECT stu2.sno, stu2.sname, stu2.sdept
FROM student stu1, student stu2
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)语法格式:

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

(2)示例:

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

(3)数据库不支持FULL JOIN

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

SELECT * FROM sc
LEFT JOIN course ON course.cno=sc.cno
UNION ALL
SELECT * FROM sc
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)子查询返回单个值

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

-- 平均年龄
SELECT AVG(YEAR(CURDATE()) - YEAR(sbirthday))
FROM student;
-- 结果:25 -- 查询所有年龄大于25的学生姓名
SELECT *
FROM student
WHERE YEAR(CURDATE()) - YEAR(sbirthday) > 25; -- 查询所有年龄大于平均年龄的学生姓名
SELECT *
FROM student
WHERE YEAR(CURDATE()) - YEAR(sbirthday) > (SELECT AVG(YEAR(CURDATE()) - YEAR(sbirthday)) FROM student);

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

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

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

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

  • ANY和SOME关键字是同义词。
  • ANY和ALL操作符都必须与比较运算符一起使用。
  • 常用的比较运算符:>,<,>=,<=,=,!=,<>
# 查询其他系中比数学系某一学生年龄大的学生姓名和年龄  ANY
select YEAR(CURDATE()) - YEAR(sbirthday)
FROM student
where sdept='数学系'; select sname, YEAR(CURDATE()) - YEAR(sbirthday) as age
from student
where YEAR(CURDATE()) - YEAR(sbirthday) > ANY(
select YEAR(CURDATE()) - YEAR(sbirthday)
FROM student
where sdept='数学系'
) AND sdept!='数学系'; # 查询其他系中比数学系全部学生年龄大的学生姓名和年龄
select sname, YEAR(CURDATE()) - YEAR(sbirthday) as age
from student
where YEAR(CURDATE()) - YEAR(sbirthday) > ALL(
select YEAR(CURDATE()) - YEAR(sbirthday)
FROM student
where sdept='数学系'
) AND sdept!='数学系';

2、相关子查询

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

执行过程:

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

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

-- 查询所有选修C01课程的学生姓名
select sname from student
where EXISTS (
select * from sc
where sno=student.sno AND cno='C01'
); -- 查询选修了全部课程的学生姓名。
SELECT sname FROM student
WHERE NOT EXISTS
(SELECT * FROM course
WHERE NOT EXISTS
(SELECT * FROM sc
WHERE sno=student.sno AND cno=course.cno));

九、集合查询

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

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

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

十、索引

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

1、关于索引

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

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

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

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

以下情况适合创建索引:

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

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

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

语法形式:
create table 表名(
  属性名 数据类型,
  ……
  index|key [索引名](属性名1 [长度] [ASC|DESC])
) 示例:
create table t_dept(
deptno int,
dname varchar(20),
location varchar(40),
index index_deptno(deptno)
);

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

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

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

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

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

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

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

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

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

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

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

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

8、删除索引

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

语法形式:
drop index 索引名 on 表名;
示例:
drop index index_deptno on t_dept;
drop index index_dname on t_dept;

9、索引改名

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

-- 语法:
ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name;
-- 示例:
ALTER TABLE workinfo RENAME INDEX index_t TO index_taddress;

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

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

十一、视图

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

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

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

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

1、视图常用操作:

(1)筛选表中的行。

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

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

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

2、视图优点

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

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

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

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

3、创建视图

语法:

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

例子:

-- 查询其他系中比数学系全部学生年龄大的学生姓名和年龄
select sname, YEAR(CURDATE()) - YEAR(sbirthday) as age
from student
where YEAR(CURDATE()) - YEAR(sbirthday) > ALL(
select YEAR(CURDATE()) - YEAR(sbirthday)
FROM student
where sdept='数学系'
) AND sdept!='数学系'; -- 定义视图(保存上面查询语句的结果)
create view stu_older_info
AS
select sname, YEAR(CURDATE()) - YEAR(sbirthday) as age
from student
where YEAR(CURDATE()) - YEAR(sbirthday) > ALL(
select YEAR(CURDATE()) - YEAR(sbirthday)
FROM student
where sdept='数学系'
) AND sdept!='数学系'; -- 查询视图数据
SELECT * FROM stu_older_info;
SELECT * FROM stu_older_info WHERE age=33; -- 视图的查询跟查询数据表一样可以条件查询 及其他各种查询方式

4、修改视图

-- 语法:alter view 视图名称 as 修改后的查询语句;
-- 示例:
ALTER VIEW stu_no
AS
SELECT *
FROM sc
WHERE degree > ANY(
SELECT degree FROM sc where sno='20050301'
) AND sno!='20050301'; SELECT * FROM stu_no;

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

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

5、删除视图

-- 语法:drop view 视图名称
-- 示例:
drop view stu_no;

6、查看视图信息

1)使用DESCRIBE查看视图

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

-- DESCRIBE语句的语法格式如下所示:
DESCRIBE 视图名;
-- 或简写为:
DESC 视图名; -- 示例:
desc stu_older_info;

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

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

-- 语法:
SHOW TABLE STATUS LIKE '视图名称';
-- 示例
SHOW TABLE STATUS LIKE 'stu_older_info';

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

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

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

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

SHOW CREATE VIEW stu_older_info;

7、通过视图更新数据

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

8、注意事项

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

Mysql数据库安装到操作到应用的更多相关文章

  1. PHP对MySQL数据库的相关操作

    一.Apache服务器的安装 <1>安装版(计算机相关专业所用软件---百度云链接下载)-直接install<2>非安装版(https://www.apachehaus.com ...

  2. (三)—Linux文件传输与mysql数据库安装

    文件传输工具使用    为了速成,关于linux系统的学习都先放一放,用到哪个知识点就查哪个,这里想在linux下装一些服务练练手,最先想到的就是装个mysql数据库试试. 因为我用的是虚拟机下的li ...

  3. MySql数据库安装

    MySql数据库安装 一丶数据库 什么是数据库 数据库简单连接就是存储数据的容器. 而库则是一组容器合成的东西. 也就是存储数据的.我们编程中常常会用到数据库. 什么是数据管理系统 数据库管理系统就是 ...

  4. 第二百七十五节,MySQL数据库安装和介绍

    MySQL数据库安装 一.概述 1.什么是数据库 ? 答:数据的仓库,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 答:他们均是一种 ...

  5. mysql数据库安装与卸载以及Navicat安装

    关系型数据库Mysql 1.mysql官网网址:www.mysql.org 2.mysql数据库安装 傻瓜式安装下载地址 https://dev.mysql.com/downloads/install ...

  6. 01 MySQL数据库安装(Windows+Mac)

    目录 MySQL数据库安装 Windows 1.主要版本简介 2.软件下载 3.文件目录简介 4.使用 4.1配置环境变量 4.2登录 制作MySQL服务端开机自启动 运行MySQL 4.3 密码修改 ...

  7. python操作mysql数据库的相关操作实例

    python操作mysql数据库的相关操作实例 # -*- coding: utf-8 -*- #python operate mysql database import MySQLdb #数据库名称 ...

  8. [mysql]brew 安装 配置 操作 mysql(中文问题)

    mac 下卸载mysqldmg mac下mysql的DMG格式安装内有安装文件,却没有卸载文件--很郁闷的事. 网上搜了一下,发现给的方法原来得手动去删. 很多文章记述要删的文件不完整,后来在stac ...

  9. linux系统上Mysql数据库导入导出操作

    需求:把MySQL数据库目录中的dz数据库备份到/home/dz_bak.sql ,然后再新建一个数据库dzbak,最后把/home/dz_bak.sql 导入到数据库dzbak中.操作如下:以下操作 ...

随机推荐

  1. Vscode个性化设置:让一个小萌妹陪你敲代码

    前言 大家平时都用什么代码编辑器啊!我个人比较喜欢用vscode,因为有以下几点: 开源,免费: 自定义配置 集成git 智能提示强大 支持各种文件格式(html/jade/css/less/sass ...

  2. nodeJS与MySQL实现分页数据以及倒序数据

    大家在做项目时肯定会遇到列表类的数据,如果在前台一下子展示,速度肯定很慢,那么我们可以分页展示,比如说100条数据,每10条一页,在需要的时候加载一页,这样速度肯定会变快了.那么这里我给大家介绍如何在 ...

  3. SAP 定义用户组

    SUGR,可进行创建.查看.删除等维护性操作,并可指定本组的用户

  4. kali 无线网络渗透测试

    一.无线网络渗透嗅探工具Kismet 如果要进行无线网络渗透测试,则必须先扫描所有有效的无线接入点.在Kali linux中,提供了一款嗅探无线网络工具Kismet.使用该工具可以测量周围的无线信号, ...

  5. Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现

    前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...

  6. win10设置Python程序定时运行(设置计划任务)

    今天来设置一下定时执行Pycharm内的脚本: 这个要基于win10 的任务计划程序(设置 > 控制面板 > 系统和安全 > 管理工具 > 任务计划程序) 1. create ...

  7. 【前端面试】Vue面试题总结(持续更新中)

    Vue面试题总结(持续更新中) 题目参考链接 https://blog.csdn.net/weixin_45257157/article/details/106215158 由于已经有很多前辈深造VU ...

  8. 第二十天python3 正则表达式

    正则表达式 Regular Expression,缩写为regex.regexp.RE等:分类 1.BRE 基本正则表达式,grep.sed.vi等软件支持,vim有扩展: 2.ERE 扩展正则表达式 ...

  9. TFRecord的Shuffle、划分和读取

    对数据集的shuffle处理需要设置相应的buffer_size参数,相当于需要将相应数目的样本读入内存,且这部分内存会在训练过程中一直保持占用.完全的shuffle需要将整个数据集读入内存,这在大规 ...

  10. Kafka与Spark案例实践

    1.概述 Kafka系统的灵活多变,让它拥有丰富的拓展性,可以与第三方套件很方便的对接.例如,实时计算引擎Spark.接下来通过一个完整案例,运用Kafka和Spark来合理完成. 2.内容 2.1 ...