数据库DQL语言

一、函数

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'
	)   
     )
);

            
      
            
            
            

            
            
      
          
            
            

            
            
      
            
            
            

            
            
      
            
            
          

            
            
      
            
            
            

            
            

            
            
            

          
            
      
            
            
            

猜你喜欢

转载自blog.csdn.net/weixin_43779926/article/details/84436797