创建数据库
DROP DATABASE if EXISTS doctor_patient;
CREATE DATABASE doctor_patient CHARACTER SET utf8;
如何数据库中存有中文,记得加CHARACTER SET utf8
创建视图
DROP VIEW IF EXISTS medical;
CREATE VIEW medical AS
SELECT doctor.no, doctor.name as doctor_name, patient.name as patient_name, description
from doctor, patient, medical_history
WHERE medical_history.doctor_no = doctor.no
and medical_history.patient_no = patient.no;
注意select那里,可能会报错重复定义,使用as
可以解决,像doctor.name as doctor_name
注意:创建表时要加AS
create view xxxx as
在派生出的表上进一步查询
比如,求出总成绩最高的学生,首先需要求一个总成绩的表,然后从中在查出总成绩最高的记录。
这里注意:派生出的表需要起别名(比如下面程序中的table1
)才能进一步查询。
注意还有一个更坑的问题:在不使用group by 并且select后面出现聚集函数时,那么所有被select的属性都应该是聚集函数,否则就会报错
下面会报错:
-- (17) 查询计算机系考试成绩最高的学生姓名。
SELECT name_temp, MAX(grade_temp)
FROM (
SELECT Student.Sname as name_temp, SUM(SC.Grade) as grade_temp
FROM Student, SC
WHERE Student.Sdept='计算机' and Student.Sno=SC.Sno
GROUP BY Student.Sname
) table1; -- table1 是别名,是必须有的
原因是name_temp
不是聚集函数,而MAX(grade_temp)
是。
真实的原因是,嵌套中不能使用聚合函数,只有最外层可以使用聚合函数。
求数量
-- (22) 创建内容为统计每个学生的选课门数的视图,要求列出学生学号和选课门数;
CREATE VIEW view22 AS
SELECT Sno, COUNT(Cno)
FROM SC
GROUP BY Sno;
这里一脸懵逼,之前看的不是select后面聚合函数不能和直接的属性一起用吗?怎么这里可以????哦哦前面说过,有个条件是不适用group by,这里使用了,所以没事。
建表
使用枚举类型
-- 订单表
CREATE TABLE order_form(
id INT AUTO_INCREMENT,
state ENUM('待付款', '待发货', '运输中', '待签收') DEFAULT '待付款',
PRIMARY KEY(id)
);