一、函数
DQL语言也是数据库的查询是最重要的核心所在,这里需要介绍些关于函数的知识。
函数名 | 作用 |
AVG() | 返回某字段的平均值 |
COUNT() | 返回某字段的行数 |
MAX() | 返回某字段的最大值 |
MIN() | 返回某字段的最小值 |
SUN() | 返回某字段的和 |
函数名 | 作用 | 举例 |
CONCAT(str,str1,........,strn) | 连接字符串str、str2、..........、strn为一个完整字符串 | SELECT CONCAT('my','s','ql') 返回:mysql |
Insert () | 替换字符串 | select insert('这是MySQl数据库',3,10,'MySQL'); 返回:这是MySQL |
lower() | 转小写 | select lower('MYSQL'); 返回:mysql |
upper() | 转大写 | select upper('mysql'); 返回:MYSQL |
substring() | 返回字符串的长度 | select substring('JavaMySQLOracle',5,5); 返回:MySQL |
函数名 | 作用 | 举例 |
curdate() | 获取当前时间 | select curdate(); 返回;2018-11-24 |
curtime() | 获取当前日期 | select curtime(); 返回: |
now() | 获得当前日期和时间 | select now(); 返回:2018-11-24 13:33:48 |
week() | 获得日期date是一年中的第几周 | select week(now()); 返回:37 |
year() | 返回日期的date的年份 | select year(now()); 返回:2018 |
hour() | 返回时间time的小时值 | select hour(now()); 返回:13 |
MINUTE(time) | 获得时间time的分钟值 | select minute(now()); 返回:24 |
DATEDIFF(date1,date2) | 返回日期参数l两个数之间的天数 | select datadiff(now(),'2008-8-8'); 返回:3750 |
adddate(date,n) | 计算日期参数date加上n天后打的日期 | select adddate(now(),5); 返回:2018-11-24 13:36:21 |
函数名 | 作用 | 举例 |
CEIL(X) | 返回大于或等于数值X的最小整数(向上取整) | SELECT CEIL(2.3) 返回:3 |
FLOOR(X) | 返回小于或等于数值X的最大整数(向下取整) | SELECT FLOOR(2.3) 返回:2 |
RAND() | 返回0~1间的随机数 | SELECT RAND() 返回:0.5525468583708134 |
#--------------------------------------------------------------
#---------------------------数学函数---------------------------
#--------------------------------------------------------------
SELECT ABS (-8); #绝对值
SELECT CEILING (9.8); #大于等于我的最小的整数
SELECT FLOOR (9.3); #小于等于我的最大的整数
SELECT RAND (); #返回0~1之间的随机数
SELECT RAND (10); #以某个数作为种子,每次生成重复数字
SELECT SIGN(0); #符号函数,所有的正数返回1,负数返回-1,0返回0
#---------------------------------------------------------------
#------------------------字符串函数-----------------------------
#--------------------------------------------------------------
SELECT CHAR_LENGTH ('好好学习'); #返回字符串的长度
SELECT CONCAT('我','爱','java'); #合并字符串
SELECT INSERT('我爱你java',1,3,'很爱');#替换字符串,从某个位置开始,替换某个长度 ***
SELECT INSERT('我爱你java',10,3,'很爱');#如果起始位置超过字符串的长度,返回原字符串 ***
SELECT LOWER('I LOVE YOU'); #变小写
SELECT UPPER('i love you'); #变大写
SELECT LEFT('北京欢迎你',2); #从左边截取2个
SELECT RIGHT('北京欢迎你',3); #从右边截取3个
SELECT REPLACE('北京欢迎你,你好','你','你们'); #替换 ***
SELECT SUBSTR('北京欢迎您',1,3); #截取,从哪个位置开始,截取到哪个位置 ***
SELECT REVERSE('北京欢迎你'); #反转字符串
#--------------------------------------------------------------
#-----------------------------日期函数-------------------------
#--------------------------------------------------------------
#获得当前的日期
SELECT CURRENT_DATE();
#获得当前的日期前和时间
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 VERSION();
SELECT USER();
#根据出生日期,求出年龄----精准到天
SELECT TIMESTAMPDIFF(YEAR,bornDate,CURDATE()) AS 年龄,bornDate AS 出生日期 FROM student;
#根据出生日期,求出年龄---接近实际周岁
SELECT ROUND(DATEDIFF(CURDATE(),bornDate)/365.2422) AS 年龄,bornDate AS 出生日期 FROM student;
#查询姓李的同学,改成历
SELECT REPLACE(studentName,'李','历') AS 新名字
FROM student WHERE studentName LIKE '李%'
二、基本查询
SELECT<列名|表达式|函数||常量>
FROM <表名>
[WHERE<查询条件表达式>]
[ORDER BY<排序的列名>[ASC或DESC]]
#where条件是可选的,如果不限制,那么就查询所有的数据,ORDER BY 用来排序;
a)所有字段:select * from 表名;
b)指定字段: select 字段名1,字段名2 from 表名;
c)指定别名: select 字段名1 as 别名1,字段名2 as 别名2 from 表名;
其中as 可以省略不写
d)添加常量列: select 常量值 as 别名 from 表名;
e)合并列: select (字段名1+字段名2+....) as 别名 from 表名;
f)去除重复: select distinct 字段名 from 表名;
g)条件查询:
逻辑条件: where 条件1 and/or 条件2;
比较条件: where 字段名 >/>=/</<=/=/<> 值
where 字段名 between 值1 and 值2;
#查询email邮箱为空
select studentName from student where email is null;
Limit分页查询
#语法
select 列名 from 表名 where 条件 Limit 0,5;
#其中0代表起始位置,也就是索引,5代表要显示多少条数据;
在实际开发中如果只要求显示指定位置行数的记录就将用到
三、模糊查询
INSERT INTO student
(StudentNo,StudentName,Sex,GradeId,Phone,Address,Email,IdentityCard)
VALUES
(1111,"郭靖",1,1,"13500000001","北京海淀区中关村大街
1号","[email protected]","450323198612111000"),
(1112,"李文才",1,2,"13500000002","河南洛阳","[email protected]","450323198512311000"),
(1113,"李梅",2,3,"13500000015","上海卢湾区","[email protected]","450323198412311000");
#查询学员姓名中有"%"这个字的同学学号、姓名 转义符
SELECT studentno,studentname FROM student WHERE studentname LIKE '%\%%';
SELECT studentno,studentname FROM student WHERE studentname LIKE '%\_%';
#转移符\ 能不能使用我自己的转移符呢?(:)加入escape
SELECT studentno,studentname FROM student WHERE studentname LIKE '%:%%' ESCAPE ':';
#模糊查询:in null
SELECT studentno,studentname FROM student
WHERE studentno=1000 OR studentno=1001 OR studentno=1003;
SELECT studentno, studentname FROM student
WHERE studentno IN(1000,1001,1002,1003);
SELECT studentno, studentname FROM student
WHERE studentno IN('北京','南京','苏州','扬州');
#null 空
SELECT * FROM student;
INSERT INTO student
(StudentNo,LoginPwd,StudentName,GradeId,Phone,Address,Borndate,Email,IdentityCard)
VALUES
(8888,"笑话",10,15,"13500000011","北京海淀区中关村大街1号",NULL,'[email protected]','45032319861211189'),
(8889,"笑",20,24,"13500000012","河南洛阳",NULL,'[email protected]','450323198512311099');
#查询出生日期没有填写的同学 =null 是错误的 和null 比较必须写is null
SELECT studentname FROM student
WHERE borndate IS NOT NULL;
#区别空字符串与null
SELECT * FROM student;
#查询家庭住址没有写的同学
SELECT studentname FROM student WHERE address='' OR address IS NULL;
#等值连接(和内连接一样)
SELECT s.studentno,studentname,subjectno,studentresult
FROM student s,result r
WHERE r.StudentNo=s.StudentNo;
#非等值连接(就是左边每一列跟右边所有列匹配返回出来)意义不大
SELECT s.studentno,studentname,subjectno,studentresult
FROM student s,result r
四、连接查询
1、内连接查询
#内连接 inner join 查询两个表中的结果中的交集
SELECT s.gradeId AS 年级编号,s.StudentName AS 学生姓名 FROM student AS s
INNER JOIN grade AS g ON g.gradeID=s.gradeID;
2、外连接查询:
#左外连接:以左表为基表,返回左表的数据,右表没有匹配上的以null填充。
select studentName,subjectNo,studentReuslt from student as s
left join result as r on r.studentNo=s.studentNo;
#右外连接:以右表为基表,返回右表的数据,左表没有匹配上的以null填充。
select studentName,subjectNo,studentReuslt from student as s
right join result as r on r.studentNo=s.studentNo;
3、分组查询
#使用group by 子句实现查询
select subjectNo,avg(studentResult) as 课程平均成绩
from result group by subjectNo;
多列分组查询:
#统计每个学期的男,女人数
select count(*) as 人数,gradeId AS 年级,sex as 性别
from student group by grade ,sex order by grade;
注意:在使用group by分组查询时,在select 后面的列的是限制的,一般允许如下:
group by 子句后的列 聚合函数计算出的列
#使用HAVING 子句进行分则查询
select count(*) as 人数,gradeId AS 年级 from student
group by gradeId
having count(*) >3;
#注意:having 子句必须是写在分组后面的
#分组查询顺序
select 列 from 表 where 分组前条件
group by 分组列 having 分组后条件
order by 排序列
limit 分页;
4、子查询
一个查询语句里面嵌套一个查询。外层的叫做符查询,内层里面嵌套的叫做子查询。
select ....... from 表名 where 字段 比较运算符 (子查询);
#其中,在查询过程中,先执行子查询部分,求出子查询部分的值,再执行整个父查询,返回最后的结果。
注意:将子查询和比较运算符联合使用时,必须保证子查询返回的值只有一个,否则比较运算符必须用 IN。
使用 IN 关键字可以使父查询匹配子查询返回多个单字段值,也就是可以返回多个值。
#使用IN子查询
SELECT studentNo,studentName FROM studentWHERE studentNo
IN ( SELECT studentNo FROM result WHERE subjectNo=
( SELECT subjectNo FROM `subject` WHERE subjectName ='Logic Java')
AND examDate =( SELECT MAX(examDate) FROM result
WHERE subjectNo=( SELECT subjectNo FROM `subject` WHERE subjectName ='Logic Java'
)
)
);