MySQL 使用DQL命令查询数据的实现方法

本篇文章博主将带大家一起学习MySQL中常用的数据查询语言。

DQL(Data Query Language 数据查询语言)

SELECT 语法

SELECT [ALL | DISTINCT]
{ * | table.* | [table.field1 [as alias1][,table.field2] [as alias2][,...]]}
FROM table_name [as table_alias]
[left | out | inner join table_name2] #联合查询
[WHERE ...]   #指定结果需要满足的条件
[GROUP BY ...]   #指定结果按照哪几个字段来分组
[HAVING ...]   #过滤分组的记录必须满足的次要条件
[ODER BY ...]   #指定查询记录按一个或者多个条件排序
[LIMIT [偏移量,返回结果记录数]; #指定查询的记录从哪条至哪条

基本查询语句&AS

以下例子用student表中的数据。

查询表中所有数据列结果,采用 “*” 符号,效率低

select * from student;

可指定查询列,效率高

select StudentName,Phone from student;

 AS 子句的作用和用法

注意:AS 可省略不写

(1)可给数据列取一个新别名

select StudentName as '学生姓名' from student;

(2)给表取别名

select stu.address from student as stu;

(3)可把计算或总结的结果用另一个新名称来代替

SELECT Phone +1 AS Tel FROM student;

DISTINCT 关键字

作用:去掉SELECT查询出来的重复值(当所有返回值都相同时,只返回一条记录)

语法:

SELECT DISTINCT 字段名1,字段名2,... from 表名

注意:ALL 关键字是默认的,返回所有记录,与之相反

当过滤多列重复值时,只有当选择过滤的列都存在重复值才进行过滤

SELECT DISTINCT StudentNo,address from student;

过滤单列:查询学生表中的地址

SELECT DISTINCT address from student;

SQL语句中的表达式

SELECT VERSION(),100*3 as 乘积; #返回Mysql 版本和计算结果

SELECT NOW() '当前时间'; #返回当前时间

避免SQL返回结果中包含“.” ,“*”,和括号等干扰开发语言程序

SELECT VERSION() as MySQL_V,12.3*100 as expression;
#返回结果不会与后台开发程序发生混淆

拼接 CONCAT

SELECT CONCAT(studentName,'@.com') as Email from student;

数值类型相加

select StudentNo+100 from student;

比较运算符&通配符

where条件语句:用于检索数据表中符合条件的记录

搜索条件可以由一个或多个逻辑表达式组成,结果一般为真或假

搜索条件的组成:逻辑操作符、比较操作符

#where 条件语句
select * from student where address='四川';

#查询学生表中电话号码不为空的学员姓名
select StudentName from student where Phone is not null;

#查询学生表中电话号码为空的学员姓名
select StudentName from student where Phone is null;

#查询刚删掉的数据——空值
select StudentName from student where Phone = '';

# BETWEEN AND 适用于时间范围

逻辑操作符

比较操作符

使用 LIKE 关键字进行模糊查询

  • 与“%”一起使用,表示匹配0个或任意个字符
  • 与“_”一起使用 表示匹配单个字符
#查询学生表中姓张*的学生姓名
SELECT StudentName from student where studentname like '张_';

SELECT StudentName from student where studentname like '%丽%';
# IN
SELECT * from student where Address in ('四川','上海');

注意:

  • 数值数据类型的记录之间才能进行算数运算
  • 相同的数据类型的数据之间才能进行比较

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 * from subject ORDER BY classhour; #升序
SELECT * from subject ORDER BY classhour desc; #降序

多字段排序:先按照第一个字段排序,再按照第二个字段排序。如果第一个字段数据相同,再按照第二个字段排序。

SELECT * from subject ORDER BY classHour,GradeID;

LIMIT分页

LIMIT   [m,] n  或  LIMIT  n  OFFSET  m

限制SELECT返回结果的行数

m为第一个返回记录行的偏移量

n返回记录行的数目

注意:

  • m不指定,则偏移量为0,从第一条开始返回前n条记录
  • LIMIT 常用于分页显示
  • 如果超出表中数据,则显示全部

例如:

SELECT * FROM grade LIMIT 3; #返回前3条记录
SELECT * FROM grade LIMIT 1,3; #返回2~4条记录

总记录数:total

SELECT COUNT(subjectNO) '总数据' from subject;

总页数:int  totalPage = total % pagesize ==0 ? total / pagesize : total  / pagesize  + 1

子查询

在查询语句WHERE 条件子句中,又嵌套了另外一个查询语句

注意:子查询返回的结果一般是集合,建议使用IN关键字

SELECT subjectName from subject
where gradeID IN
(SELECT GradeID from grade);

聚合函数

常用的统计函数:COUNT()、SUM()、AVG()、MAX()、MIN()

SELECT COUNT(StudentNo) '总数据' FROM student;
SELECT sum(classHour) '总学时'from subject;
SELECT AVG(classHour) '平均学时' FROM subject;
SELECT MAX(classHour) '最长学时' FROM subject;
SELECT MIN(classHour) '最短学时' FROM subject;

分组 GROUP BY

使用 GROUP BY 关键字对查询结果分组

  • 对所有的数据进行分组统计
  • 分组的字段可以有多个,并依次分组
  • 与 HAVING 结合使用,进行分组后的数据筛选

以 student 表为例

(1)对student 表按照地址分组统计  group by

SELECT Address,COUNT(Address) FROM student GROUP BY Address;

HAVING 过滤分组的记录必须满足的次要条件

(2)对 student 表 按照地址分组,满足地址=1的 HAVING

SELECT GROUP_CONCAT(StudentName),COUNT(Address) FROM student GROUP BY Address HAVING COUNT(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 * FROM subject UNION SELECT * FROM student;
SELECT * FROM subject UNION ALL SELECT * FROM student;

子查询   EXISTS ——>true  false

EXISTS  / NOT EXISTS 子查询条件成立则显示父查询的结果,否则不显示结果

(1)子查询条件为真 (grade 表中 gradeid 1~5,存在 1)

SELECT subjectName,GradeID FROM subject
WHERE EXISTS
(SELECT * FROM grade WHERE GradeID=1);

SELECT subjectName,GradeID FROM subject
WHERE NOT EXISTS
(SELECT * FROM grade WHERE GradeID=999);

(2)子查询条件为假  (grade 表中 gradeid 1~5,不存在 999)

SELECT subjectName,GradeID FROM subject
WHERE EXISTS
(SELECT * FROM grade WHERE GradeID=999);

SELECT subjectName,GradeID FROM subject
WHERE NOT EXISTS
(SELECT * FROM grade WHERE GradeID=1);

子查询(any & all)

ANY :判断条件中,若子查询中任意一个值满足条件,则执行父查询
ALL :判断条件中,若子查询中所有值满足条件,则执行父查询
 (1)满足条件:存在 subject.gradeid >= grade.gradeid ,执行父查询

SELECT subjectname,gradeid FROM subject
WHERE GradeID >=ANY
(SELECT GradeID FROM grade);

(2)不满足条件:所有subject.gradeid >= grade.gradeid ,不执行父查询

SELECT subjectname,gradeid FROM subject
WHERE GradeID >=ALL
(SELECT GradeID FROM grade);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2019-08-13

数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)

Oracle查询结果集,随机排序 复制代码 代码如下: select * from table1 order by dbms_random.value(); MySQL随机查询出一条记录: 复制代码 代码如下: -- 下面的查询语句效率高,不要使用 SELECT * FROM table1 ORDER BY rand() LIMIT 1 来查询 SELECT * FROM table1 WHERE id=(SELECT id FROM table1 ORDER BY rand() LIMIT 1

MySQL查询本周、上周、本月、上个月份数据的sql代码

查询当前这周的数据 SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now()); 查询上周的数据 SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now())-1; 查询当前月份的数据 se

