CREATETABLE TEST( City varchar(10) PRIMARY KEY, Age intPRIMARY KEY );
CREATETABLE TEST( Name varchar(10), Age int, CONSTRAINT PK_TEST PRIMARY KEY(Name,Age) );
CREATETABLE TEST( Idx serial PRIMARY KEY, Name varchar(10), Age int );
Foreign Key Constraint 为了成功创建外键,以下条件必须满足:
引用的表(在 REFERENCES 后面指定的表)必须已经存在。
被引用的字段必须是父表的主键或具有唯一性约束。
数据类型必须兼容,即外键字段和被引用字段的类型必须相同或可转换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
CREATETABLE parent_table ( id SERIAL PRIMARY KEY, name VARCHAR(10) )
CREATETABLE child_table ( id SERIAL PRIMARY KEY, name VARCHAR(10), parent_id INTEGER, FOREIGN KEY (parent_id) REFERENCES parent_table(id) ); -- ON DELETE CASCADE ALTERTABLE child_table ADDCONSTRAINT fk_parent_id FOREIGN KEY (parent_id) REFERENCES parent_table(id) ONDELETE CASCADE;
在 SQL 中,特别是像 MySQL 和 PostgreSQL 这样的关系型数据库管理系统中,外键不仅提供了数据完整性,还可以配置不同的行为,例如 ON DELETE 和 ON UPDATE 规则,来决定当父表中的记录被删除或更新时,子表中的关联记录应该如何处理,常见的 ON DELETE 和 ON UPDATE 规则包括:
RESTRICT 或 NO ACTION 这是默认行为。如果尝试删除或更新主表中的记录,而子表中存在依赖这个记录的外键,那么操作会被阻止。这确保了参照完整性,防止了意外的数据丢失。
-- BETWEEN AND 限制列值范围 SELECT* FROM STUDENT WHERE BirthDay BETWEEN ‘2000-01-01’ AND ‘2000-12-30’;
-- LIKE 通配符'_'代表一个字符'%'代表一个或多个字符 SELECT* FROM STUDENT WHERE Email LIKE'%@163.com';
-- AND\OR\NOT 逻辑运算符 SELECT StudentID, StudentName, StudentGender, Major FROM STUDENT WHERE Major='软件工程'AND StudentGender='男';
-- IN 限定范围 SELECT StudentID, StudentName, StudentGender, Major FROM STUDENT WHERE Major IN ('CS','SE');
-- ORDER BY <> ASC/DESC 默认升序ASC -- 多个列排序时,只有当前列相同时才会比较下一列 SELECT* FROM STUDENT ORDERBY Birthday DESC , StudentName ASC;
-- 内置函数 SELECT COUNT(*) AS 学生人数 FROM Student;
SELECT Min(Birthday) AS 最大年龄,Max(Birthday) AS 最小年龄 FROM Student;
-- GROUP BY <> HAVING -- 专业统计STUDENT表中男生人数,但限定只显示人数大于2的人数 SELECT Major AS 专业, COUNT(StudentID) AS 学生人数 FROM Student WHERE StudentGender=’男’ GROUPBY Major HAVINGCOUNT(*)>2;
多表关联查询
子查询
1 2 3 4 5 6
SELECT TeacherID, TeacherName, TeacherTitle FROM Teacher WHERE CollegeID IN (SELECT CollegeID FROM College WHERE CollegeName='计算机学院');
SELECT B.CollegeName AS 学院名称, A.TeacherID AS 编号, A.TeacherName AS 姓名, A.TeacherGender AS 性别, A. TeacherTitle AS 职称 FROM Teacher AS A,College AS B WHERE A.CollegeID=B.CollegeID ORDERBY B.CollegeName, A.TeacherID;
-- JOIN ON 内连接 SELECT B.CollegeName AS 学院名称, A.TeacherID AS 编号, A.TeacherName AS 姓名, A.TeacherGender AS 性别, A. TeacherTitle AS 职称 FROM TEACHER AS A JOIN COLLEGE AS B ON A.CollegeID=B.CollegeID ORDERBY B.CollegeName, A.TeacherID;
-- LEFT JOIN/RIGHT JOIN/FULL JOIN 外连接 SELECT C.CourseName AS 课程名称, T.TeacherName AS 教师,COUNT (R.CoursePlanID) AS 选课人数 FROM COURSE AS C JOIN PLAN AS P ON C.CourseID=P.CourseID JOIN TEACHER AS T ON P.TeacherID=T.TeacherID LEFTJOIN REGISTER AS R ON P.CoursePlanID=R.CoursePlanID GROUPBY C.CourseName, T.TeacherName;