MySQL(多表查询 索引 事务 视图)

约束

生活中的约束的意思:
	一种束缚,一种规则,一种限定,是你感觉不够自由

数据库中的约束:
	对我们的字段的值,进行一种规则方面的限定
	例如,这个字段的值,必须唯一,不能为null 等等

MySQL中常见的几种约束
    主键约束 primary key
    自增长约束 AUTO_INCREMENT
    非空约束 not null
    唯一约束 unique 
    外键约束 foreign key
    非负约束 unsigned
    ENUM 枚举类型,能起到约束的作用

主键约束

#主键约束 primary key 特点 非空且唯一
#而且我们强烈建议一张表中,必须要有主键
#一张表只能有有一个主键 可以是复合主键

方式一 建表时添加主键约束
#字段名称 字段类型 primary key
CREATE TABLE student(
	id INT PRIMARY KEY,
	username VARCHAR(32),
	age INT);
	
方式二 建表时添加主键约束
#primary key(字段1,字段2)
CREATE TABLE student(
	id INT,
	username VARCHAR(32),
	age INT,
	PRIMARY KEY(id));
	
方式三 建表后添加主键约束
#alter table 表名 
#	add primary key(字段名1,字段名2..);
CREATE TABLE student(
	id INT,
	username VARCHAR(32),
	age INT);
ALTER TABLE student
	ADD PRIMARY KEY(id);

方式四 联合主键 
把多个字段当做一个整体设置为主键
CREATE TABLE student(
	id INT,
	username VARCHAR(32),
	age INT);		
ALTER TABLE student 
	ADD PRIMARY KEY(id,username)
	
删除主键约束:
情况1: 这个字段,只有主键约束,分两步来删除主键约束
    第一步:这样只删除了唯一,他还有个非空约束,所以得再删除非空约束
    	alter table 表名 drop primary key;
    第二步:修改字段名还为原来的字段 加上null即可
    	alter table 表名 modify 列名 varchar(20) null;
    	
情况2: 这个字段,是一个int类型字段,既有主键约束,又有自增长约束,那么得先删除自增长约束,在删除主键约束
	第一步:删除自增长约束,其实就是修改自增长字段名和数据类型还为原来的字段名和类型
		alter table 表名 change 字段名 字段名 数据类型; #删除自增长约束
	第二步:删除主键约束
		alter table 表名 drop primary key;
	第三步:删除非空约束
		ALTER TABLE 表名 MODIFY 列名 INT NULL; #就是修改字段值可以为null	

自增长约束

#自增长约束 AUTO_INCREMENT
#配合主键约束一块来用 并且针对整数型的字段
1.被修饰的字段类型支持自增 一般int
2.自增长也可以单独使用(配合unique)
3.被修饰的字段必须是一个key 一般是primary key
4.自增长默认从1开始
    -- 修改默认的自增长开始值
    ALTER TABLE 表名 AUTO_INCREMENT = 起始值;
5.如果添加数据时 给自增长字段指定值 
  则以指定值为准 按照自增长的规则来添加数据

CREATE TABLE employee(
    #主键自增长
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(32),
	age INT
);	

非空约束

#非空约束 not null 特点:被修饰过的字段非空

create table nn(
    id int not null,
    username varchar(32) not null
);

唯一约束

#唯一约束 unique 对null值不起作用
#一张表可以有多个unique字段

#唯一标识
#字段名称 字段类型 unique
CREATE TABLE teacher(
	id INT PRIMARY KEY,
	username VARCHAR(32) UNIQUE, #唯一约束
	age INT
);

