SQL介绍(四)单表查询

主要参考:

书籍:

MySQL数据库应用从入门到精通 中国铁道出版社


SQL相关介绍合集: 

SQL介绍(一)创建数据库,表的操作(创建,更新,删除):https://blog.csdn.net/qq_41605114/article/details/97292616

SQL介绍(二)完整性约束,数据类型,索引(创建,更新,删除):https://blog.csdn.net/qq_41605114/article/details/97392269

SQL介绍(三)触发器:https://blog.csdn.net/qq_41605114/article/details/97794131

SQL介绍(四)单表查询:https://blog.csdn.net/qq_41605114/article/details/97934605

Qt:MySQL数据库总结(表的创建,插入,各种查询方式,删除,封装时需要的dll):https://blog.csdn.net/qq_41605114/article/details/90671791

 Qt封装调用MySQL的软件时所需的依赖项:https://blog.csdn.net/qq_41605114/article/details/86612264


 

1.1简单数据记录查询

在MySQL中数据查询通过SQL语句SELECT来实现,简单数据查询语法。

SELECT field1,field2...fieldn
       FROM table_name;

在上述语句中,参数field表示所要查询的字段名字,参数table_name表示所要查询数据记录的表名。实现简单数据记录查询的SQL语句可以通过如下几种方式使用:

  • 简单数据查询
  • 避免重复数据查询
  • 实现数学四则运算数据查询
  • 设置显示格式数据查询

1.1.1简单数据查询

在MySQL软件中可以通过SELECT语句来实现简单数据查询,该SQL语句可以通过如下几种方式使用:

  • 查询所有字段数据
  • 查询指定字段数据

查询所有字段数据

SELECT empno,ename,job,MGR,Hiredata,sal,comn,deptno
       FORM t_employee;

以上方法实现查询所有字段数据,这种方式比较灵活,如果需要改变字段显示的顺序,只需调整SELECT关键字后面的字段列表顺序即可。

“*”符号的使用

SELECT *
       FROM t_employee;

查询字段数据,除了使用上面的方式外,还可以通过符号“*”来实现,具体语法形式如下:

查询指定字段数据

SELECT empno,ename,sal
       FROM t_employee;

只查询t_employee中empnol,ename,sal字段的数据。

1.1.2避免重复数据查询——DISTINCT

当在MySQL软件中执行简单数据查询时,有时会显示出重复数据。为了实现查询不重复的数据,MySQL软件提供了关键字——DISTINCT。

语法如下:

SELECT DISTINCT field1 field2 ...fieldn
       FROM table_name;

查询t_employee中字段job的数据,同时实现去除重复数据。 

SELECT DISTINCT job
       FROM t_employee;

1.1.3实现数学四则运算数据查询

当在MySQL软件中执行简单数据查询时,有时会需要实现数学四则运算(+,-,*,/,%)加减乘除取余;

由于字段sal表示每月的工资,所以在查询字段sal的值时需要进行简单的四则运算。

SELECT ename ,sal*12
       FROM t_employee;

但是执行结果显示,已经查询到每个雇员的年薪,但是显示的查询字段为“sal*12”,不方便用户浏览。在MySQL软件中,提供一种机制来实现字段名,具体语法如下:

SELECT field1 [AS] otherfield1,field2 [AS] otherfield2
       FROM table_name;

在上述语句中,参数field为字段原来的名字,参数otherfield为字段的新名字,设置新的名字是为了更加方便直观和方便

SELECT ename,sal*12 AS yearsalary
       FROM t_employee;

1.1.4设置显示格式数据查询

在Mysql中查询数据,有时候需要设置显示格式,以方便用户浏览所查询到的数据。

SELECT CONCAT(ename,'雇员的年薪为:',sal*12) yearsalary
       FROM t_emplyee;

其中CONCAT();为连接函数的字符串。

显示结果为:jiafeng雇员的年薪为:20000;

1.2条件数据记录查询

在简单查询中可以查询所有记录相关字段数据,但是具体应用中,用户并不需要查询所有数据记录,而只需要限制条件来查询一部分数据记录。

通过where来进行限制

SELECT field1 field2 ...fieldn
       FORM table_name
            WHERE CONDITION;

在上述语句中通过参数CONDITION对数据进行查询。关于条件数据查询语句可以包含如下功能:

  • 带关系运算符和逻辑运算符的条件数据查询
  • 带BETWEEN AND关键字的条件数据查询
  • 带IS NULL关键字的条件数据查询
  • 带IN关键字的条件数据查询
  • 带LIKE关键字的条件数据查询