MYSQL如何自动为查询数据的结果编上序号详解

前言 其实自己之前没遇到过这种在查询时给结果编号的情况,是同事打算跳槽,面试回来问到这种情况才想到去研究,以下以单表查询为例分析下: SQL: SELECT (@i:=@i+1) i,user_id,user_name FROM `dt_user_all_orders`, (SELECT @i:=0) as i WHERE user_name='qqqqqqqqqq' LIMIT 0,10; 结果: 如果需要分组后再进行序号显示: SELECT drug_productor,@y:=@y+1 a

MySQL使用select语句查询指定表中指定列(字段)的数据

本文介绍MySQL数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下SQL语句中的select语句的语法: Select 语句的基本语法: Select <列的集合> from <表名> where <条件> order by <排序字段和方式> 如果要查询某个表中的指定列的所有数据,则查询语句可以写作: select 列名1,列名2,列名3... from <表名> 要说明一个,这个语句后面仍然可以使用wher

MySQL中查询所有数据库占用磁盘空间大小和单个库中所有表的大小的sql语句

查询所有数据库占用磁盘空间大小的SQL语句: 复制代码 代码如下: select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),' MB') as data_size,concat(truncate(sum(index_length)/1024/1024,2),'MB') as index_sizefrom information_schema.tablesgroup by TABLE_SCHEMAorder by dat

