Data Query Language:数据查询语言
SELECT
SELECT [ALL | DISTINCT] {* | table.* | [table.firld1[as alias1][,table.firld2[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 # 查询指定字段 StudentNo是学号 SELECT `StudentNo`,`StudentName` FROM student # 别名,给结果起名字 AS 可以给字段和表起别名, AS可以省略 SELECT `StudentNo` AS 学号, `StudentName` AS 姓名 FROM student # 函数 Concat(a,b)拼接字符串 SELECT CONCAT('姓名:',StudentNo) AS 新名字 FROM student #结果 :新名字 姓名:xx # 在下面的 SQL 语句中,我们把三个列(url、alexa 和 country)结合在一起,并创建一个名为 "site_info" 的别名: SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info FROM Websites;
SELECT DISTINCT `StudentName` FROM student
SELECT数据库的列
# select 表达式 from 表 SELECT VERSION() # 查询系统版本 (函数) SELECT 100*3 AS 计算结果 #计算 (表达式) SELECT @@auro_increment_increment #查询自增的步长(变量)
# AND SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student WHERE StudentResult >= 95 AND StudentResult <= 100; # 模糊查询 SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student WHERE StudentResult BETWEEN 95 AND 100;
# Like 结合 % 代表(0到任意个字符) _(一个字符) SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student WHERE StudentName LIKE '刘%';# 查询姓刘的 SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student WHERE StudentName LIKE '刘_';# 查询姓刘的,且名字后面只有一个字 SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student WHERE StudentName LIKE '刘__';# 查询姓刘的,且名字后面只有两个字,两个_ SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student WHERE StudentName LIKE '%悟%';# 查询名字之间带有悟的 # IN 可以嵌套select SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student WHERE StudentNo IN (1001,1002,1003);# 查询1001,1002,1003学号学员 SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student WHERE `Address` IN ('北京');# 查询北京学员 # null not null SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student WHERE address='' OR address IS NULL;# 查询北京学员
SQL join 用于把来自两个或多个表的行结合起来。
下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。
# student 有`StudentNo`,`StudentName` # result 有`StudentNo`,`StudentResult`,,`SubjectNo` # join (连接的表) on (判断的条件) 连接查询 SELECT s.StudentNo,StudentResult,SubjectNo,StudentName FROM student AS s #判断StudentNo是哪个表的 INNER JOIN result AS r WHERE s.StudentNo = r.StudentNo; # where是等值查询,join on是连接查询 # Right Join 右查询 # 如果关键字使用where的话,则会两表所有信息,效果如inner join # 必须是表建立之后才可以使用where 所以在inner join中可以达到和on 一样的效果但在left JOIN或者right join中用where就会报错原因就是表还没有建立 SELECT s.StudentNo,StudentResult,SubjectNo,StudentName FROM student s #判断StudentNo是哪个表的 RIGHT JOIN result r ON s.StudentNo = r.StudentNo; # Left Join 左查询 # LEFT JOIN 关键字从左表(Websites)返回所有的行,即使右表(access_log)中没有匹配。 # left join就是显示左边的所有数据,及右边显示的是和左边有交集部分的数据,inner join只显示有交集的行 # left join 左连接:展示左表所有数据,以及右表符合on条件的数据,右表不符合的则为空显示。 SELECT s.StudentNo,StudentResult,SubjectNo,StudentName FROM student s #判断StudentNo是哪个表的 LEFT JOIN result r ON s.StudentNo = r.StudentNo;
ON 和 WHERE:on先筛选后关联,where是先关联后筛选
Left Join 和 Right Join
# 添加条件,查询缺考 SELECT s.StudentNo,StudentResult,SubjectNo,StudentName FROM student s #判断StudentNo是哪个表的 LEFT JOIN result r ON s.StudentNo = r.StudentNo WHERE StudentResult IS NULL; # 添加条件,查询参加同学信息,学号,姓名,科目,分数,Student,result,Subject,SubjectNo科目ID,SubjectName科目,StudentNo学生ID,StudentName学生姓名,StudentResult分数 SELECT s.StudentNo,StudentName,SubjectName,StudentResult FROM student s #判断StudentNo是哪个表的 RIGHT JOIN result r ON s.StudentNo = r.StudentNo INNER JOIN `Subject` sub ON r.SubjectNo = sub.SubjectNo; # 查询select # 几张表查 FROM 表 xxx(LEFT/RIGHT) Join 连接的表 ON 交叉条件 # 存在多张表查询,先查询两张表然后慢慢加 # FROM a left b 以a表为基准 # FROM a right b 以b表为基准
一张表拆为两张一样的表
SELECT a.`categoryName` AS '父栏目', b.`categoryName` AS '子栏目' FROM `category` AS a, `category` AS b WHERE a.`categoryid` = b.`pid`;
order by:通过哪个字段排序,怎么排
排序:升序ASC,降序DESC
SELECT s.StudentNo,StudentName,SubjectName,StudentResult FROM student s #判断StudentNo是哪个表的 RIGHT JOIN result r ON s.StudentNo = r.StudentNo INNER JOIN `Subject` sub ON r.SubjectNo = sub.SubjectNo ORDER BY StudentResult DESC # 学生成绩降序排序 LIMIT 0,5 # 显示5数据,数据由1-5 LIMIT 1,5 # 显示5个数据,数据由2-6
分页
limit:当前页,页面大小
第N页 limit (n-1)*pageSize, pageSize
limit(查询起始下标,pageSize)
# 找到课程xxx,的前10名学生,且分数大于90的学生信息 SELECT s.StudentNo,StudentName,SubjectName,StudentResult FROM student s #判断StudentNo是哪个表的 RIGHT JOIN result r ON s.StudentNo = r.StudentNo INNER JOIN `Subject` sub ON r.SubjectNo = sub.SubjectNo WHERE SubjectName = "xxx" AND StudentResult >= 90 ORDER BY StudentResult DESC # 学生成绩降序排序 LIMIT 0,10; # 显示5数据,数据由1-5
在where查询中嵌套一个子查询
where (select * from)
SELECT StudentNo,SubjectName,StudentResult FROM result r #判断StudentNo是哪个表的 INNER JOIN `Subject` sub ON r.SubjectNo = sub.SubjectNo WHERE SubjectName = "xxx" ORDER BY StudentResult DESC; # 学生成绩降序排序 # 子查询 由里到外 SELECT StudentNo,SubjectName,StudentResult FROM result r #判断StudentNo是哪个表的 WHERE SubjectNo = ( SELECT SubjectNo FROM `Subject` WHERE SubjectName = "xxx" );# 括号里查的是SubjectName=数据库结构-1的课程的SubjectNo,然后在result表中查出SubjectNo等于此值的所有需要字段,得到考这门课的学生No,查出的课程No和分数
# 子查询 找到课程xxx,的前10名学生,且分数大于90的学生信息 SELECT DISTINCT StudentNo,StudentName FROM student #判断StudentNo是哪个表的 WHERE StudentNo IN (SELECT StudentNo FROM result WHERE StudentResult >= 90 AND SubjectNo = (SELECT SubjectNo FROM Stuject WHERE SubjectName = "xxx") ) ORDER BY StudentResult DESC # 学生成绩降序排序 LIMIT 0,10; # 显示5数据,数据由1-5
函数名 | 描述 |
---|---|
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
… | … |
COUNT()
SELECT COUNT(studentname) FROM student; #count(字段)指定列,会忽略所有的null值,主键快 SELECT COUNT(*) FROM student; # 不会忽略所有的null值,本质计算行数 SELECT COUNT(1) FROM result; # 不会忽略所有的null值,本质计算行数,不是主键时,速度快
SELECT SUM(`StudentResult`) AS `SUM` FROM result; SELECT SubjectName, AVG(StudentResult), MAX(StudentResult), MIN(StudentResult) FROM result r INNER JOIN `subject` sub ON r.`SubjectNo` = sub.`SubjectNo` # WHERE AVG() 错误 WHERE的条件不能用分组,需要使用HAVING GROUP BY r.SubjectNo # 通过上面字段分组 HAVING `SUM` > 80 # where是判断每一条记录,having二次过滤可以判断组
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数。
主要增强算法复杂度不可逆性。但彩虹表可以破解
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, 'XX','1234'),(2, 'XXY','123411'),(3, 'EEXX','122234'); UPDATE testmd5 SET pwd=MD5(pwd) # 加密全部 UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1 # 加密id=1的 # 插入时加密 INSERT INTO testmd5 VALUES(4, 'XddX',MD5('1211334')); # 校验 SELECT * FROM testmd5 WHERE name = 'XddX' AND pwd = MD5('1211334');