1.2.1设置显示格式数据查询

在MySQL软件中,可以通过关系运算符和逻辑运算符来编写“条件表达式”。

单条件数据查询

SELECT ename
       FORM t_employee
            WHERE job=‘CLERK’;

查询表中job = ‘CLERK’表达式。

多条件数据查询

SELECT ename
       FORM t_employee
            WHERE job=‘CLERK’&&sal>800;

查询符合job = ‘CLERK’和sal大于800的ename内容;

1.2.2带BETWEEN AND关键字的范围查询

MySQL软件提供了关键字BETWEEN AND ,用来实现判断字段的数值是否在指定范围内

SELECT field1 field2 ...fieldn
       FROM table_name
           WHERE field BETWEEN VALUE1 AND VALUE2;

在上述语句中,通过关键字BETWEEN AND来设置字段field的取值范围,如果字段field的值在指定范围内,则满足查询条件,该记录就会被查询出来

符合范围的数据记录查询

SELECT ename
       FROM t_employee
           WHERE sal BETWEEN 1000 AND 2000;

不符合范围的数据记录查询

SELECT ename
       FROM t_employee
           WHERE sal NOT BETWEEN 1000 AND 2000;

1.2.3带IS NULL关键字的空值查询

SELECT field1 field2 ...fieldn
       FROM table_name
           WHERE field IS NULL;

在上述语句中,通过关键字IS NULL来判断字段field的值是否为空,如果为空,则满足条件,会被查询出来

不空值数据记录查询

SELECT ename
       FROM table_name
           WHERE comm IS NULL;

 符合条件则会被查询出来

不空值数据记录查询

SELECT ename
       FROM table_name
           WHERE comm IS NOT NULL;

1.2.4带IN关键字的集合查询

MySQL软件提供了关键字IN,用来实现判断字段的数值是否在指定集合中的条件查询,关于该关键字的具体语法形式如下

SELECT field1 field2 ...fieldn
       FROM table_name
            WHERE field IN (value1,value2...,valuen);

在上述语句中,参数value表示集合中的值,通过关键字IN来判断字段field的值是否在集合(value1,value2,...valuen);

如果字段field的值在集合中,则满足查询条件,该记录就会被查询出来,否则不会被查询出来。

在集合中数据记录查询

查询员工编号为7521,7782,7566,7788的雇员

SELECT ename
       FROM t_employee
            WHERE empno=7521 or empno=7782 or empno=7566 or empno=7788;

使用IN

查询员工编号为7521,7782,7566,7788的雇员

SELECT ename
       FROM t_employee
            WHERE empno IN (7521,7782,7566,7788);

不在集合中数据记录查询

查询员工编号不为7521,7782,7566,7788

SELECT ename
       FROM t_employee
            WHERE empno NOT IN (7521,7782,7566,7788);

1.2.5带LIKE关键字的模糊查询

以上所述内容,均是针对已经知道数据值进行查询操作,但是这种操作并不适合任何情况,例如:查询雇员名字中包含文本“cjgon”的所有雇员,此时利用比较操作符(=)肯定不行,这时就是需要通过通配符来实现模糊查询。

SELECT field1 field2 ...fieldn
       FROM table_name
            WHERE field LIKE value;

在上述语句中,参数value表示所匹配的字符串值,通过关键字LIKE来判断字段field的值是否与value字符串匹配,如果字段field的值和value相匹配,则满足查询条件,该记录就会被查询出来,否则不会被查询出来。

对于字符串单引号(''),双引号(" ")。由于关键字LIKE可以实现模糊查询,所以该关键字后面的字符串参数除了可以是一个完整的字符串外,还可以包含通配符,LIKE关键字支持的通配符如下:

"_"通配符:该通配符值能匹配单个字符。

"%"通配符:该通配符值可以匹配任意长度的字符串,既可以是6个字符,1个字符,也可以是很多个字符。

带"%"通配符的查询

SELECT ename
       FROM t_employee
            WHERE ename LIKE 'A%';

此程序的执行结果,查询所有名字里以A开头的雇员。MySQL不区分大小写,a%也可。

SELECT ename
       FROM t_employee
            WHERE NOT ename LIKE 'A%';

 如果想查询不是以A开头的全部雇员,可以执行逻辑非运算符(NOT或!);