mysql随机查询若干条数据的方法

在mysql中查询5条不重复的数据,使用以下: 复制代码 代码如下: SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了.但是真正测试一下才发现这样效率非常低.一个15万余条的库,查询5条数据,居然要8秒以上搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据. 复制代码 代码如下: SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX

mysql查询表里的重复数据方法

INSERT INTO hk_test(username, passwd) VALUES ('qmf1', 'qmf1'),('qmf2', 'qmf11') delete from hk_test where username='qmf1' and passwd='qmf1' MySQL里查询表里的重复数据记录: 先查看重复的原始数据: 场景一:列出username字段有重读的数据 select username,count(*) as count from hk_test group by

MySQL查询随机数据的4种方法和性能对比

下面从以下四种方案分析各自的优缺点.方案一: 复制代码 代码如下: SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1; 这种方法的问题就是非常慢.原因是因为MySQL会创建一张零时表来保存所有的结果集,然后给每个结果一个随机索引,然后再排序并返回.有几个方法可以让它快起来.基本思想就是先获取一个随机数,然后使用这个随机数来获取指定的行.由于所有的行都有一个唯一的id,我们将只取最小和最大id之间的随机数,然后获取id为这个数行.为了让这个方法当id不

Sql查询MySql数据库中的表名和描述表中字段(列)信息

下面为大家介绍利用SQL查询语句获取Mysql数据库中表的表名,表描述.字段ID.字段名.数据类型.长度.精度.是否可以为null.默认值.是否自增.是否是主键.列描述 一.查询表信息(表名/表描述) SELECT table_name name,TABLE_COMMENT value FROM INFORMATION_SCHEMA.TABLES WHERE table_type='base table' and table_schema = '数据库名' order by table_name

mysql 查询数据库中的存储过程与函数的语句

方法一: select `name` from mysql.proc where db = 'your_db_name' and `type` = 'PROCEDURE' //存储过程 select `name` from mysql.proc where db = 'your_db_name' and `type` = 'FUNCTION' //函数 方法二: show procedure status; //存储过程 SHOW PROCEDURE STATUS WHERE db='serva

MySql数据库查询结果用表格输出PHP代码示例

在一般的网站中,我们会通常看到,很多数据库中表的数据在浏览器都是出现在表格中的,一开始让自己感到很神奇,但是仔细想想也不算太复杂,既然可以dql和dml的一般返回,以表格的方式返回应该也不成问题,但是,有一点说明的是,在客户端设计脚本去实现问题是不对的,即便可以实现起来也是非常复杂,所以,只能在服务器的方面去考虑,想想问题解决的方式就有了,即在返回的时候打印表格标签和对应属性和属性值,虽然说这种方式看起来不太合理,但是这也是最为有效的方法.具体的代码如下: <?php //在表格中显示表的数据,

