数据查询
选择:where
投影:select
from 数据源
group by 分组
order by 排序 【asc/desc】
having 筛选组
distinct:筛除掉找出的重复部分,放在select后面
2、使用语句
给列取别名: 列名 as ‘别名’
计算列:1、数值±*/%加减乘除等运算
2、字符列 concat(a,b,c,…) 使得不同字符连接起来,例如:
SELECT Sname AS '姓名',Sage AS '年龄'
FROM student;
SELECT ProductName,price*Stocks AS '总价'
FROM products;
SELECT CONCAT(Sname,'的年龄是',Sage,'岁')
FROM student;
3、函数:year() :取年
curdata():当前日期
data():年月日
cast():强制类型转换
例如 :
CAST (sage AS CHAR)
right() :只取字符串的右侧
month():日期中只取月
例题:显示销售的姓名和年龄,计算销售的年龄(比较年月日)
SELECT SaleName,Birthday,YEAR(CURDATE())-YEAR(Birthday)-(RIGHT(CURDATE(),5)<RIGHT(DATE(Birthday),5))AS 年龄
FROM salers;
3、关键词
where:筛选行
1、单条件筛选
2、多条件筛选 优先级:not >and > or
对同一个列多次比较在一个范围用 between and
在一个散落的范围点用 in[]
模糊匹配
like 基于整个字符串进行匹配 (%代表任意字符,_代表一个字符)
rlike(又名REGEXP):
模式字符 | 含义 |
---|---|
^ | 匹配字符串的开始部分 |
$ | 匹配字符串的结束部分 |
. | 匹配字符串中的任意一个字符 |
[字符集合] | 匹配字符集合中任意一个字符 |
[^字符集合] | 匹配字符集合外的任意一个字符 |
str1|str2|str3 | 匹配str1,str2,str3中的任意一个字符串 |
* | 匹配0到多个他前面的字符 |
+ | 匹配1到多个他前面的字符 |
? | 匹配0个或者1个他前面的字符 |
字符串{N} | 字符串出现N次 |
字符串(M,N) | 字符串出现至少M次,最多N次 |
例如检索学生联系方式中以15开头或者18开头,且后面跟着9位数字的学生信息。
SELECT * FROM student
WHERE phone RLIKE '^1[58][0-9]{9}';
--查询姓‘张’的学生的详细信息。
--查询学生表中姓‘张’、姓‘李’和姓‘刘’的学生的情况。
--查询名字中第2个字为‘小’或‘大’字的学生的姓名和学号。
--查询名字是2个字的学生的信息
--查询名字包含小字的学生的信息
--查询所有不姓“刘”的学生。
--从学生表中查询学号的最后一位不是2、3、5的学生情况
SELECT * FROM student
WHERE sname RLIKE '^张';
SELECT * FROM student
WHERE sname RLIKE '^(张|李|刘)';
SELECT sname,sno FROM student
WHERE sname RLIKE '^.[小大]';
SELECT * FROM student
WHERE sname RLIKE '^..$';
SELECT sname,sno FROM student
WHERE sname RLIKE '.*小.*';
SELECT sname FROM student
WHERE sname RLIKE '^[^刘]';
SELECT sname,sno FROM student
WHERE sno RLIKE '.*[^235]$';
空值:is null 非空:is not null
排序order by:(一般和limit配合使用)
limit 起始位置 返回数量:第一个参数可以不写默认为0
SELECT * FROM student
WHERE sdept='计算机系'OR sdept='外语系'
ORDER BY sage DESC LIMIT 3;
SELECT * FROM student
WHERE sage IS NOT NULL
ORDER BY sage LIMIT 1;
聚合函数(对一列的数据进行操作):放在select后面或者分组后的having与order by后面使用
count():计数
sum():求和
avg():计算平均值
max():该列最大值
min():该列最小值
SELECT COUNT(DISTINCT sdept) FROM student;
分组:group by
单独使用显示每个组的第一个值,意义不大
与聚合函数一起使用
与group_concat()函数一起使用;明细汇总
与 having 一起使用(现在输出的结果)
与with rollup 一起使用(最后加入一个总和行)
SELECT * FROM student
WHERE sage IS NOT NULL
ORDER BY sage LIMIT 1;
SELECT COUNT(DISTINCT sdept) FROM student;
-- 查询平均分大于70的学生的学号。
SELECT sdept ,GROUP_CONCAT(sname),AVG(sage)
FROM student
GROUP BY sdept
WITH ROLLUP;
-- 查询男同学人数最多的系,以及该系学生姓名的明细
SELECT sdept,GROUP_CONCAT(sname) FROM student
WHERE ssex='男'
GROUP BY sdept
ORDER BY COUNT(*)DESC
LIMIT 1;
-- 查询每个系年龄最大的男同学的名字
SELECT student.sname,student.sdept
FROM student JOIN(
SELECT MAX(sage) AS 'maxsage',sdept
FROM student
GROUP BY sdept) s
ON student.sdept=s.sdept
WHERE student.sage=s.maxsage AND student.ssex='男'