以上程序执行结果,查询名字不是以A开头的雇员都会被显示出来。

带"_"通配符的查询

SELECT ename
       FROM t_employee
            WHERE NOT ename LIKE '_A%';

 此程序的执行结果,查询所以查看ename第二个字母为字符A的内容。如果想查询名字第二个字母不是A的内容,在where后面加上not即可。

带LIKE关键字的模糊查询注意点

出去LIKE外,还有NOT LIKE供大家使用,加入NOT后,表示查询不匹配value的记录

SELECT field1 field2 ...fieldn
       FROM table_name
            WHERE field [NOT] LIKE value;

举例:查询ename中,没有字母A的数据记录,当然,也可以通过逻辑运算符(NOT或!)来进行操作

SELECT ename
       FROM t_employee
            WHERE ename NOT LIKE '%A%';
            -WHERE NOT ename LIKE '_A%';

举例:查询ename中所有的数据记录

SELECT sal
       FROM t_employee
            WHERE sal LIKE '%%';

举例:查询ename中包含5的数据记录

SELECT ename
       FROM t_employee
            WHERE ename LIKE '%5%';

1.3排序数据记录查询

通过条件数据查询,虽然可以查询到符合用户需求的数据记录,但是查询到的记录在默认情况下,都是按照数据记录最初添加到表中的顺序来显示。默认的查询结果顺序并不满足用户的需求。于是MySQL软件提供了关键字ORDER BY来设置查询结果的顺序。

SELECT field1 field2 ...fieldn
       FROM table_name
            WHERE CONDITION
                ORDER BY fieldm1 [ASC|DESC] [,fieldm2[ASC|DESC],];

在上述语句中,通过参数fieldm表示按照该字段进行排序,参数ASC表示按升序的顺序进行排序,参数DESC表示按照降序的顺序进行排序。

在默认情况下按照ASC(升序)进行排序,还可以在关键字ORDER BY后面设置多个不同的字段进行排序。

关于排序数据查询结果语句包含如下功能:

  • 按照单字段排序
  • 按照多字段排序

1.3.1按照单字段排序

MySQL软件中如果想实现按照单字段进行排序,关键字ORDER BY后面将只有一个字段

升序排序

SELECT *
       FROM t_employee
           ORDER BY sal ASC;
           -ORDER BY sal;

按照关键字ORDER BY的操作字段sal,同时通过关键字ASC设置为升序排序。 也可以省略升序ASC通配符,默认为升序。

降序排序

SELECT *
       FROM t_employee
           ORDER BY mgr DESC;

按照关键字ORDER BY的操作字段mgr,同时通过关键字DESC设置为降序排序。

1.3.2按照多字段排序

 如果字段mgr中存在值相同的数据记录,为了解决该问题,可以按照多字段进行排序,首先按照第一个字段进行排序,如果遇到值相同的字段则会按照第二个字段进行排序。

SELECT *
       FROM t_employee
           ORDER BY mgr DESC,
                    hiredata ASC;

1.4限制数据记录查询数据

通过条件数据查询,虽然可以查询到符合用户需求的数据记录,但是有时所查询到的数据记录太多,对于这么多数据记录,如果全部显示则不符合实际需求,这时可以通过MySQL软件提供的关键字LIMIT来限制查询结果的数量。

SELECT field1 field2 ...fieldn
       FROM table_name
            WHERE CONDITION
                LIMIT OFFSET_START,ROW_COUNT;

1.4.1不指定初始位置

显示记录数小于查询结果

SELECT *
       FROM t_employee
            WHERE comm is NULL
                LIMIT 2;

执行SQL语句LIMIT,查询字段comm值为NULL的数据记录,最后只显示两条查询结果,具体SQL语句如上:

显示记录数大于查询结果

SELECT *
       FROM t_employee
            WHERE comm is NULL
                LIMIT 11;

 如果查询数大于记录数,那么只会全部显示记录数。

1.4.2指定初始位置

LIMIT关键字经常被应用在分页系统中,对于第一项的数据记录,可以通过不指定初始位置来实现,但是对于第二页等其他页面则必须指定初始位置(OFFSET_START),否则将无法实现分页功能,除此之外,LIMIT关键字还经常与OREDER BY关键字一起使用,即先对查询结果进行排序,然后显示其中部分数据记录。

语法如下:

