首页 > 代码库 > mysql20170410练习代码+笔记

mysql20170410练习代码+笔记

今天的几道高级sql查询真的挺难的,感觉好像视频里讲过,当时也没有练,已经淡化了很多,sql还是要多练习啊!确实逻辑性挺强的。

 

 

技术分享
SELECT studentResult,studentNO FROM result WHERE result.`subjectNo`=(SELECT subjectNo FROM `subject`)SELECT studentResult FROM resultWHERE result.subjectNo = (SELECT subjectNo FROM SUBJECT WHERE subjectName=java)WHERE NOT EXISTS(SELECT studentResult FROM result<60)AND (SELECT (AVG(studentResult)+5) FROM result)SELECT studentResult FROM resultWHERE result.subjectNo = (SELECT subjectNo FROM SUBJECT WHERE subjectName=java)>=60SELECT subjectNo FROM `subject` WHERE subjectName = s1SELECT subjectNo FROM `subject` WHERE subjectName = s2WHERE EXISTS(SELECT subjectNo FROM `subject` WHERE subjectName = s1) AND SELECT studentNo 学号,subjectNo 科目编号,studentResult 学员成绩,examDate 考试时间 FROM result WHERE subjectNO =(SELECT subjectNo FROM `subject` WHERE subjectName = s2)SELECT studentNo 学号, studentResult 分数 FROM result WHERE EXISTS()AND subjectNo=SELECT studentName 学生姓名, gradeIdCREATE TABLE IF NOT EXISTS grade(    GradeID INT(11) NOT NULL,    GradeName VARCHAR(50) DEFAULT NULL,    PRIMARY KEY (GradeID)) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT=年级表CREATE TABLECREATE TABLE `grade` (  `GradeID` INT(11) NOT NULL,  `GradeName` VARCHAR(50) DEFAULT NULL,  PRIMARY KEY (`GradeID`)) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT=年级表INSERT INTO grade VALUES (1,一年级),(2,二年级),(3,三年级),(4,四年级)SELECT studentName 学生姓名 FROM studentSELECT GradeName 年级名称 FROM grade WHERE GradeId IN (SELECT gradeId FROM student)SELECT subjectName 课程名称 FROM `subject` WHERE gradeID IN (SELECT gradeId FROM student)SELECT examDate 考试日期 FROM resultSELECT studentResult 考试成绩 FROM result WHERE examDate=(SELECT MAX(examDate) FROM result)SELECT gradeId 年级编号,sex 性别,COUNT(sex) 个数 FROM studentGROUP BY 年级编号,sexCREATE DATABASE IF NOT EXISTS t11USE t11CREATE TABLE IF NOT EXISTS sys_user (uid INT(20) PRIMARY KEY AUTO_INCREMENT COMMENT 客户编号,uName VARCHAR(50) NOT NULL COMMENT 客户姓名,uPassWord VARCHAR(50) COMMENT 客户密码)COMMENT=客户信息表CREATE TABLE IF NOT EXISTS hos_district(did INT(20) PRIMARY KEY AUTO_INCREMENT COMMENT 区县编号,dName VARCHAR(50) NOT NULL COMMENT 区县名称)COMMENT=区县信息表CREATE TABLE IF NOT EXISTS hos_street(sid INT(20) PRIMARY KEY AUTO_INCREMENT COMMENT 街道编号,sName VARCHAR(50) NOT NULL COMMENT 街道名称,sDid INT(20) NOT NULL COMMENT 区县编号, FOREIGN KEY(sDid) REFERENCES hos_district(did))COMMENT=街道信息表CREATE TABLE IF NOT EXISTS hos_type(hTid INT(20) PRIMARY KEY AUTO_INCREMENT COMMENT 房屋类型编号,htName VARCHAR(50) NOT NULL COMMENT 房屋类型名称)COMMENT=房屋类型表CREATE TABLE IF NOT EXISTS hos_house(hMid INT(20) PRIMARY KEY AUTO_INCREMENT COMMENT 出租房屋编号,uid INT(20) NOT NULL COMMENT 客户编号,sid INT(20) NOT NULL COMMENT 街道编号,hTid INT(20) NOT NULL COMMENT 房屋类型编号,price DECIMAL(5,2) DEFAULT 0 NOT NULL COMMENT 每月租金,topic VARCHAR(50) NOT NULL COMMENT 标题,contents VARCHAR(50) NOT NULL COMMENT 描述,FOREIGN KEY(uid) REFERENCES sys_user(uid),FOREIGN KEY(sid) REFERENCES hos_street(sid),FOREIGN KEY(hTid) REFERENCES hos_type(hTid))COMMENT=出租房屋信息表INSERT INTO hos_district VALUES (2,万泉庄),(3,中关村),(4,东单),(5,西单),(6,苏州街),(7,西四)UPDATE hos_district SET dName=东城区 WHERE did =1UPDATE hos_district SET dName=海淀区 WHERE did =2UPDATE hos_district SET dName=西城区 WHERE did=3UPDATE hos_district SET dName=朝阳区 WHERE did=4DELETE FROM hos_district WHERE did=5DELETE FROM hos_district WHERE did=6DELETE FROM hos_district WHERE did=7INSERT INTO hos_street VALUES(1,东四,1),(2,万泉庄,2),(3,中关村,2),(4,东单,1),(5,西单,3),(6,苏州街,2),(7,西四,3)INSERT INTO hos_type VALUES(1,一室一厅),(2,一室一卫),(3,两室一厅),(4,两室一卫)INSERT INTO sys_user VALUES(1,张建,1234),(2,张冬雪,1234),(3,张三,1234),(4,王鑫,1234),(5,李剑,1234),(6,蒋以然,1234),(7,李四,1234)INSERT INTO hos_house VALUES(1,1,3,2,2600.00,中关村,中关村一条街),(2,2,2,2,1500.00,万泉庄附近,万泉庄附近一条街),(3,2,2,2,2700.00,东单,东单很多美食)ALTER TABLE hos_house SET price-- 1 查询张三发布的所有出租房屋信息,并显示房屋分布的街道和区县-- 提示:结果数据来源于出租房屋信息表、客户信息表、区县信息表、街道信息表-- 提示:使用连接查询和子查询两种方式关联夺标数据实现SELECT dName 区县, sName 街道, htName 户型, price 价格, topic 标题, contents 描述-- 2 根据户型和房屋所在区县和街道,为至少有两个街道有出租房屋的区县-- 制作出房屋清单-- 提示:显示用Having子句筛选出街道数量大于1的区县-- 3 按季度统计出本年各区县街道各种户型房屋出租数量-- 输出2016年从1月1日起至今的全部出租房屋数量、-- 各区县出租房屋数量及各街道、户型出租房屋数量练习代码
mysql练习代码

 

 