#通过修改表 添加唯一约束
#alter table 表名 add unique(字段1,字段2); 添加的联合唯一
#alter table 表名 add unique(字段1); 给一个添加唯
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的选课系统案例,包括数据库设计和SQL语句实现: 1. 数据库设计 概念结构设计: 该教务系统包括学生、课程、教师和选课四个实体。学生和教师可以通过身份认证登录系统,学生可以选择课程,教师可以添加和删除课程。课程包括课程编号、课程名称和学分等属性。学生和教师都有一个唯一的ID和姓名属性。 逻辑结构设计: 在概念结构的基础上,我们可以使用E-R图来进行逻辑结构设计。我们可以将学生、课程和教师三个实体分别示为三个矩形,然后使用箭头示它们之间的关系,如下图所示: ![E-R图](https://i.imgur.com/V0nW4vJ.png) 物理结构设计: 在逻辑结构的基础上,我们可以将实体和关系转换为关系模式,然后创建。以下是物理结构设计的关系模式: - 学生(Student) - 学生ID(StudentID) - 姓名(Name) - 密码(Password) - 教师(Teacher) - 教师ID(TeacherID) - 姓名(Name) - 密码(Password) - 课程(Course) - 课程编号(CourseID) - 课程名称(CourseName) - 学分(Credit) - 选课(Enrollment) - 学生ID(StudentID) - 课程编号(CourseID) 2. 的创建与插入数据 根据上述设计,我们可以使用以下SQL语句创建: ```sql CREATE TABLE Student ( StudentID INT PRIMARY KEY, Name VARCHAR(50), Password VARCHAR(50) ); CREATE TABLE Teacher ( TeacherID INT PRIMARY KEY, Name VARCHAR(50), Password VARCHAR(50) ); CREATE TABLE Course ( CourseID INT PRIMARY KEY, CourseName VARCHAR(50), Credit INT ); CREATE TABLE Enrollment ( StudentID INT, CourseID INT, PRIMARY KEY(StudentID, CourseID), FOREIGN KEY(StudentID) REFERENCES Student(StudentID), FOREIGN KEY(CourseID) REFERENCES Course(CourseID) ); ``` 然后可以使用以下SQL语句向中插入数据: ```sql INSERT INTO Student (StudentID, Name, Password) VALUES (1, '张三', '123456'); INSERT INTO Student (StudentID, Name, Password) VALUES (2, '李四', '654321'); INSERT INTO Teacher (TeacherID, Name, Password) VALUES (1, '王老师', '123456'); INSERT INTO Teacher (TeacherID, Name, Password) VALUES (2, '李老师', '654321'); INSERT INTO Course (CourseID, CourseName, Credit) VALUES (1, '数据库系统', 3); INSERT INTO Course (CourseID, CourseName, Credit) VALUES (2, '计算机网络', 4); INSERT INTO Enrollment (StudentID, CourseID) VALUES (1, 1); INSERT INTO Enrollment (StudentID, CourseID) VALUES (1, 2); INSERT INTO Enrollment (StudentID, CourseID) VALUES (2, 1); ``` 3. 数据操纵 单查询: 我们可以使用SELECT语句进行单查询,例如: ```sql SELECT * FROM Student; ``` 这将返回学生中的所有记录。 多表查询: 我们可以使用JOIN语句进行多表查询,例如: ```sql SELECT Student.Name, Course.CourseName FROM Enrollment JOIN Student ON Enrollment.StudentID = Student.StudentID JOIN Course ON Enrollment.CourseID = Course.CourseID; ``` 这将返回所有选了某门课程的学生姓名和课程名称。 排序汇总: 我们可以使用ORDER BY和GROUP BY语句进行排序和汇总,例如: ```sql SELECT CourseID, COUNT(*) AS Enrollments FROM Enrollment GROUP BY CourseID ORDER BY Enrollments DESC; ``` 这将返回每门课程的选课人数,并按照选课人数从高到低排序。 定义视图查询视图: 我们可以使用CREATE VIEW语句定义视图,例如: ```sql CREATE VIEW CourseEnrollment AS SELECT Course.CourseName, COUNT(*) AS Enrollments FROM Enrollment JOIN Course ON Enrollment.CourseID = Course.CourseID GROUP BY Course.CourseName; ``` 这将创建一个名为CourseEnrollment的视图,它将返回每门课程的选课人数。 我们可以使用SELECT语句查询视图,例如: ```sql SELECT * FROM CourseEnrollment; ``` 这将返回CourseEnrollment视图中的所有记录。 索引: 我们可以使用CREATE INDEX语句创建索引,例如: ```sql CREATE INDEX idx_StudentID ON Enrollment(StudentID); ``` 这将在学生ID列上创建一个索引,以优化查询。 存储过程存储与调用: 我们可以使用CREATE PROCEDURE语句创建存储过程,例如: ```sql CREATE PROCEDURE GetAllStudents() BEGIN SELECT * FROM Student; END; ``` 这将创建一个名为GetAllStudents的存储过程,它将返回学生中的所有记录。 我们可以使用CALL语句调用存储过程,例如: ```sql CALL GetAllStudents(); ``` 这将调用GetAllStudents存储过程,并返回学生中的所有记录。 存储函数定义及调用: 我们可以使用CREATE FUNCTION语句创建存储函数,例如: ```sql CREATE FUNCTION GetEnrollmentsByCourseID(course_id INT) RETURNS INT BEGIN DECLARE enrollments INT; SELECT COUNT(*) INTO enrollments FROM Enrollment WHERE CourseID = course_id; RETURN enrollments; END; ``` 这将创建一个名为GetEnrollmentsByCourseID的存储函数,它将返回指定课程的选课人数。 我们可以使用SELECT语句调用存储函数,例如: ```sql SELECT GetEnrollmentsByCourseID(1); ``` 这将返回课程编号为1的课程的选课人数。 触发器: 我们可以使用CREATE TRIGGER语句创建触发器,例如: ```sql CREATE TRIGGER AddEnrollment AFTER INSERT ON Enrollment FOR EACH ROW BEGIN UPDATE Course SET Enrollments = Enrollments + 1 WHERE CourseID = NEW.CourseID; END; ``` 这将创建一个名为AddEnrollment的触发器,它将在每次向选课中插入新记录时,更新相应课程的选课人数。 事件: 我们可以使用CREATE EVENT语句创建事件,例如: ```sql CREATE EVENT CleanEnrollments ON SCHEDULE EVERY 1 DAY DO DELETE FROM Enrollment WHERE StudentID = 0; ``` 这将创建一个名为CleanEnrollments的事件,它将在每天执行一次,删除学生ID为0的记录。 事务: 我们可以使用BEGIN、COMMIT和ROLLBACK语句进行事务处理,例如: ```sql BEGIN; UPDATE Course SET Credit = Credit - 1 WHERE CourseID = 1; INSERT INTO Enrollment (StudentID, CourseID) VALUES (1, 1); COMMIT; ``` 这将在一个事务中,将课程1的学分减1,并向学生1的选课中插入一条记录。 数据库用户及权限分配与回收: 我们可以使用CREATE USER和GRANT语句创建用户并分配权限,例如: ```sql CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpassword'; GRANT SELECT ON Student TO 'testuser'@'localhost'; ``` 这将创建一个名为testuser的用户,并将学生的SELECT权限分配给它。 我们可以使用REVOKE语句回收用户的权限,例如: ```sql REVOKE SELECT ON Student FROM 'testuser'@'localhost'; ``` 这将回收testuser在学生上的SELECT权限。 恢复与备份,导出与导入: 我们可以使用mysqldump命令将数据库备份到文件中,例如: ``` mysqldump -u root -p mydatabase > mydatabase.sql ``` 这将将名为mydatabase的数据库备份到名为mydatabase.sql的文件中。 我们可以使用mysql命令将备份文件导入到数据库中,例如: ``` mysql -u root -p mydatabase < mydatabase.sql ``` 这将从名为mydatabase.sql的文件中导入数据到名为mydatabase的数据库中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值