SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] -- 联合查询
[WHERE ....] -- 指定结果需满足的条件
[GROUP BY ....] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY ....] -- 指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];
-- 指定查询的记录从哪条至哪条
注意:[ ]括号代表可选的,{ }括号代表必选得
?
-- 查询全部的学生 SELECT 字段 FROM 表
SELECT * FROM student
-- 查询指定字段
SELECT `StudentNo`,`StudentName` FROM student
-- 别名,给结果起一个名字 AS 可以给字段起别名,也可以给表起别名
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名 FROM student AS s
-- 函数 Concat(a,b)
SELECT CONCAT(‘姓名‘,StudentName) AS 新名字 FROM student
语法:SELECT字段....FROM 表
作用:去除SELECT 查询出来的结果中重复的数据,重复的数据只显示一条
-- 查询一下有哪些同学参加了考试,成绩
SELECT * FROM result -- 查询全部的考试成绩
-- 查询有哪些同学参加了考试
SELECT `StudentNo` FROM result
-- 发现重复数据,去重
SELECT DISTINCT `StudentNo` FROM result
-- 查询系统的版本号(函数)
SELECT VERSION()
-- 用来计算(表达式)
SELECT 100*3-1 AS 计算结果
-- 查询自增的步长(变量)
SELECT @@auto_increment_increment
-- 学员考试成绩 +1分查看
SELECT `StudentNo`,`StudentResult`+1 AS ‘提分后‘ FROM result
数据中的表达式:文本值,列,Null,函数,计算表达式,系统变量…………..
作用:检索数据中符合条件
的值
搜索的条件由一个或者多个表达式组成!结果 布尔值
-- =============== where ===============
SELECT studentNo,`StudentResult` FROM result
-- 查询考试成绩在80~100之间
SELECT studentNo,`StudentResult` FROM result
WHERE StudentResult >=80 AND StudentResult <=100
-- and &&
SELECT studentNo,`StudentResult` FROM result
WHERE StudentResult >=80 && StudentResult <=100
-- 模糊查询(区间)
SELECT studentNo,`StudentResult` FROM result
WHERE StudentResult BETWEEN 80 AND 100
-- 查询除了1000号学生之外的同学的成绩
SELECT studentNo,`StudentResult` FROM result
WHERE studentNo!=1000;
-- != not
SELECT studentNo,`StudentResult` FROM result
WHERE studentNo NOT = 1000;
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符为NULL,结果为真 |
IS NOT NULL | a is not null | 如果操作符部位NULL,结果为真 |
BETWEEN | a between b and c | 若a在b和C之间,结果为真 |
Like | a like b | SQL匹配,如果a能够匹配b,结果为真 |
In | a in(a1,a2,a3…) | 假设a在a1,或者a2…其中的某一个值中,结果为真 |
-- =============== 模糊查询 ===============
-- 查询姓刘的同学
-- like解和 %(代表0到任意个字符)_(一个字符)
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE ‘刘%‘
-- 查询姓刘的同学,名字后面只有一个字的
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE ‘刘_‘
-- 查询姓刘的同学,名字后面只有两个字的
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE ‘刘__‘
-- 查询名字中间有雅字的中间 %雅%
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE ‘%雅%‘
-- =============== In(具体的一个或者多个值)===============
-- 查询1001,1002,1003号学员
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentNo IN (1001,1002,1003);
-- 查询在北京的学生
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE `address` IN (‘北京‘);
-- =============== null not null===============
-- 查询地址为空的学生 null ‘‘
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE `address`=‘‘ OR address IS NULL
-- 查询出生日期的同学 不为空
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE `BornDate` IS NOT NULL;
-- =============== 联表查询 join ===============
-- 查询参加了考试的同学(学号,姓名,科目编号,分数)
SELECT * FROM student
SELECT * FROM result
/*
1.分析需求,分析查询的字段来自哪张表,(连接查询)
2.确定使用哪种连接查询?7种
确定交叉点(这两个表中哪个数据是相同的)
判断的条件:学生表中的StudentNo = 成绩表中的StudentNo
*/
SELECT s.studentNo,StudentName,SubjectNo,StudentResult
FROM student AS s
INNER JOIN result AS r
WHERE s.studentNo = r.studentNo
-- Right Join
SELECT r.studentNo,StudentName,SubjectNo,StudentResult
FROM student AS s
RIGHT JOIN result r
ON s.studentNo = r.studentNo
-- Left JOIN
SELECT r.studentNo,StudentName,SubjectNo,StudentResult
FROM student AS s
RIGHT JOIN result r
ON s.studentNo = r.studentNo
操作 | 描述 |
---|---|
Inner join | 如果表中至少有一个匹配,就返回行 |
left join | 会从左表中返回所有的值,即使右表中没有匹配 |
right join | 会从右表中返回所有的值,即使左表中没有匹配 |
自连接(了解)
自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
-- 分页和排序
-- order by 通过哪个字段排序,怎么排
-- 排序: 升序asc ,降序 desc
-- 查询的结果根据 成绩降序来排序
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 `studentresult` ASC
-- 为什么要分页?
-- 缓解数据库压力,给人更好的体验 or 瀑布流
-- 分页每页只显示五条数据
-- 语法: limit 当前页 页面的大小
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 `studentresult` ASC
LIMIT 0,5
-- 规律
-- 第一页 limit 0,5 -----> (1-1)* 5
-- 第二页 limit 5,5 -----> (2-1)* 5
-- 第三页 limit 10,5 -----> (3-1)* 5
-- 第N页 limit 0,5 -----> (n-1)* pageSize pageSize:页面大小 (n-1)* pageSize: 起始值
-- 总页数: 数据综述/页面大小
where(这个值是计算出来的)
本质:在where 语句中嵌套一个子查询语句
where (select * from)
-- 方式二:使用自查询()
SELECT `studentno`,`subjectno`,`studentresult`
FROM `result`
WHERE studentno = (
SELECT `subjectno` FROM `subject`
WHERE `subjectname` = ‘数据库结构-1‘
)
ORDER BY `studentresult` DESC;
-- 常用函数
-- 数学运算
SELECT ABS(-7) -- 绝对值
SELECT CEILING (9.4) -- 向上取整
SELECT FLOOR (9.4) -- 向下取整
SELECT RAND () -- 返回一个0~1之间的随机数
SELECT SIGN (-7) -- 判断一个数的符号 0:0 正数:1 负数:-1
-- 字符串函数
SELECT CHAR_LENGTH (‘凡王之血,必以剑终‘) -- 字符串长度
SELECT CONCAT (‘厦‘,‘门‘,‘大‘,‘学‘) -- 拼接字符串
SELECT INSERT (‘我爱编程‘,2,1,‘超级爱‘) -- 查询,从某个位置开始替换某个长度
SELECT LOWER (‘xSd‘) -- 小写字母
SELECT UPPER (‘cyy‘) -- 大写字母
SELECT INSTR (‘cssy‘ ‘y‘) -- 返回 第一次出现的字符串索引
SELECT REPLACE (‘坚持就能成功‘, ‘坚持‘,‘努力‘) -- 返回指定的字符串(源字符串,截取的位置,截取的长度)
SELECT SUBSTR (‘坚持就能成功‘, 4,5) -- 返回指定的字符串(源字符串,截取的位置,截取的长度)
SELECT REVERSE (‘你好‘) -- 反转
-- 时间和日期函数(记住)
SELECT CURRENT_DATE() -- 获取当前日期
SELECT CURDATE() -- 获取当前日期
SELECT NOW() -- 获取当前的时间
SELECT LOCALTIME() -- 本地时间
SELECT SYSDATE () -- 系统时间
SELECT YEAR(NOW()) -- 年
SELECT MONTH(NOW()) -- 月
SELECT DAY(NOW()) -- 日
SELECT HOUR(NOW()) -- 小时
SELECT MINUTE(NOW()) -- 分钟
SELECT SECOND(NOW()) -- 秒
-- 系统
SELECT SYSTEM_USER () -- 系统用户
SELECT USER() -- 系统用户
SELECT VERSION() -- 系统版本
函数名称 | 描述 |
---|---|
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
… | .. |
-- ========== 聚合函数 ==========
SELECT COUNT(studentname) FROM student; -- COUNT(指定列),会忽略所有的null值
SELECT COUNT(*) FROM student; -- count(*)不会忽略null值
SELECT COUNT(1) FROM result; -- count(1) 不会忽略所有的null值
SELECT SUM(`StudentResult`) AS 总和 FROM result
SELECT AVG(`StudentResult`) AS 平均分 FROM result
SELECT MAX(`StudentResult`) AS 最高分 FROM result
SELECT MIN(`StudentResult`) AS 最低分 FROM result
-- 查询不同课程的平均分,最高分,最低分,平均分大于75
-- 核心: (根据不同的课程分组)
SELECT SubjectName,AVG(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo = sub.SubjectNo
GROUP BY r.SubjectNo -- 通过什么字段来分组
HAVING 平均分>75
什么是MD5?
主要增强算法复杂度和不可逆性。
MD5不可逆,具体的值的md5是一样的
MD5破解网站的原理,背后有一个字典,MD5加密后的值,加密前的值
-- ========== 测试MD5 加密 ==========
CREATE TABLE `testmd5`(
`id` INT(4) NOT NULL,
`name` VARCHAR(20) NOT NULL,
`pwd` VARCHAR(50) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 明文密码
INSERT INTO `testmd5` VALUES(1,‘zhangsan‘,123456),(2,‘lisi‘,123456),(3,‘wangwu‘,123456);
-- 加密
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1;
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id != 1;
UPDATE testmd5 SET pwd=MD5(pwd) -- 加密全部的密码
-- 插入的时候加密
INSERT INTO `testmd5` VALUES(4,‘xiaoming‘,MD5(123456))
-- 如何校验:将用户传递进来的密码,进行md5加密,然后比对加密后的值
SELECT * FROM testmd5 WHERE `name`=‘xiaoming‘ AND pwd=MD5(‘123456‘)
顺序最重要:
select 去重 要查询的字段 from 表 (注意:表和字段可以取别名)
xxx join 要连接的表 on 等值判断
where(具体的值,子查询语句)
group by (通过哪个字段来分组)
HAVING(过滤分组后的信息,条件和where是一样的,位置不同)
ORDER BY (通过哪个字段排序)[升序或降序]
LIMIT startindex,pagesize
业务层面:
查询:
跨表,跨数据库....
原文:https://www.cnblogs.com/saxonsong/p/14769308.html