DQL(数据库查询语言)
select 语句
-
查询全部数据
select * from 表名
-
查询指定字段
select 字段1,字段2 from 表名
-
给指定字段起 别名 (可以给字段起别名,也可以给表起别名)
select 字段1 as 别名1, 字段2 as 别名2... from 表名 as 表别名
-
使用函数concat(a,b) :拼接字符串
select concat('a','b') from dual //ab
-
去重,会将查询到的字段进行去重处理 关键字 : distinct
select distinct 字段 from 表名
-
表达式 : MySQL中的表达式可以是 : 列,文本值,null,函数,系统变量,计算表达式等
select 表达式 from 表
SELECT 完整语法
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 ...{ASC | DESC}] -- 指定排序条件
[LIMIT {[offset,]row_count | row_countOffset offSet}]
where 条件子句
- 作用 : 检索数据中符合条件 的值
- 搜索的条件就是由一个或多个表达式组成,结果为布尔值
- 逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and (&&) | a and b (a && b) | 逻辑与,两个都为真,结果为真 |
or (||) | a or b (a || b ) | 逻辑或,有一个为真结果为真 |
Not (!) | NOT a (!a) | 逻辑非,取反,真为假,假为真 |
-
模糊查询 : 比较运算符
运算符 语法 描述 is null a is null a为null,结果为真 is not null a is not null a不为null, 结果为真 between ... and ... a between b and c a 在b和c之间,结果为真,包含b、c like a like b
_ : 表示一个字符
% : 表示0个或任意个字符SQL匹配,如果a匹配b,则结果为真
a like b_ : 表示a匹配以b开头的两个字符
a like b% : 表示a匹配以b开头的0个或任意个字符in a in (a1,a2,a3...) a1,a2,a3包含a,则结果为真 not in a not in (a1,a2,a3...) a1,a2,a3不包含a,则结果为真
连表查询
连接方式 | 语法 | 描述 |
---|---|---|
Inner join... on ... | select a.* , b.* from a inner join b on a.id = b.id 等价于 : select a.* , b.* from a inner join b where a.id = b.id 等价于 : select a.* , b.* from a,b where a.id= b.id | 内连接,查询的是a和b的交集,满足关联条件但是有字段为null的记录不会被查询出来。 内连接中,where条件子句等价于on条件子句 |
left join ... on ... | select a.* , b.* from a left join b on a.id = b.id | 左外连接,以a(左)表为驱动表,查询出a(左)表中的所有数据,即使b(右)表中没有匹配 |
right join ... on ... | select a.* , b.* from a right join b on a.id = b.id | 右外连接,以b(右)表为驱动表,查询出b(右)表中的所有数据,即使a(左)表中没有匹配 |
自连接 | select a.* , b.* from a a1 , a a2 where a1.id = a2.pid | 将同一张表看成两张表来进行关联操作 |
分页和排序
- 排序 : ==order by 关键字 ,ASC - 升序 不写默认升序,DESC 降序==
select a,b,c from 表名 where 条件 order by a desc // 表示最终的查询结果根据a字段做降序排列
- 分页 : limit([n],m) n : 起始的行数(n从0开始) , m要查询的条数,n可以忽略,表示直接从第一条开始查询m条数据
select a,b,c from 表名 where 条件 order by a desc limit (n,m) // 分页查询,查询从第n行开始的M条数据,n忽略时,表示直接从第一条开始查询m条数据
子查询
-
本质 :在where字句中或者select语句中放入另外一条select子句
-
案例:
-- 查询c语言-1前五名学生的学号姓名 SELECT studentno, studentname FROM student where studentno in ( select studentno FROM result where subjectno = ( select subjectno from subject where subjectname = 'C语言-1' ) )
分组和过滤
-
GROUP BY : 通过GROUP BY 子句 可以对查询数据进行分组
-
HAVING : 通过HAVING 条件 子句 可以对分组后的语句进行条件过滤
-
注意 : WHERE子句不能和聚合函数一起使用,此处需要过滤条件只能使用HAVING 子句
-
案例
-- 查询课程平均分 >= 80 的总分,平均分,最大分和最小分 SELECT sub.subjectname, SUM( r.studentresult ) as sum, AVG( r.studentresult ) as avg, MAX(r.studentresult) as max, MIN(r.studentresult) as min from result r inner join `subject` sub on r.subjectno = sub.subjectno group by r.subjectno having avg >= 80
MySQL函数
一般函数
-
数学运算
函数 语法 描述 ABS() select ABS(-99) 取绝对值 CEILing() 或 CEIL() select CEILing(1.2) // 2
select CEIL(-1.2) // -1向上取整 FLOOR() select FLOOR(2.2) 向下取整 RAND() select RAND() 返回一个0~1之间的随机数 SIGN(99) select SIGN(99) 判断一个数的符号,负数返回-1,0返回0,正数返回1 -
字符串函数
- MySQL中所有的字符串下标均是以1开始
函数 语法 描述 CHAR_LENGTH(str) select CHAR_LENGTH('你好世界') // 4 返回字符串的字符长度 LENGTH(str) select LENGTH('你好世界') // 12 返回字符串的unicode编码长度 CONCAT(str1,str2,str3...) select CONCAT('你好','我爱的','世界') 拼接字符串,将所有参数字符串按顺序拼接成一个字符串 INSERT(str,pos,len,newstr) select INSERT('你好世界',1,2,'美丽的') // 美丽的世界 替换字符串,使用newstr替换从str的pos位置开始的len个长度的字符串 LOWER(str) select LOWER('A') // a 将str中的所有大写字母转换成小写 UPPER(str) select UPPER('a') // A 将str中的所有小写字母转换成大写 INSTR(str,substr) select INSTR('你好世界','你') // 1 返回substr子字符串在str字符串中第一次出现的位置 REPLACE(str,from_str,to_str) elect REPLACE('你好世界','你好','再见') // 再见世界 字符串的替换,使用to_str替换在str中出现的from_str SUBSTR(str,pos,len)
SUBSTR(str,pos)
等效于 SUBSTRING()select SUBSTR('你好世界',1,2) // 你好
select SUBSTR('你好世界',1) // 你好世界字符串截取,截取从str字符串中pos位置开始的长度为len的字符串;如果没有len参数,则截取到str字符串末尾 REVERSE(str) SELECT REVERSE('你好') // 好你 翻转字符串 -
时间和日期函数
函数 语法 描述 NOW() select NOW() 返回当前日期时间,包括日期和时间 CURRENT_TIME() select CURRENT_TIME() 返回当前时间(时分秒) CURRENT_DATE() select CURRENT_DATE() 返回当前日期(年月日) CURRENT_TIMESTAMP() select CURRENT_TIMESTAMP() 返回当前日期时间,包含日期和时间
聚合函数(常用)
函数 | 语法 | 描述 |
---|---|---|
COUNT([DISTINCT]列名) | select COUNT(列名1[,列名2]...) from 表名 | 查询某一列的总记录数,会忽略null值;如果该列为主键,效率比count(1)快,如果该列不为主键,count(1)效率更快 |
COUNT(*) | select COUNT(*) from 表名 | 查询表中的总记录数,不会忽略null值 |
COUNT(1) | select COUNT(1) from 表名 | 查询表中的总记录数,不会忽略null值 |
SUM([DISTINCT] 列名) | select SUM(列名) as sum from 表名 | 查询指定列的总和 |
AVG([DISTINCT] 列名) | select AVG(列名) as sum from 表名 | 查询指定列的平均值 |
MIN() | select MIN(列名) as sum from 表名 | 查询指定列的最小值 |
MAX() | select MAX(列名) as sum from 表名 | 查询指定列的最大值 |
MD5加密函数
函数 | 语法 | 描述 |
---|---|---|
MD5(str) | select MD5('222222') | 针对给定的字符串str进行MD5加密操作,该操作是数据库级别的MD5加密操作 |