SQL_STUDY:10.SQL SELECT INTO 语句和SQL CHECK 约束

本文详细介绍了SQL SELECT INTO语句的用法,包括如何创建表的备份副本,以及如何从一个以上的表中选取数据。同时,深入探讨了CHECK约束的概念,包括如何在CREATE TABLE和ALTER TABLE语句中定义和撤销CHECK约束。

摘要
1.SQL SELECT INTO 语句可用于创建表的备份复件。
2.

SQL SELECT INTO 语句

SQL SELECT INTO 语句可用于创建表的备份复件。

SELECT INTO 语句

SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。

SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。

SQL SELECT INTO 语法

您可以把所有的列插入新表:

SELECT *
INTO new_table_name [IN externaldatabase] 
FROM old_tablename

或者只把希望的列插入新表:

SELECT column_name(s)
INTO new_table_name [IN externaldatabase] 
FROM old_tablename

SQL SELECT INTO 实例 - 带有 WHERE 子句

我们也可以添加 WHERE 子句。

下面的例子通过从 “Persons” 表中提取居住在 “Beijing” 的人的信息,创建了一个带有两个列的名为 “Persons_backup” 的表:

SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing'

SQL SELECT INTO 实例 - 被连接的表

从一个以上的表中选取数据也是可以做到的。

下面的例子会创建一个名为 “Persons_Order_Backup” 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:

SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P

SQL CHECK 约束

CHECK 约束用于限制列中的值的范围。

如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

SQL CHECK Constraint on CREATE TABLE

下面的 SQL 在 “Persons” 表创建时为 “Id_P” 列创建 CHECK 约束。CHECK 约束规定 “Id_P” 列必须只包含大于 0 的整数。
MYSQL

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)

SQL CHECK Constraint on ALTER TABLE

如果在表已存在的情况下为 “Id_P” 列创建 CHECK 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CHECK (Id_P>0)

如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')

撤销 CHECK 约束

如需撤销 CHECK 约束,请使用下面的 SQL:
SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT chk_Person

MySQL:

