#新建表
#使用数据库
USE MYSCHOOL
DROP DATABASE IF EXISTS grade
#删除表
DROP TABLE subject
;
DROP TABLE grade
;
#创建表并添加字段 DEFAULT NULL代表默认值为null
CREATE TABLE subject
(
LoginPwd
VARCHAR(20) NULL,
StudentNo
INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT’学号’,
StudentName
VARCHAR(2000) DEFAULT NULL COMMENT’学生姓名’,
Sex
TINYINT(1) DEFAULT 0 COMMENT’性别,取值0或1’,
Phone
VARCHAR(50) NOT NULL COMMENT’联系电话,可选填’,
Address
VARCHAR(1000)NOT NULL COMMENT’地址,可选填’,
BornDate
DATETIME DEFAULT NULL COMMENT’出生时间’,
GradeId
INT(11) DEFAULT NULL COMMENT’年级编号’,
Email
VARCHAR(50) NOT NULL COMMENT’邮箱账号,可选填’,
IdentityCard
VARCHAR(18) DEFAULT NULL COMMENT’身份证号’
);
CREATE TABLE grade
(
GradeId
INT(11) NULL AUTO_INCREMENT PRIMARY KEY COMMENT’年级编号’,
Gname
INT(11) COMMENT ‘年级’
);
#查看表结构
DESC grade
;
SELECT * FROM subject
;
#向表中添加数据
INSERT INTO grade
(GradeId) VALUES(1);
INSERT INTO grade
(GradeId) VALUES(2);
INSERT INTO grade
(GradeId) VALUES(3);
INSERT INTO subject
(StudentNo,StudentName,Sex,Phone,Address,GradeId,
Email,IdentityCard) VALUES(1011,“郭靖”,1,12522222152,‘襄阳’,1,‘guojing@qq.com’,320324199987755);
INSERT INTO subject
(StudentName,Sex,Phone,Address,
Email,IdentityCard) VALUES(“杨过”,1,12522222153,‘古墓派’,‘guoer@qq.com’,320324199987769);
INSERT INTO subject
(StudentName,Sex,Phone,Address,
Email,IdentityCard) VALUES(“小龙女”,1,12522222154,‘古墓派古墓’,‘longer@qq.com’,320324199987764);
#根据 studentNo修改邮箱和密码
UPDATE subject
SET Email=‘longer1314@qq.com’,LoginPwd=1314520 WHERE StudentNo=1015;
#通过语句添加外键
ALTER TABLE subject
ADD CONSTRAINT KEY_SUBJECT_GRADEID
FOREIGN KEY (GradeId)
REFERENCES grade(GradeId);
增
删
改
#新增的一个年级s1
INSERT INTO grade (GradeId,Gname) VALUES(1,‘S1’);
#如果gradeID的主键没有被subject引用,可以直接删除
DELETE FROM grade WHERE GradeId=4;
#如果gradeID的主键被subject引用,那么
#想要删除GradeId表中的一条记录,必须先更新’subject’表中的外键的值为null,再删除GradeId中的年级
UPDATE subject
SET GradeId=NULL WHERE GradeId=1;
DELETE FROM grade WHERE GradeId=1;
UPDATE subject
SET GradeId=NULL WHERE GradeId=2;
DELETE FROM grade WHERE GradeId=2;
UPDATE subject
SET GradeId=NULL WHERE GradeId=3;
#注册一个学生
INSERT INTO SUBJECT(StudentName,Sex,Phone,Address,GradeId,
Email,IdentityCard) VALUES(“黄蓉”,0,15212345678,“襄阳”,1,‘jinggege520@qq.com’,3201526202132);
#删除grade下面所有的表 删除失败,grade表与student表有主外键关系
TRUNCATE grade;
查
– 查询所有学生表中的所有学生信息
SELECT * FROM student;
– 查询
– 所有学生表中的学生编号 学生名字,学生电话等某个字段的信息
– student,result 中共有StudentNo,所以需要用表名.字段名
– student.StudentNo
找到student表中的StudentNo
字段
– 从student,result表中
SELECT
student.StudentNo
AS 学生编号,StudentName 学生名字,Phone ‘学生 电话’
FROM student,result;
#从成绩表中查询课程编号 DISTINCT去掉重复关键字
SELECT DISTINCT subjectno,studentno FROM result;
#查询学生编号为1000的学生,考试的成绩和考试的时间
SELECT StudentNo,StudentResult,ExamDate FROM result WHERE StudentNo=1000;
#查询郭靖学生的考试的成绩和考试的时间
#SELECT StudentResult,ExamDate FROM result WHERE studentno = 学生编号
#学生编号 SELECT Studentno FROM student WHERE StudentName=‘郭靖’
SELECT StudentResult,ExamDate FROM result WHERE studentno=(SELECT Studentno FROM student WHERE StudentName=‘郭靖’);
#select 列名…from 表名 where 条件
#多个条件的或 用 and (并且) or (或者) 衔接
#查询年级为 大一 的 学生编号 和 学生姓名
#student和grade 有gradeid相关联
#查找studentno, studentname 从 student表中
#条件是gradeid
#从grade中查找年级为大一的年级id
#通过年级id查找学生表中的studentno, studentname
SELECT studentno, studentname FROM student
WHERE gradeid
=(SELECT gradeID FROM grade WHERE gradename=‘大一’)
#查询MySQL版本
SELECT version();
查询 subjectname classhour/10 classhour 从SUBJECT表中 多个字段之间加 “,”
SELECT subjectname AS 课程名称 , classhour/10 ‘均课时’ ,classhour AS 总课时 FROM SUBJECT
#查询名字为郭靖 并且地址为北京海淀区中关村大街1号 的学生信息
SELECT * FROM student WHERE StudentName =‘郭靖’ AND ADDRESS =‘北京海淀区中关村大街1号’
#查询名字为郭靖 或者地址为北京海淀区中关村大街1号 的学生信息
SELECT * FROM student WHERE StudentName =‘郭靖’ OR ADDRESS =‘北京海淀区中关村大街1号’
#查询地址为空的信息 IS NULL IS NOT NULL(不为空)
SELECT * FROM student WHERE address IS NULL
#查询所有课时在110到120 之间的信息 BETWEEN AND
SELECT * FROM SUBJECT WHERE classhour BETWEEN 110 AND 120;
#查询所有课时名称包含数学的信息 LIKE
SELECT * FROM SUBJECT WHERE subjectname LIKE ‘%数学%’
#查询所有课时在110到120 之间的信息 IN
SELECT * FROM SUBJECT WHERE classhour IN (110,120,130);
SELECT * FROM SUBJECT WHERE classhour = 110 OR classhour = 120 OR classhour = 130;
#查询所有姓李的学生所有成绩
SELECT studentno ‘“李”同学的学号’,studentresult ‘“李”同学的成绩’ FROM result
WHERE studentno IN (SELECT studentno FROM student WHERE studentname LIKE ‘李%’)
#表名1 inner join 表名2 on 条件 (内连接) 两个表每条记录 排列组合 1 1
2 2
3
4
排列
然后经过 on 条件 匹配符合条件的
1 1 假如符合条件 就打印出此信息
1 2 假如不符合条件 就不打印出此信息
然后
2 1
2 2 判断条件是否符合
继续
.
.
.
直到最后
4 1 假如符合条件 就打印出此信息
4 2 假如不符合条件 就不打印出此信息
SELECT subjectname ,gradename FROM
SUBJECT
INNER JOIN
grade
ON
grade.GradeID
=subject.GradeID
;
#(外连接)(左外连接)
#以左表做为主表,左表每条记录和右表匹配
#无论满不满足条件 左表都会打印出来,
#如果ON grade.GradeID
=subject.GradeId
条件不满足 ,
#右表里面的内容为null打印出来
#如果ON grade.GradeID
=subject.GradeId
条件满足 ,
#左表的一条记录+右表符合条件的那一条记录 然后打印出来
SELECT gradename ,subjectname
FROM
grade
LEFT JOIN
SUBJECT
ON
grade.GradeID
=subject.GradeId
#(外连接)(右外连接) 右表 左表
排列组合 1 1
2 2
满足条件
1 1
2 2
不满足条件
1 null
2 null
#以右表做为主表,右表每条记录和左表匹配
#无论满不满足条件 右表都会打印出来,
#如果ON subject.GradeId
=grade.GradeID
条件不满足 ,
#右表里面的内容为null打印出来
#如果ON subject.GradeId
=grade.GradeID
条件满足 ,
#右表的一条记录+左表符合条件的那一条记录 然后打印出来
SELECT gradename ,subjectname
FROM
grade
RIGHT JOIN
SUBJECT
ON
grade.GradeID
=subject.GradeId
#内连接案例
#查询学生编号 学生的名字 课程编号 课程名字 考试成绩
#1.查找三表之间的关联 result表中有 StudentNo 和 SubjectNo 与其他表相关联
SELECT student.studentno ,studentname ,subject.subjectno,subjectname ,StudentResult
FROM student
INNER JOIN result
ON student.StudentNo
=result.StudentNo
INNER JOIN SUBJECT
ON subject.SubjectNo
=result.SubjectNo
#2.查询大一年纪 上课的课程名字 课程编号
SELECT GRADENAME ,SUBJECTNAME,SUBJECTNO FROM GRADE INNER JOIN SUBJECT
ON GRADE.GradeID
=SUBJECT.GradeID
WHERE gradename=‘大一’
排序
#ORDER BY排序 DESC降序排序 ASC升序排序
案例!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SELECT student.studentno,studentName,StudentResult,subjectname FROM result INNER JOIN student
ON result.StudentNo
=student.StudentNo
INNER JOIN SUBJECT
ON subject.SubjectNo
=result.SubjectNo
WHERE subjectname=‘数据库结构-1’
ORDER BY studentresult DESC
SELECT GRADENAME ,SUBJECTNAME,SUBJECTNO FROM GRADE INNER JOIN SUBJECT
ON GRADE.GradeID
=SUBJECT.GradeID
WHERE gradename=‘大一’
ORDER BY SUBJECTNO ASC 升序排序 OR DESC降序排序
#limit 从第几条开始 ,显示多少条记录
select * from result limit 5,5
#分页查询
#每页显示五条记录,显示第一页的数据,从第一条开始 在MySQL中从0开始
select … from … limit 0,5
#每页显示五条记录,显示第二页的数据,从第6条开始 在MySQL中从5开始
select … from … limit 5,5
#每页显示五条记录,显示第一页的数据,从第10条开始 在MySQL中从10开始
select … from … limit 10,5
select … from … limit 每页的开始条数,每页显示的条数
每页开始条数
第一页开始条数 (当前页-1)*每页显示条数
第二页开始条数 (当前页-1)*每页显示条数
第三页开始条数 (当前页-1)*每页显示条数
.
.
.
#分页规则
select ...... from ...... limit (当前页-1)*每页显示条数,每页显示条数;
#查询所有学生信息,每页显示5条记录,查出第三页的数据
当前页:第三页 每页显示条数:每页显示5条记录
(当前页-1)*每页显示条数 (3-1)*5
select * from student limit 10,5
案例!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#查询数据库结构-2的考试成绩
#由高到低
#学生学号,姓名打印
#第一次查询前5条记录
SELECT student.studentno,studentname,StudentResult FROM student
INNER JOIN result
ON student.StudentNo
=result.StudentNo
INNER JOIN SUBJECT
ON subject.SubjectNo
=result.SubjectNo
WHERE subjectname=‘数据库结构-2’
ORDER BY StudentResult DESC
LIMIT 5
#第二次查询6-10条记录
SELECT student.studentno,studentname,StudentResult FROM student
INNER JOIN result
ON student.StudentNo
=result.StudentNo
INNER JOIN SUBJECT
ON subject.SubjectNo
=result.SubjectNo
WHERE subjectname=‘数据库结构-2’
ORDER BY StudentResult DESC
LIMIT 5,5
#查询前十名信息LIMIT 10 且成绩大于80(学号,姓名,课程名,分数)
SELECT student.studentno 学号,studentname 姓名,subjectname 课程名字,StudentResult 考试成绩 FROM student
INNER JOIN result
ON student.StudentNo
=result.StudentNo
INNER JOIN SUBJECT
ON subject.SubjectNo
=result.SubjectNo
WHERE subjectname=‘JAVA第一学年’ AND StudentResult>80
ORDER BY StudentResult DESC
LIMIT 10;
子查询
案例!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#查询课程为高等数学-2且分数不小于80分的学生的学号和姓名
SELECT studentno,studentname FROM student WHERE studentno IN
(SELECT studentno FROM result WHERE StudentResult>=80 AND
subjectno=(
SELECT subjectno FROM SUBJECT WHERE SubjectName=‘高等数学-2’
)
)
MySQL函数
#MySQL·数学函数
#向上取整
SELECT CEIL (20.5)
#向下取整
SELECT FLOOR (20.5)
#截取字符串
SELECT SUBSTR(“abcd”,1,2)
#字符串转日期
SELECT STR_TO_DATE (‘2020-04-01’,’%Y-%m-%d’)
#查找字段StudentNo 在student表中一共有多少条
SELECT COUNT(StudentNo) FROM student
#查找字段StudentNo 在student表中的 SUM() 求和 AVG() 平均数 MAX() 最大值 MIN() 最小值…