自连接:自己的表和自己的表连接,核心:把一张表当成两张表用即可
父类
categoryIdcategoryName2信息技术3软件开发5美术设计子类
categoryIdPIDcategoryName43数据库63web开发75ps技术82办公信息要求查询结果是:父类和子类相对应
-- ==== 自连接 === SELECT c1.`categoryid` AS '父栏目',c1.`categoryName` '父栏目名',c2.`categoryid` '子栏目',c2.`categoryName` '子栏目名' FROM `category` c1 INNER JOIN `category` c2 ON c2.`pid` = c1.`categoryid`;连表查询练习
-- === 连表连接联系 === -- 1.查询学生的所属年级(学生id,学生姓名,学生年级) SELECT `studentno` '学生id',`studentname` '学生姓名',`gradeName` '所属年级' FROM `student` s LEFT JOIN `grade` g ON s.`gradeid` = g.`gradeid`; -- 2.查询科目所属的年级 (subjectno subjectname gradename) SELECT `subjectno`,`subjectname`,`gradename` FROM `subject` s RIGHT JOIN `grade` g ON s.`gradeid` = g.`gradeid`; -- 3.查询参加 数据库结构-1 考试的学生 (学号,学生姓名,考试科目,考试成绩) -- ====1.重命名应该尽可能的清楚 2.要注意有无 ; 在句子末尾 SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM `student` s INNER JOIN `result` r ON s.`studentno` = r.`studentno` INNER JOIN `subject` sub ON r.`subjectno` = sub.`subjectno` WHERE `subjectname` = '数据库结构-1';排序(ORDER BY)
-- ===== 分页 limit 和 排序order by ===== -- 排序:1,升序 ASC 2,降序 DESC -- 语法:order by + 字段名 +排序方式 -- 查询的结果根据成绩降序排序 SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM `student` s INNER JOIN `result` r ON r.`studentno` = s.`studentno` INNER JOIN `subject` sub ON r.`subjectno` = sub.`subjectno` WHERE `subjectname` = '数据库结构-1' ORDER BY `studentresult` DESC语法:order by + 字段名 + 排序方式
排序
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM `student` s INNER JOIN `result` r ON r.`studentno` = s.`studentno` INNER JOIN `subject` sub ON r.`subjectno` = sub.`subjectno` WHERE `subjectname` = '数据库结构-1' ORDER BY `studentresult` DESC LIMIT 0,2 -- 排序 limit (a,x) a是从第几条数据开始,0是第一条数据的位置;x是一次显示数据的条数 -- 第 1 页 (0,5) ,起始值规律:(1-1)*5 -- 第 2 页 (5,5) , (2-1)*5 -- 第 3 页 (10,5) , (3-1)*5 -- 第 n 页 ((n-1)*5,5), (n-1)*5 -- pagesize : 一个页面容纳数据的最大条数 -- 起始值: (n-1)*5 -- 当前页: n; -- 总的页数: 数据条数除以pagesize向上取整 -- 查询 Java程序设计-1 考试成绩前10的学生 并且分数要大于80分的学生信息 SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult` FROM `student` s INNER JOIN `result` r ON s.`studentno` = r.`studentno` INNER JOIN `subject` sub ON r.`subjectno` = sub.`subjectno` WHERE sub.`subjectname` = 'Java程序设计-1' AND `studentresult` >= 80 ORDER BY `studentresult` DESC LIMIT 0,10子查询在where里面嵌套一个查询语句
-- 分数不小于80分的学生的学号和姓名 -- 方式1 .`result`连表查询 SELECT DISTINCT s.`studentno`,`studentname` FROM `student` s INNER JOIN `result` r ON s.`studentno` = r.`studentno` WHERE r.`studentresult` >= 80 -- 高等数学-2 分数不小于80分的学生的学号和姓名 -- 方式1 .连表查询 SELECT DISTINCT s.`studentno`,`studentname` FROM `student` s INNER JOIN `result` r ON s.`studentno` = r.`studentno` INNER JOIN `subject` sub ON r.`subjectno` = sub.`subjectno` WHERE r.`studentresult` >= 80 AND `subjectname` = '高等数学-2' -- 方式2 join on 和子查询 SELECT DISTINCT s.`studentno`,`studentname` FROM `student` s INNER JOIN `result` r ON s.`studentno` = r.`studentno` WHERE r.`studentresult` >= 80 AND `subjectno` = ( SELECT `subjectno` FROM `subject` WHERE `subjectname` = '高等数学-2' ) -- 方式3 单纯的嵌套子查询 SELECT `studentno`,`studentname` FROM `student` WHERE `studentno` IN ( SELECT `studentno` FROM `result` WHERE `studentresult` > 80 AND `subjectno` = ( SELECT `subjectno` FROM `subject` WHERE `subjectname` ='高等数学-2' ) ) -- 查询 C语言-1 前5名同学的成绩的信息(学号,姓名,分数) -- 方式1:连表查询 SELECT s.`studentno`,`studentname`,`studentresult` FROM `student` s INNER JOIN `result` r ON s.`studentno` = r.`studentno` INNER JOIN `subject` sub ON `subjectname` = 'C语言-1' WHERE r.`subjectno` = sub.`subjectno` ORDER BY `studentresult` DESC LIMIT 0,5 -- 方式2 嵌套查询 SELECT s.`studentno`,`studentname`,`studentresult` FROM `student` s INNER JOIN `result` r ON s.`studentno` = r.`studentno` WHERE `subjectno` = ( SELECT `subjectno` FROM `subject` WHERE `subjectname` = 'C语言-1' ) ORDER BY `studentresult` DESC LIMIT 0,5注意:[]括号代表可选,{}括号代表必选的
MySQL的官网地址.
什么是MD5?
主要增强了算法的复杂性和不可逆性 虽然MD5不可逆,但是具体的值的MD5是一样的
-- ========== 数据库md5加密 =========== CREATE TABLE `testmd5`( `id` INT(5) NOT NULL , `name` VARCHAR(20) NOT NULL, `pwd` VARCHAR(50) NOT NULL, PRIMARY KEY(`id`) )ENGINE = INNODB DEFAULT CHARSET=utf8; INSERT INTO `testmd5`(`id`,`name`,`pwd`) VALUES (1,'张三','123456'), (2,'李四','123456'), (3,'王五','123456'), (4,'刘六','123456'), (5,'薛七','123456') UPDATE `testmd5` SET `pwd` = MD5(`pwd`) WHERE `id`='1'; UPDATE `testmd5` SET `pwd` = MD5(`pwd`) WHERE `id` != 1; -- 插入时转换 INSERT INTO `testmd5`(`id`,`name`,`pwd`) VALUE (6,'邱八',MD5('12345')) -- 如何校验, 将用户传递进来的值进行md5加密,然后进行匹配 SELECT * FROM `testmd5` WHERE `name` = '李四' AND `pwd` = MD5('123456')ps: 数据库本地编程(出发器、存储过程)和数据库集群有冲突