技术分享
第1次课-- 01.启动mysql服务                使用管理员身份启动cmdnet start mysql-- 02.关闭服务net  stop  mysql -- 03.连接mysql数据库   如果是本机 可以省略 -h ip地址    -p和密码不能有空格mysql  -h ip地址 -u用户名 -p密码-- 04.退出数据库exit-- 05.查询当前所有的数据库show databases;系统默认的四个数据库information_schema:存放的是一些数据库对象信息,包含:用户表信息,字段信息,字符集信息等!performance_schema:存放的是数据库的性能参数信息!mysql:存放的系统用户权限信息!test:数据库管理系统默认创建的测试数据库!任何用户都可以使用!-- 06.sql(结构化查询语言) 01.DDL(数据定义语言)  create  drop  alter 02.DQL(数据查询语言)  select 03.DML(数据操作)    insert delete update 04.DCL(数据控制语言)   commit  rollback  grant  revoke-- 07.逻辑运算符     and   or   not-- 08.创建数据库CREATE DATABASE  t12;SHOW DATABASES;-- 09.切换数据库USE t12;-- 10.删除数据库DROP DATABASE t12;-- 11.创建表   反引号`  是用来区分mysql中的关键字  -- ZEROFILL:不足位数使用0代替!超过位数,实际显示!CREATE  TABLE `test_01`(tid INT(4) ZEROFILL);-- 新增数据INSERT INTO test_01(tid) VALUES(20);INSERT INTO test_01 VALUES(2000);INSERT INTO test_01 VALUES(20000);-- 12.默认int是有符号的   可以取负数CREATE  TABLE `test_02`(tid INT(4) );-- 同时插入多条记录  负数可以插入INSERT INTO test_02 VALUES(20),(1234),(-123456)-- UNSIGNED  无符号的   只能是整数 包含0CREATE  TABLE `test_03`(tid INT(4) UNSIGNED);-- 同时插入多条记录  负数不可以插入INSERT INTO test_03 VALUES(20),(1234),(-123456)--  删除测试的三个表DROP TABLE test_01;-- 13. 字符串类型--   01.char 固定长度的字符串CREATE  TABLE test_01(NAME CHAR(20));INSERT INTO test_01 VALUES(哈哈)-- 最后一个 啊  会被自动截断! 因为字符串超出了规定长度INSERT INTO test_01 VALUES(哈哈啊)-- 02.varchar 可变长度的字符串CREATE  TABLE test_02(NAME VARCHAR(2));--  最后一个 啊  会被自动截断! 因为字符串超出了规定长度INSERT INTO test_02 VALUES(哈哈啊)--  看不出区别--  char(20)默认就已经开辟了20个空间--  varchar(20)开辟了实际使用的空间--  14.日期格式-- DATE :     YYYY-MM-DD-- DATETIME:  YYYY-MM-DD HH:MM:SS-- TIMESTAMP: YYYY-MM-DD HH:MM:SS  1970年1月1日开始的 !首选!-- TIME :     HH:MM:SS -- YEAR :     YYYY-- 15.创建表-- creat table [if not exists] 表名(-- 字段1 数据类型 [字段属性][约束][索引][注释],-- 字段2 数据类型 [字段属性][约束][索引][注释]-- )[表类型][表字符集][注释];  -- 16.字段的约束和属性--   01.非空约束  not null  字段不允许为空--   02.默认约束  default   字段的默认值--   03.唯一约束  unique key(字段名称)  uk  --      设置字段是唯一的不允许重复,可以为空,但是只能有一个空值--   04.主键约束  primary key(字段名称) pk --       设置表中的主键,唯一标识该行!--   05.外键约束   foreign  key(字段名称) fk--       建立在从表中,用于关联两个表之间的关系--       需要指定引用了主表中的哪个字段--   06.自动增长  auto_increment--       设置字段自动增长,默认从1开始!通常设置在主键上!--   07.注释    COMMENT    给字段增加解释CREATE  TABLE IF NOT EXISTS student(   sid  INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT  COMMENT 学生编号,   sname  VARCHAR(20) NOT NULL  COMMENT 学生姓名,   sage  INT(3) NOT NULL DEFAULT 20 COMMENT  学生年龄);-- 新增数据INSERT INTO student(sname,sage) VALUES(小黑,DEFAULT);INSERT INTO student(sid,sname,sage) VALUES(2,小黑2,DEFAULT);--  如果指定了主键的值,就是指定的! 下次的自增冲动指定的值开始!INSERT INTO student(sid,sname,sage) VALUES(789,小黑3,DEFAULT);-- 查询刚刚插入数据的主键INSERT INTO student(sname,sage) VALUES(小黑4,DEFAULT);SELECT @@identity;                                        第2次课--  切换到指定的数据库USE  t12-- 创建Student表CREATE  TABLE  IF NOT EXISTS student(studentNo  INT(4) PRIMARY KEY COMMENT 学号,loginPwd   VARCHAR(20) NOT NULL COMMENT 密码,studentName  VARCHAR(50) NOT NULL COMMENT 姓名,sex    CHAR(2) NOT NULL DEFAULT  COMMENT 性别,gradeID  INT(4)  UNSIGNED   COMMENT 年级编号,phone    VARCHAR(50) COMMENT 手机号码,address    VARCHAR(255) DEFAULT 地址不详 COMMENT 地址,bornDate  DATETIME COMMENT 出生日期,email   VARCHAR(50) COMMENT 邮箱,identityCard  VARCHAR(18)  UNIQUE KEY  COMMENT 身份证号)COMMENT=学生表;两种方式备份和导入数据01.使用dbms02.cmd命令行工具  前提  必须配置了mysql环境变量 备份: mysqldump -u用户名  -p 数据库名称 >路径 备份指定的表:mysqldump -u用户名  -p 数据库名称 表名1 表名2 >路径 恢复: mysql  -u用户名  -p 数据库名称< 路径     --必须存在数据库-- 创建年级表CREATE  TABLE IF NOT EXISTS grade(gradeId INT(4) PRIMARY KEY COMMENT 年级编号,gradeName VARCHAR(20) NOT NULL COMMENT 年级名称)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT=年级表; -- 查询本数据库中下所有的表SHOW TABLES;-- 查看表的结构DESC student;--  删除表DROP  TABLE IF  EXISTS 表名-- 修改表名   alter  table 旧表名 rename [to] 新表名ALTER TABLE student RENAME [TO] stu;-- 添加字段   --  alter  table 表名 add  字段名称  属性ALTER TABLE  student ADD age INT(3) NOT NULL  COMMENT 年龄;-- 修改字段  alter table 表名 change 旧字段  新字段 属性ALTER  TABLE student CHANGE  age  ages INT(4) NOT NULL;--  删除字段  alter  table 表名  drop 字段名称  ALTER TABLE student DROP ages;-- mysql系统帮助文档help 查询内容(命令); -- 添加主键ALTER  TABLE 表名 ADD  CONSTRAINT pk_studentNo主键名称PRIMARY KEY 表名(主键字段)-- 创建外键约束 必须在从表中创建ALTER TABLE  从表名称 ADD  CONSTRAINTfk_student_grade外键约束名称  FOREIGN KEY(从表的外键字段)REFERENCES 主表名称(主键)-- 给student表中增加外键  并且设置 删除是为 cascade--  新增grade表中3条信息INSERT INTO grade VALUES(1,1年级),(2,2年级),(3,3年级);-- 查询表中所有的记录SELECT * FROM grade;-- 删除年级编号为1的记录 的时候,对应的所有学生 也被删除了DELETE FROM grade WHERE gradeid=1;并且设置 删除是为 set null!-- 查询所有的存储引擎SHOW  ENGINES-- 查看当前默认的存储引擎SHOW VARIABLES LIKE storage_engine%;-- 修改存储引擎-- 修改my.ini配置文件   default- storage-engine=InnoDB-- 重启服务--修改指定表中的存储引擎alter  table  表名 engine=引擎-- MyISAM类型的标文件01.*.frm  表结构的定义文件02.*.MYD  数据文件03.*.MYI  索引文件-- InnoDB类型的标文件01.*.frm  表结构的定义文件02.*.ibd  数据文件-- datadir地址下会有一个ibdata1:存储了所有InnoDB类型表中的数据!--  查询student表中所有的数据SELECT * FROM student;--  update 表名 set 字段1=值1,字段2=值2  [where 条件]--  修改所有学生的密码 为  adminUPDATE student  SET loginPwd=admin--  修改学生编号为2的密码 为  adminsUPDATE student SET loginPwd=admins WHERE studentNo=2--  删除数据  delete from 表名  [where 条件]DELETE FROM student;--  删除学生编号为2的数据DELETE FROM studentWHERE studentNo=2;-- truncate  table  表名!--  delete 和truncate的区别01.delete可以加条件02.truncate只能删除表中所有的数据03.delete删除之后可以恢复数据04.truncate不能恢复数据!慎用!05.truncate指定速度比delete快!06.truncate语句删除后将重置自增列!其他结构不变!--  创建学生课程表 subjectCREATE  TABLE  IF NOT EXISTS `subject`( subjectNo  INT(4) PRIMARY KEY AUTO_INCREMENT COMMENT 课程编号, subjectName  VARCHAR(50) NOT NULL COMMENT 课程名称, classHour INT(4) COMMENT 学时, gradeId INT(4) COMMENT 年级编号)COMMENT=课程表;--  查询student表中所有的数据SELECT  studentName,address FROM student;--  按照课时的大小 进行降序排列--  asc:默认值!升序  desc:降序SELECT * FROM `subject`ORDER BY  classHour DESC--  查询年级编号为1的课程,并且按照课时升序排列SELECT * FROM `subject`WHERE gradeId=1ORDER BY classHour ASC--  查询年级编号为1的课程,并且按照课时升序排列的同时--  按照课程编号在降序排列SELECT * FROM `subject`WHERE gradeId=1ORDER BY classHour ASC,subjectNo DESC--  使用别名 as    --  select 字段[as] 别名  from  表名--  查询课程名称 和 课时 SELECT subjectName AS 课程名称,classHour AS  课时FROM  `subject`-- 合并列 01. +的数据类型 必须一致 02. +的如果是字符类型,拼接字符串 03. +的是数值类型,就是求和!SELECT * FROM student--  学生姓名和地址 进行合并SELECT (studentNo+,+gradeId ) AS 整合体FROM  student--  查询电话号码为空的行   is  nullSELECT * FROM  studentWHERE phone IS  NULL--  查询电话号码不为空的行   is  not nullSELECT * FROM  studentWHERE phone IS NOT NULL                                        第3次课--  聚合函数--  查询表中一共有多少条记录SELECT  COUNT(*) FROM student--  查看表中指定字段不为空的记录SELECT  COUNT(phone) FROM student-- 查询年龄最大的数据SELECT  MAX(age) FROM student-- 查询年龄最小的数据SELECT  MIN(age) FROM student--  求所有年龄的平均值SELECT  AVG(age) FROM student--  求所有年龄之和SELECT  SUM(age) FROM student-- 字符串函数  --  字符串的连接SELECT CONCAT(My,S,ql);-- 字符串替换   下标从1开始SELECT  INSERT(大家辛苦了!,1,3,哈哈);--  字符串的截取 下标从1开始SELECT SUBSTRING(大家辛苦了!,1,3);--  字符串变大 小 写SELECT LOWER(AAA);SELECT UPPER(aaa);--  常用的时间和日期函数-- 01.获取当前的日期SELECT  CURDATE();-- 02.获取当前的时间SELECT  CURTIME();-- 03.获取当前的日期和时间SELECT NOW();-- 04.返回日期是一年中的第几周SELECT WEEK(NOW());-- 05.只获取年SELECT  YEAR(NOW());-- 06.只获取小时SELECT  HOUR(NOW());-- 07.获取两个日期差SELECT DATEDIFF(NOW(),2017-03-07);-- 08.返回现在的时间加上某个时间之后的日期SELECT  ADDDATE(NOW(),24);-- 数学函数SELECT  CEIL(3.1);   --  天花板函数SELECT FLOOR(3.9);SELECT  RAND();   --  0-1之间的随机数--  把所有的成绩降低10%后加5分,再查询及格成绩--  并且按照成绩 降序排列SELECT studentNo AS 学号,(studentResult*0.9+5) AS 成绩FROM resultWHERE (studentResult*0.9+5)>=60ORDER BY 成绩 DESC-- 查询所有年级编号为1 的学生信息,并且按照 学号升序排列-- 01. 显示前4条记录SELECT * FROM  studentWHERE gradeid=1ORDER BY studentnoLIMIT 4-- 02. 每页显示4条 显示第2页的内容SELECT * FROM  studentWHERE gradeid=1ORDER BY studentnoLIMIT 4,4--  需要注意的是:第一条记录的是 0!--  limit a,b--   a:从那一条记录开始--   b:每页显示多少条数据--  将学生表中学号为20000的学生邮箱改成stu@20000.163.com--  密码改成000UPDATE  student  SET email=stu@20000.163.com,loginpwd=000WHERE studentNo=20000-- 将科目表中课时数大于200的并且年级编号是1的课时减少10!UPDATE `subject` SET classHour=classHour-10WHERE classHour>=200 AND gradeid=1-- 将所有年级编号是1的学生姓名,性别,出生日期,手机号码-- 都保存到一个新的表中   student_newCREATE TABLE IF  NOT EXISTS student_new(SELECT studentName,sex,bornDate,phone FROM studentWHERE gradeid=1)-- 01.查询2016年2月17日考试  前5名的学员的学号和分数SELECT studentNo 学号,studentResult 分数 FROM resultWHERE examDate=2016-02-17ORDER BY 分数 DESCLIMIT 5-- 02. 将所有女学生按年龄从大到小排序--  从第2条记录开始显示6名女学生的姓名、年龄、出生日期、手机号信息SELECT studentName 姓名,(YEAR(NOW())-YEAR(bornDate)) 年龄,bornDate 出生日期,phone 手机号码  FROM studentWHERE sex=ORDER BY 年龄  DESCLIMIT 1,6-- 03.按出生年份分组统计学生人数-- 将各组中人数达到2人的年份和人数显示出来SELECT YEAR(bornDate) 出生年份, COUNT(studentNo) 人数FROM  studentGROUP BY 出生年份HAVING 人数>=2  -- 04.查询参加2016年2月17日考试的所有学员的最高分、最低分、平均分。SELECT MAX(studentResult) 最高分,MIN(studentResult) 最低分,AVG(studentResult) 平均分 FROM resultWHERE examDate=2016-02-17    5.    select  字段1,字段2....    1.    from   表名    2.    where  条件1 and 条件2    3.    group by  分组依据    4.    having  分组条件    6.    order by  排序字段    7.    limit  分页--  查询grade和student所有的数据SELECT  * FROM student,grade13+413*4-- 笛卡尔积--  怎么解决这个问题? 找出两个表中关联的字段SELECT  * FROM student,gradeWHERE student.`gradeId`=grade.`gradeId`--  查询出 年龄比 李斯文 小的学生信息--  01.先查询李斯文的年龄   1993-07-23SELECT bornDate FROM student WHERE studentName=李斯文--  02.把查询出来的结果当成条件继续查询SELECT bornDate FROM student WHERE bornDate>1993-07-23--  疑问?  能不能把两个sql合并在一起执行--  我们就把  ‘1993-07-23‘当成一个java中的变量名--  指向了01的sqlSTRING  a="521";Stirng b=a+"125";syso(b)syso(a+"125")--  使用子查询来实现-- 子查询就是一个嵌套在select,insert,update或者delete语句或者-- 其他查询语句中的查询语句!-- 语法: select ... from  表 where 字段  比较运算符(子查询)SELECT bornDate FROM student WHERE bornDate>(SELECT bornDate FROM student WHERE studentName=李斯文)-- 子查询和比较运算符联合使用的使用,必须保证子查询返回的值是不能多于一个!--  查询出 最近一次java课程 考试成绩的最高分和最低分--  01.时间是最大的  最高分和最低分  result--  02.java课程  subject  -- 分析 分解书写--  01.先获取课程java的编号SELECT subjectNo 学号 FROM `subject` WHEREsubjectName=java--  02.最近java课程 的考试日期SELECT MAX(examDate) 考试日期,MAX(studentResult) 最高分,MIN(studentResult) 最低分  FROM resultWHERE subjectNo=1-- 03.最近的日期SELECT MAX(examDate) FROM result--  使用子查询SELECT MAX(examDate) 考试日期,MAX(studentResult) 最高分,MIN(studentResult) 最低分  FROM resultWHERE subjectNo=(SELECT subjectNo 学号 FROM `subject` WHERE subjectName=java)AND examDate=(SELECT MAX(examDate) FROM result)  -- 日期是最近的!-- 查询java课程考试成绩为60的学生姓名-- 01.先找java的课程编号SELECT subjectNo 学号 FROM `subject` WHEREsubjectName=java-- 02.找java的成绩是60的SELECT studentResult  成绩 FROM resultWHERE studentResult=60AND subjectNo=(SELECT subjectNo 学号 FROM `subject` WHERE subjectName=java)-- 03.找学生编号 student 怎么和 result表关联的???SELECT studentNo 编号 FROM resultWHERE studentResult=60AND subjectNo=(SELECT subjectNo 学号 FROM `subject` WHERE subjectName=java)-- 使用IN替换=之后的子查询-- IN后面的子查询语句可以返回多条结果SELECT  studentName 姓名 FROM studentWHERE studentNo  IN(SELECT studentNo 编号 FROM resultWHERE studentResult=95AND subjectNo=(SELECT subjectNo 学号 FROM `subject` WHERE subjectName=java))--  查询学生姓名是张秋丽的信息SELECT * FROM student  WHERE studentName=张秋丽--  查询学生姓名是张秋丽 或者  肖梅 的信息SELECT * FROM student  WHERE studentName=张秋丽 OR studentName=肖梅--  查询学生姓名是张秋丽 或者  肖梅  再 或者是 王宝宝 的信息SELECT * FROM student  WHERE studentName=张秋丽 OR studentName=肖梅  OR studentName=王宝宝 -- 使用IN替换 多个条件SELECT * FROM student  WHERE studentName IN (张秋丽,肖梅,王宝宝)--  使用NOT IN--  查询出 没有参加最近一次java课程考试的学生姓名以及编号SELECT studentName  姓名,studentNo 编号 FROM studentWHERE studentNo NOT IN(SELECT studentNo  FROM  resultWHERE subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName=java)AND  examDate=(SELECT MAX(examDate) FROM result))                                 第4次课--  EXISTS :  select  ...  from 表名 where  exists(子查询)--  子查询有返回结果  exists(子查询)返回true  外层查询执行  --  子查询没有返回结果  exists(子查询)返回false  外层查询不执行-- 检查Java课程最近一次考试。-- 如果有成绩达到80分以上者,则显示分数排在前5名学员的学号和分数--  01.查询java课程的编号SELECT subjectNo FROM `subject`WHERE subjectName=java-- 02.上面的当成一个条件  继续查询 resultSELECT * FROM  result WHERE subjectNo=(SELECT subjectNo FROM `subject`WHERE subjectName=java) --  拿到了java所有的考试信息-- 03. 再次拿到最近考试的时间SELECT  MAX(examDate) FROM result--  04.再把03当成条件 拼接查询02SELECT * FROM  result WHERE subjectNo=(SELECT subjectNo FROM `subject`WHERE subjectName=java)  AND  examDate=(SELECT  MAX(examDate) FROM result)-- 05.如果成绩有大于80的 查询出前5名SELECT  * FROM  result WHEREstudentResult>80 ANDsubjectNo=(SELECT subjectNo FROM `subject`WHERE subjectName=java)  AND  examDate=(SELECT  MAX(examDate) FROM result)--  06.整体放在exists中  并增加条件SELECT  studentNo  学号,studentResult 分数 FROM resultWHERE  EXISTS (SELECT  * FROM  result WHEREstudentResult>80 ANDsubjectNo=(SELECT subjectNo FROM `subject`WHERE subjectName=java)  AND  examDate=(SELECT  MAX(examDate) FROM result))AND subjectNo=(SELECT subjectNo FROM `subject`WHERE subjectName=java)  ORDER BY studentResult DESC  LIMIT 5;-- 检查java课程最近一次考试成绩-- 如果全部未通过考试(60分及格),认为本次考试偏难,计算的该次考试平均分加5分--   not  exists-- 01.查询java课程的编号SELECT subjectNo FROM `subject` WHERE subjectName=java-- 02.查询考试成绩  01的结果是1 SELECT  studentResult FROM result WHEREsubjectNo=1-- 03. 合并 12SELECT  studentResult FROM result WHEREsubjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName=java)-- 04.获取最近一次考试的时间SELECT  MAX(examDate) FROM result-- 05. 合并 34 SELECT  studentResult FROM result WHEREsubjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName=java)AND  examDate=(SELECT  MAX(examDate) FROM result)-- 06. 获取成绩小于60的SELECT  studentResult FROM result WHEREsubjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName=java)AND  examDate=(SELECT  MAX(examDate) FROM result)AND  studentResult>60-- 07.如果都没及格   06没有结果集SELECT  AVG(studentResult)+5  平均分  FROM  resultWHERE  NOT EXISTS(SELECT  studentResult FROM result WHEREsubjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName=java)AND  examDate=(SELECT  MAX(examDate) FROM result)AND  studentResult>60)AND   subjectNo=(SELECT subjectNo FROM `subject` WHERE subjectName=java)AND   examDate=(SELECT  MAX(examDate) FROM result)-- 如果有1年级的学生-- 就查询参加2年级学科考试的学员学号、科目编号、考试成绩,考试时间-- 01.查询有没有1年级的学生  student表SELECT * FROM student WHERE gradeId=(SELECT gradeId FROM  grade WHERE gradeName=1年级)-- 02.查询2年级下面的学科SELECT subjectNo FROM `subject`WHERE gradeId=(SELECT gradeId FROM  grade WHERE gradeName=2年级)--  03.整体的结果SELECT studentNo 学号,subjectNo 科目编号,studentResult 考试成绩,examDate 考试时间  FROM  resultWHERE EXISTS(SELECT * FROM student WHERE gradeId=(SELECT gradeId FROM  grade WHERE gradeName=1年级))AND subjectNo IN(SELECT subjectNo FROM `subject`WHERE gradeId=(SELECT gradeId FROM  grade WHERE gradeName=2年级))--  使用子查询的注意事项--  01.任何允许使用表达式的地方都可以使用子查询--  02.只出现在子查询中但是没有在父查询中出现的列,结果集中的列不能包含!                                                                  -- 为每个学生制作在校期间每门课程的成绩单 -- 要求每个学生参加每门课程的最后一次考试成绩作为该生本课程的最终成绩-- 成绩单的数据项  学生姓名  课程所属的年级名称 课程名称  考试日期 考试成绩SELECT studentName 学生姓名,(SELECT gradeName FROM grade WHERE gradeId=`subject`.`gradeId`)  课程所属的年级名称,subjectName 课程名称 , examDate 考试日期 ,studentResult 考试成绩FROM  result  r1INNER JOIN   student ON r1.`studentNo`=student.`studentNo`INNER JOIN  `subject`  ON r1.`subjectNo`=`subject`.`subjectNo`WHERE r1.`examDate`  IN(SELECT MAX(examDate) FROM result r2 WHERE r1.`subjectNo`=r2.`subjectNo` GROUP BY r2.`subjectNo`)--  隐式内连接SELECT studentName 学生姓名,gradeName 年级名称FROM  student,grade WHERE  student.`gradeId`=grade.`gradeId`--  显式内连接SELECT studentName 学生姓名,gradeName 年级名称,subjectName  课程名称FROM  studentINNER JOIN  gradeON student.`gradeId`=grade.`gradeId`-- 统计每门课程平均分各是多少   分组SELECT subjectNo  课程编号,AVG(studentResult)FROM resultGROUP BY subjectNo--  平均分在60分以上的SELECT subjectNo  课程编号,AVG(studentResult) 平均分FROM resultGROUP BY subjectNoHAVING 平均分>=60-- 并按照平均成绩 升序排列SELECT subjectNo  课程编号,AVG(studentResult) 平均分FROM resultGROUP BY subjectNoHAVING 平均分>=60ORDER BY 平均分 --  统计每个年级的  男,女人数--  拿到  年级编号  性别  人数SELECT  gradeId 年级编号 , sex 性别 , COUNT(studentNo) 人数FROM studentGROUP BY gradeId,sex   --  内连接   inner join --  外连接      01.左外连接  left  join      02.右外连接  right join--  拿到student 和 年级表的数据--  获取学生编号  学生姓名   年级名称SELECT  studentNo ,studentName,gradeNameFROM student INNER JOIN  gradeON  student.`gradeId`=grade.`gradeId`SELECT  studentNo ,studentName,gradeNameFROM student,gradeWHERE student.`gradeId`=grade.`gradeId`--   三表联查--  查询学生姓名,学生成绩 ,课程名称SELECT  studentName 学生姓名,studentResult 学生成绩,subjectName 课程名称FROM  student s INNER JOIN result  r ON s.`studentNo`=r.`studentNo`INNER JOIN `subject`  j ON r.`subjectNo`=j.`subjectNo`--  左外连接   以左表为准,如果右表中没有对应的数据 ,则右表返回null--  查询所有学生的成绩 和姓名SELECT  DISTINCT(studentName) 姓名, studentResult 成绩FROM studentLEFT JOIN result ON result.`studentNo`=student.`studentNo`-- 右外连接 以右表为准,如果左表中没有对应的数据 ,则左表返回nullSELECT  DISTINCT(studentName) 姓名, studentResult 成绩FROM student RIGHT JOIN result ON result.`studentNo`=student.`studentNo`-- 把查询的语句 存入到 临时表中--  临时表只有当前的链接可见 随连接的关闭自动删除-- 临时表的更改不会影响到真表CREATE TEMPORARY  TABLE  haha(SELECT studentName FROM student)SELECT * FROM hahamysql笔记
mysql笔记

 

mysql20170410练习代码+笔记