怎么在MySQL中使用DQL命令查询数据
怎么在MySQL中使用DQL命令查询数据?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
SELECT 语法
SELECT[ALL|DISTINCT]{*|table.*|[table.field1[asalias1][,table.field2][asalias2][,...]]}FROMtable_name[astable_alias][left|out|innerjointable_name2]#联合查询[WHERE...]#指定结果需要满足的条件[GROUPBY...]#指定结果按照哪几个字段来分组[HAVING...]#过滤分组的记录必须满足的次要条件[ODERBY...]#指定查询记录按一个或者多个条件排序[LIMIT[偏移量,返回结果记录数];#指定查询的记录从哪条至哪条
基本查询语句&AS
以下例子用student表中的数据。
查询表中所有数据列结果,采用 “*” 符号,效率低
select*fromstudent;
可指定查询列,效率高
selectStudentName,Phonefromstudent;
AS 子句的作用和用法
注意:AS 可省略不写
(1)可给数据列取一个新别名
selectStudentNameas'学生姓名'fromstudent;
(2)给表取别名
selectstu.addressfromstudentasstu;
(3)可把计算或总结的结果用另一个新名称来代替
SELECTPhone+1ASTelFROMstudent;
DISTINCT 关键字
作用:去掉SELECT查询出来的重复值(当所有返回值都相同时,只返回一条记录)
语法:
SELECTDISTINCT字段名1,字段名2,...from表名
注意:ALL 关键字是默认的,返回所有记录,与之相反
当过滤多列重复值时,只有当选择过滤的列都存在重复值才进行过滤
SELECTDISTINCTStudentNo,addressfromstudent;
过滤单列:查询学生表中的地址
SELECTDISTINCTaddressfromstudent;
SQL语句中的表达式
SELECTVERSION(),100*3as乘积;#返回Mysql版本和计算结果SELECTNOW()'当前时间';#返回当前时间
避免SQL返回结果中包含“.” ,“*”,和括号等干扰开发语言程序
SELECTVERSION()asMySQL_V,12.3*100asexpression;#返回结果不会与后台开发程序发生混淆
拼接CONCAT
SELECTCONCAT(studentName,'@.com')asEmailfromstudent;
数值类型相加
selectStudentNo+100fromstudent;
比较运算符&通配符
where条件语句:用于检索数据表中符合条件的记录
搜索条件可以由一个或多个逻辑表达式组成,结果一般为真或假
搜索条件的组成:逻辑操作符、比较操作符
#where条件语句select*fromstudentwhereaddress='四川';#查询学生表中电话号码不为空的学员姓名selectStudentNamefromstudentwherePhoneisnotnull;#查询学生表中电话号码为空的学员姓名selectStudentNamefromstudentwherePhoneisnull;#查询刚删掉的数据——空值selectStudentNamefromstudentwherePhone='';#BETWEENAND适用于时间范围
逻辑操作符
比较操作符
使用 LIKE 关键字进行模糊查询
与“%”一起使用,表示匹配0个或任意个字符
与“_”一起使用 表示匹配单个字符
#查询学生表中姓张*的学生姓名SELECTStudentNamefromstudentwherestudentnamelike'张_';SELECTStudentNamefromstudentwherestudentnamelike'%丽%';#INSELECT*fromstudentwhereAddressin('四川','上海');
注意:
数值数据类型的记录之间才能进行算数运算
相同的数据类型的数据之间才能进行比较
NULL
null 代表“无值”
区别于零值0和空字符串“ ”
只能出现在定义允许为NULL的字段
须使用 IS NULL 或 IS NOT NULL 比较操作符去比较
内连接&自查询
如果需要多张数据表的数据进行查询,则可以通过连接运算符实现多个查询。
分类包括:
内连接(inner jion):
等值和非等值的连接查询
自身连接查询
外连接(out jion)
左连接(LEFT JION)
右连接(RIGHT JION)
ORDER BY 排序查询
对select 语句查询得到的结果,按某些字段进行排序
与DESC(降序)或ASC(升序)搭配使用,默认为ASC
以subject表和grade表数据为例:
SELECT*fromsubjectORDERBYclasshour;#升序SELECT*fromsubjectORDERBYclasshourdesc;#降序
多字段排序:先按照第一个字段排序,再按照第二个字段排序。如果第一个字段数据相同,再按照第二个字段排序。
SELECT*fromsubjectORDERBYclassHour,GradeID;
LIMIT分页
LIMIT [m,] n 或 LIMIT n OFFSET m
限制SELECT返回结果的行数
m为第一个返回记录行的偏移量
n返回记录行的数目
注意:
m不指定,则偏移量为0,从第一条开始返回前n条记录
LIMIT 常用于分页显示
如果超出表中数据,则显示全部
例如:
SELECT*FROMgradeLIMIT3;#返回前3条记录SELECT*FROMgradeLIMIT1,3;#返回2~4条记录
总记录数:total
SELECTCOUNT(subjectNO)'总数据'fromsubject;
总页数:int totalPage = total %pagesize ==0 ? total / pagesize : total / pagesize + 1
子查询
在查询语句WHERE 条件子句中,又嵌套了另外一个查询语句
注意:子查询返回的结果一般是集合,建议使用IN关键字
SELECTsubjectNamefromsubjectwheregradeIDIN(SELECTGradeIDfromgrade);
聚合函数
常用的统计函数:COUNT()、SUM()、AVG()、MAX()、MIN()
SELECTCOUNT(StudentNo)'总数据'FROMstudent;SELECTsum(classHour)'总学时'fromsubject;SELECTAVG(classHour)'平均学时'FROMsubject;SELECTMAX(classHour)'最长学时'FROMsubject;SELECTMIN(classHour)'最短学时'FROMsubject;
分组GROUP BY
使用 GROUP BY 关键字对查询结果分组
对所有的数据进行分组统计
分组的字段可以有多个,并依次分组
与 HAVING 结合使用,进行分组后的数据筛选
以 student 表为例
(1)对student 表按照地址分组统计 group by
SELECTAddress,COUNT(Address)FROMstudentGROUPBYAddress;
HAVING 过滤分组的记录必须满足的次要条件
(2)对 student 表 按照地址分组,满足地址=1的 HAVING
SELECTGROUP_CONCAT(StudentName),COUNT(Address)FROMstudentGROUPBYAddressHAVINGCOUNT(Address)=1;
合并 UNION 、UNION
ALLUNION#合并完全相同数据
UNION ALL #合并所有数据
注意:合并两张表时,列数必须一样才能合并。
两表列数不同时,会报以下错误:
[SQL]SELECT * FROM grade UNION SELECT * FROM student;
[Err] 1222 - The used SELECT statements have a different number of columns
(1)合并 subject 表和student表
SELECT*FROMsubjectUNIONSELECT*FROMstudent;SELECT*FROMsubjectUNIONALLSELECT*FROMstudent;
子查询 EXISTS——>true false
EXISTS / NOT EXISTS 子查询条件成立则显示父查询的结果,否则不显示结果
(1)子查询条件为真 (grade 表中 gradeid 1~5,存在1)
SELECTsubjectName,GradeIDFROMsubjectWHEREEXISTS(SELECT*FROMgradeWHEREGradeID=1);
或
SELECTsubjectName,GradeIDFROMsubjectWHERENOTEXISTS(SELECT*FROMgradeWHEREGradeID=999);
(2)子查询条件为假(grade 表中 gradeid 1~5,不存在999)
SELECTsubjectName,GradeIDFROMsubjectWHEREEXISTS(SELECT*FROMgradeWHEREGradeID=999);
或
SELECTsubjectName,GradeIDFROMsubjectWHERENOTEXISTS(SELECT*FROMgradeWHEREGradeID=1);
子查询(any & all)
ANY :判断条件中,若子查询中任意一个值满足条件,则执行父查询
ALL :判断条件中,若子查询中所有值满足条件,则执行父查询
(1)满足条件:存在 subject.gradeid >= grade.gradeid ,执行父查询
SELECTsubjectname,gradeidFROMsubjectWHEREGradeID>=ANY(SELECTGradeIDFROMgrade);
(2)不满足条件:所有subject.gradeid >= grade.gradeid ,不执行父查询
SELECTsubjectname,gradeidFROMsubjectWHEREGradeID>=ALL(SELECTGradeIDFROMgrade);
看完上述内容,你们掌握怎么在MySQL中使用DQL命令查询数据的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。