主要参考:
书籍:
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
在MySQL中数据查询通过SQL语句SELECT来实现,简单数据查询语法。
SELECT field1,field2...fieldn
FROM table_name;
在上述语句中,参数field表示所要查询的字段名字,参数table_name表示所要查询数据记录的表名。实现简单数据记录查询的SQL语句可以通过如下几种方式使用:
在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字段的数据。
当在MySQL软件中执行简单数据查询时,有时会显示出重复数据。为了实现查询不重复的数据,MySQL软件提供了关键字——DISTINCT。
语法如下:
SELECT DISTINCT field1 field2 ...fieldn
FROM table_name;
查询t_employee中字段job的数据,同时实现去除重复数据。
SELECT DISTINCT job
FROM t_employee;
当在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;
在Mysql中查询数据,有时候需要设置显示格式,以方便用户浏览所查询到的数据。
SELECT CONCAT(ename,'雇员的年薪为:',sal*12) yearsalary
FROM t_emplyee;
其中CONCAT();为连接函数的字符串。
显示结果为:jiafeng雇员的年薪为:20000;
在简单查询中可以查询所有记录相关字段数据,但是具体应用中,用户并不需要查询所有数据记录,而只需要限制条件来查询一部分数据记录。
通过where来进行限制
SELECT field1 field2 ...fieldn
FORM table_name
WHERE CONDITION;
在上述语句中通过参数CONDITION对数据进行查询。关于条件数据查询语句可以包含如下功能:
在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内容;
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;
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;
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);
以上所述内容,均是针对已经知道数据值进行查询操作,但是这种操作并不适合任何情况,例如:查询雇员名字中包含文本“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外,还有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%';
通过条件数据查询,虽然可以查询到符合用户需求的数据记录,但是查询到的记录在默认情况下,都是按照数据记录最初添加到表中的顺序来显示。默认的查询结果顺序并不满足用户的需求。于是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后面设置多个不同的字段进行排序。
关于排序数据查询结果语句包含如下功能:
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设置为降序排序。
如果字段mgr中存在值相同的数据记录,为了解决该问题,可以按照多字段进行排序,首先按照第一个字段进行排序,如果遇到值相同的字段则会按照第二个字段进行排序。
SELECT *
FROM t_employee
ORDER BY mgr DESC,
hiredata ASC;
通过条件数据查询,虽然可以查询到符合用户需求的数据记录,但是有时所查询到的数据记录太多,对于这么多数据记录,如果全部显示则不符合实际需求,这时可以通过MySQL软件提供的关键字LIMIT来限制查询结果的数量。
SELECT field1 field2 ...fieldn
FROM table_name
WHERE CONDITION
LIMIT OFFSET_START,ROW_COUNT;
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;
如果查询数大于记录数,那么只会全部显示记录数。
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;
在MySQL软件中,很多情况下都需要进行一些统计汇总操作,比如,统计整个公司的人数或整个部门的人数,这时候就会用到该软件所支持的统计函数,分别为:
COUNT()函数:该统计函数实现统计表中记录的条数
AVG()函数:该统计函数实现计算字段值的平均值
SUM()函数:该统计函数实现计算字段值的总和
MAX()函数:该统计函数实现查询字段值的最大值
MIN()函数:该统计函数实现查询字段值的最小值
在MySQL软件中,为了实现统计功能专门提供了5个统计函数,查看帮助文档可以发现,利用统计函数的查询语法形式如下:
SELECT function(field)
FROM table_name
WHERE CONDITION;
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(field)使用方式:该中方法可以实现对指定字段的平均值进行计算,在具体统计时将忽略NULL值。
SELELCT AVG(comm) average
FROM t_employee;
虽然AVG()在执行中忽略了NULL,但是没有忽略0,所以:
SELECT AVG(comm) average
FROM t_employee
WHERE NOT comm = 0;
为零的部分全部不进行计算。
再具体统计时将忽略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。
MySQl软件提供了5个统计函数来帮助用户统计数据,使用户很方便地实现对记录进行统计数,计算和,计算平均数,计算最大值和计算最小值,而不需要查询所有数据。
在具体使用统计函数时,都是针对表中所有记录数或指定特定条件(WHERE)的数据进行统计计算。
但是在现实应用中,经常会把所有数据记录进行分组,然后再对这些分组后的数据记录进行统计计算。
MySQL可以使用CROUP BY来实现,分组数据查询语法形式如下:
SELECT function()
FROM table_name
WHERE CONDITION
GROUP BY field;
SELECT *
FROM t_employee
GROUP BY deptne;