mysql查询昨天 一周前 一月前 一年前的数据

mysql 昨天 一周前 一月前 一年前的数据 这里主要用到了DATE_SUB, 参考如下 复制代码 代码如下: SELECT * FROM yh_contentwhere inputtime>DATE_SUB(CURDATE(), INTERVAL 1 DAY)where inputtime>DATE_SUB(CURDATE(), INTERVAL 1 WEEK)where inputtime>DATE_SUB(CURDATE(), INTERVAL 1 MONTH)where inp

MySQL中查询某一天, 某一月, 某一年的数据代码详解

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天(包括昨天和今天的数据) SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 昨天(只包括昨天) SELECT * FROM 表名 WHERE DATEDIFF(字段,NOW())=-1; -- 同理,查询前天的就是-2 近7天 SELECT * FROM 表名 where DATE_SUB(CURD

mysql中获取一天、一周、一月时间数据的各种sql语句写法

创建表: 复制代码 代码如下: create table if not exists t(   id int,   addTime datetime default '0000-00-00 00:00:00′) 添加两条初始数据: insert t values(1, '2012-07-12 21:00:00′);insert t values(2, '2012-07-22 21:00:00′); 一.当天或当日插入的数据: 1.传统对比判断:SELECT * FROM `t` WHERE DA

mysql查询今天、昨天、近7天、近30天、本月、上一月的SQL语句

mysql查询今天,昨天,近7天,近30天,本月,上一月数据的方法分析总结: 话说有一文章表article,存储文章的添加文章的时间是add_time字段,该字段为int(5)类型的,现需要查询今天添加的文章总数并且按照时间从大到小排序,则查询语句如下: 复制代码 代码如下: select * from `article` where date_format(from_UNIXTIME(`add_time`),'%Y-%m-%d') = date_format(now(),'%Y-%m-%d')

mysql使用GROUP BY分组实现取前N条记录的方法

本文实例讲述了mysql使用GROUP BY分组实现取前N条记录的方法.分享给大家供大家参考,具体如下: MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~): 结果: 方法一: 复制代码 代码如下: SELECT a.id,a.SName,a.ClsNo,a.Score FROM aa a LEFT J

mysql 获取昨天日期、今天日期、明天日期以及前一个小时和后一个小时的时间

1.当前日期 select DATE_SUB(curdate(),INTERVAL 0 DAY) ; 2.明天日期 select DATE_SUB(curdate(),INTERVAL -1 DAY) ; 3.昨天日期 select DATE_SUB(curdate(),INTERVAL 1 DAY) ; 4.前一个小时时间 select date_sub(now(), interval 1 hour); 5.后一个小时时间 select date_sub(now(), interval -1

mysql 查询当天、本周,本月,上一个月的数据

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名) 近30天 SELECT * FROM 表名 where DATE_SUB(CURDATE(

使用Limit参数优化MySQL查询的方法

前些天看了一个老外写的程序,在 MySQL 查询中使用了很多 Limit 关键字,这就让我很感兴趣了,因为在我印象中, Limit 关键字似乎更多被使用 MySQL 数据库的程序员用来做查询分页(当然这也是一种很好的查询优化),那在这里举个例子,假设我们需要一个分页的查询 ,Oracle中一般来说都是用以下 SQL 句子实现: SELECT * FROM ( SELECT a1.*, rownum rownum_ FROM testtable a1 WHERE rownum > 20) WHER

MySQL 查询速度慢与性能差的原因与解决方法

一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是"每秒查询率",是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准. TPS: 是 TransactionsPerSecond的缩写,也就是事务数/秒.它是软件测试结果的测量单位.客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数. Tips: 最好不要在主库上数据库备

MySQL查询语句简单操作示例

本文实例讲述了MySQL查询语句简单操作.分享给大家供大家参考,具体如下: 查询 创建数据库.数据表 -- 创建数据库 create database python_test_1 charset=utf8; -- 使用数据库 use python_test_1; -- students表 create table students( id int unsigned primary key auto_increment not null, name varchar(20) default '',