SELECT field1 field2 ...fieldn
       FROM table_name
            WHERE CONDITION
               ORDER BY fieldm1 [ASC|DESC] [,fieldm2[ASC|DESC],]
                 LIMIT OFFSET_START,ROW_COUNT;

 查询t_employee中,查询字段comm的所有雇员,然后对排序结果根据入职时间(字段hiredata)进行从早到晚排序,并从第一条数据开始显示,共显示5条记录。

SELECT *
       FROM t_employee
            WHERE comm is NULL
            ORDER BY hiredate LIMIT 0,5;

在MySQL中,LIMIT中参数OFFSET_START的值默认为0,所以上述SQL语句可以修改如下:

SELECT *
       FROM t_employee
            WHERE comm is NULL
            ORDER BY hiredate LIMIT 5;

1.5统计函数和分组数据记录查询

在MySQL软件中,很多情况下都需要进行一些统计汇总操作,比如,统计整个公司的人数或整个部门的人数,这时候就会用到该软件所支持的统计函数,分别为:

COUNT()函数:该统计函数实现统计表中记录的条数

AVG()函数:该统计函数实现计算字段值的平均值

SUM()函数:该统计函数实现计算字段值的总和

MAX()函数:该统计函数实现查询字段值的最大值

MIN()函数:该统计函数实现查询字段值的最小值

1.5.1MySQL支持的统计函数

在MySQL软件中,为了实现统计功能专门提供了5个统计函数,查看帮助文档可以发现,利用统计函数的查询语法形式如下:

SELECT function(field)
       FROM  table_name
             WHERE CONDITION;

统计数据记录条数-COUNT()

COUNT(*):这种方式可以实现对表中记录进行统计,不管表字段中包含的是NULL值还是非NULL值。

COUNT(field):这种方式可以实现对指定字段的记录进行统计,在具体统计时将忽略NULL值。

SELECT COUNT(*) number
       FROM t_employee;

除此之外,还可以对相应的字段进行操作。

SELECT COUNT(comm) number
       FROM t_employee;

也可以在查询的时候加入限制条件:

比如不算入comm为零的记录,对comm进行统计:

SELECT COUNT(comm) number
       FROM t_employee
       WHERE NOT comm = 0;

统计计算平均值-AVG()

AVG(field)使用方式:该中方法可以实现对指定字段的平均值进行计算,在具体统计时将忽略NULL值。

SELELCT AVG(comm) average
        FROM t_employee;

 虽然AVG()在执行中忽略了NULL,但是没有忽略0,所以:

SELECT AVG(comm) average
       FROM t_employee
       WHERE NOT comm = 0;

为零的部分全部不进行计算。

统计计算平均值-SUM()

再具体统计时将忽略NULL值。

SELECT SUM(sal) sumvalue
       FROM t_employee;

 虽然SUM()在执行中忽略了NULL,但是没有忽略0,所以:

SELECT SUM(comm) sumvalue
       FROM t_employee
       WHERE NOT comm = 0;

统计计算最大值和最小值

MAX(field):这种方式可以实现计算指定字段值中的最大值,在具体计算时会忽略NULL值。

MIN(field):这种方式可以实现计算指定字段值中的最小值,在具体计算时会忽略NULL值。

SELECT MAX(sal) maxvalue,Min(sal) minval
       FROM t_employee;

关于统计函数注意点

对于mysql软件所支持的统计函数,如果所操作的表中没有任何数据记录,则COUNT返回0,其余返回NULL。

1.5.3分组数据查询——简单分组查询

MySQl软件提供了5个统计函数来帮助用户统计数据,使用户很方便地实现对记录进行统计数,计算和,计算平均数,计算最大值和计算最小值,而不需要查询所有数据。

在具体使用统计函数时,都是针对表中所有记录数或指定特定条件(WHERE)的数据进行统计计算。

但是在现实应用中,经常会把所有数据记录进行分组,然后再对这些分组后的数据记录进行统计计算。

MySQL可以使用CROUP BY来实现,分组数据查询语法形式如下:

SELECT function()
       FROM table_name
            WHERE CONDITION
            GROUP BY field;

1.5.4分组数据查询——实现统计功能分组查询

SELECT *
       FROM t_employee
            GROUP BY deptne;

 

1.5.5分组数据查询——实现多个字段分组查询

 

1.5.6分组数据查询——实现HAVING子句限定分组查询

 

你可能感兴趣的:(Qt,数据库)