ALTER TABLE Persons
DROP CHECK chk_Person
from urllib import request import mysql from flask import Flask, render_template, request, redirect, url_for, render_template, redirect, jsonify coding="utf-8" # 正确连接示例(参考引用[3]) from flask import Flask from mysql.connector import Error, errorcode app = Flask(__name__) def get_db_connection(): try: return mysql.connector.connect( user='study', password='root', # 使用环境变量更安全 host='localhost', database='one', auth_plugin='mysql_native_password' # 解决认证协议问题 ) except Error as err: if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: app.logger.error("数据库凭证无效") elif err.errno == errorcode.CR_CONN_HOST_ERROR: app.logger.error("数据库服务未启动") raise RuntimeError("数据库连接失败") from err @app.route('/') def index(): try: db = get_db_connection() # 数据库操作... except RuntimeError as e: return str(e), 500 app = Flask(__name__) students = [ {'name': '张小明', 'chinese': 92, 'math': 88, 'english': 85, 'physics': 90, 'chemistry': 87}, {'name': '李小红', 'chinese': 88, 'math': 95, 'english': 92, 'physics': 86, 'chemistry': 90}, {'name': '王大华', 'chinese': 78, 'math': 82, 'english': 75, 'physics': 80, 'chemistry': 77}, {'name': '刘美丽', 'chinese': 95, 'math': 90, 'english': 93, 'physics': 91, 'chemistry': 94}, {'name': '陈志强', 'chinese': 65, 'math': 70, 'english': 68, 'physics': 72, 'chemistry': 66}, {'name': '赵晓燕', 'chinese': 85, 'math': 78, 'english': 82, 'physics': 79, 'chemistry': 83}, {'name': '孙建国', 'chinese': 72, 'math': 75, 'english': 70, 'physics': 74, 'chemistry': 71}, {'name': '周雨桐', 'chinese': 98, 'math': 96, 'english': 94, 'physics': 97, 'chemistry': 95}, ] name = 'admin' password = '123456' @app.route('/', methods=['GET', 'POST']) def hello_world(): error= None if request.method == 'POST': newname = request.form['username'] newwd = request.form['password'] if newname == name and newwd == password: return redirect(url_for('admin_view')) else: error = '用户名或密码错误!' return render_template("index.html", error=error) @app.route('/admin') def admin_view(): return render_template('admin.html', students=students) # 删除 @app.route('/admin', methods=['POST']) def delete_student(student_id, db=None, student=None): try: # 在这里执行删除操作 db.session.delete(student) db.session.commit() return jsonify({'success': True}) except: return jsonify({'success': False, 'message': '删除失败'}) #增加 @app.route('/add', methods=['GET','POST']) def add(): if request.method == 'POST': name = request.form['name'] chinese = request.form['chinese'] math = request.form['math'] english = request.form['english'] physics = request.form['physics'] chemistry = request.form['chemistry'] students.append({ 'name': name, 'chinese':chinese, 'math':math, 'english': english, 'physics':physics, 'chemistry': chemistry }) return render_template('admin.html') else: return "添加失败" return render_template('add.html') if __name__ == '__main__': app.run(debug=True) 改正优化
11-09
-- 1. 首先创建数据库 DROP DATABASE IF EXISTS course_system; CREATE DATABASE course_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE course_system; -- 2. 创建用户表 CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, PASSWORD VARCHAR(255) NOT NULL, real_name VARCHAR(50) NOT NULL, ROLE ENUM('student','teacher','admin') NOT NULL, email VARCHAR(100), create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 3. 创建课程表 CREATE TABLE courses ( course_id INT AUTO_INCREMENT PRIMARY KEY, course_name VARCHAR(100) NOT NULL, DESCRIPTION TEXT, teacher_id INT NOT NULL, category VARCHAR(50), STATUS ENUM('draft','published') DEFAULT 'draft', FOREIGN KEY (teacher_id) REFERENCES users(user_id) ); -- 4. 创建章节与作业表(包含video_duration字段) CREATE TABLE chapters ( chapter_id INT AUTO_INCREMENT PRIMARY KEY, course_id INT NOT NULL, chapter_title VARCHAR(100) NOT NULL, TYPE ENUM('video','text','assignment') DEFAULT 'video', content TEXT, assignment_desc TEXT, assignment_deadline DATETIME, max_score INT DEFAULT 100, sort_order INT DEFAULT 0, video_duration INT DEFAULT 0, FOREIGN KEY (course_id) REFERENCES courses(course_id), CHECK (max_score > 0) ); -- 5. 创建学习与提交记录表 CREATE TABLE study_records ( record_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, chapter_id INT NOT NULL, study_time INT DEFAULT 0, is_completed BOOLEAN DEFAULT FALSE, submit_content TEXT, submit_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, score DECIMAL(5,2), COMMENT TEXT, grade_time DATETIME, FOREIGN KEY (user_id) REFERENCES users(user_id), FOREIGN KEY (chapter_id) REFERENCES chapters(chapter_id), UNIQUE (user_id, chapter_id) ); -- 6. 创建存储过程 DELIMITER // -- 学生选课并初始化学习记录 CREATE PROCEDURE EnrollStudent(IN p_user_id INT, IN p_course_id INT) BEGIN DECLARE v_chapter_id INT; DECLARE done INT DEFAULT FALSE; DECLARE cur CURSOR FOR SELECT chapter_id FROM chapters WHERE course_id = p_course_id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO v_chapter_id; IF done THEN LEAVE read_loop; END IF; -- 使用REPLACE而不是INSERT IGNORE,确保记录存在 REPLACE INTO study_records (user_id, chapter_id, study_time, is_completed) VALUES (p_user_id, v_chapter_id, 0, FALSE); END LOOP; CLOSE cur; -- 返回插入的记录数 SELECT ROW_COUNT() AS records_affected; END // -- 提交作业 CREATE PROCEDURE SubmitAssignment( IN p_user_id INT, IN p_chapter_id INT, IN p_content TEXT ) BEGIN UPDATE study_records SET submit_content = p_content, submit_time = NOW() WHERE user_id = p_user_id AND chapter_id = p_chapter_id; SELECT ROW_COUNT() AS records_updated; END // -- 批改作业 CREATE PROCEDURE GradeAssignment( IN p_user_id INT, IN p_chapter_id INT, IN p_score DECIMAL(5,2), IN p_comment VARCHAR(255) ) BEGIN UPDATE study_records SET score = p_score, COMMENT = p_comment, grade_time = NOW() WHERE user_id = p_user_id AND chapter_id = p_chapter_id; SELECT ROW_COUNT() AS records_updated; END // DELIMITER ; -- 7. 创建触发器 DELIMITER // -- 更新学习记录时自动判断是否完成(视频学习) CREATE TRIGGER tr_check_completion BEFORE UPDATE ON study_records FOR EACH ROW BEGIN DECLARE v_duration INT DEFAULT 0; DECLARE v_type ENUM('video','text','assignment'); SELECT video_duration, TYPE INTO v_duration, v_type FROM chapters WHERE chapter_id = NEW.chapter_id; IF v_type = 'video' AND v_duration > 0 AND NEW.study_time >= v_duration THEN SET NEW.is_completed = TRUE; END IF; END // DELIMITER ; -- 8. 创建视图 -- 学生学习进度视图 CREATE VIEW student_progress AS SELECT u.real_name AS 学生姓名, c.course_name AS 课程名称, COUNT(sr.record_id) AS 已学章节数, SUM(sr.study_time) AS 总学习时长, AVG(sr.is_completed) AS 完成率 FROM users u JOIN study_records sr ON u.user_id = sr.user_id JOIN chapters ch ON sr.chapter_id = ch.chapter_id JOIN courses c ON ch.course_id = c.course_id WHERE u.role = 'student' GROUP BY u.user_id, c.course_id; -- 作业提交情况视图 CREATE VIEW assignment_submission_status AS SELECT ch.chapter_title AS 作业名称, COUNT(sr.record_id) AS 提交人数, AVG(sr.score) AS 平均分 FROM chapters ch LEFT JOIN study_records sr ON ch.chapter_id = sr.chapter_id WHERE ch.type = 'assignment' GROUP BY ch.chapter_id; -- 9. 插入测试数据 -- 插入用户 INSERT INTO users (username, PASSWORD, real_name, ROLE, email) VALUES ('stu1', '123456', '学生一', 'student', 'stu1@edu.com'), ('tea1', '123456', '教师一', 'teacher', 'tea1@edu.com'); -- 插入课程 INSERT INTO courses (course_name, DESCRIPTION, teacher_id, category, STATUS) VALUES ('Python入门', 'Python基础语法', 2, '编程', 'published'); -- 插入章节(包含video_duration) INSERT INTO chapters (course_id, chapter_title, TYPE, content, sort_order, video_duration) VALUES (1, '第一章:Hello World', 'video', 'https://example.com/py1.mp4', 1, 300), (1, '第二章:变量与数据类型', 'text', 'Python中的变量...', 2, 0), (1, '第一次作业', 'assignment', '完成3道基础编程题', 100, 3); -- 10. 测试存储过程触发器 -- 测试选课(先检查存储过程是否正常工作) CALL EnrollStudent(1, 1); -- 验证学习记录是否创建成功 SELECT '验证学习记录创建' AS test_step; SELECT * FROM study_records WHERE user_id = 1; -- 测试作业提交 CALL SubmitAssignment(1, 3, 'test answer'); -- 测试批改作业 CALL GradeAssignment(1, 3, 95, '很好!'); -- 更新学习时长,触发自动完成判断 UPDATE study_records SET study_time = 600 WHERE user_id = 1 AND chapter_id = 1; -- 11. 验证结果 -- 查询学习记录,is_completed应为TRUE(因为600 > 300) SELECT '验证触发器效果' AS test_step; SELECT study_time, is_completed FROM study_records WHERE user_id = 1 AND chapter_id = 1; -- 12. 查看视图数据 SELECT '查看学生进度视图' AS test_step; SELECT * FROM student_progress; SELECT '查看作业提交情况视图' AS test_step; SELECT * FROM assignment_submission_status; 检查这段代码
最新发布
11-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值