一、简单查询
语法:
SELECT select _ list
FROM table _ name
[ WHEREsearch _ condition ]
[ ORDER BY order _ expression [ ASCDESC ]][ LIMIT [ offset ] rowcount ]
语法说明:
● select _ list :用户要查询的字段列表,“*”代表所有字段。
● table _ name :用户要查询信息的表(表或视图)。
● where :查询的筛选条件开始关键字。
● search _ condition :查询条件的内容。
● orderby :关键字,标明查询结果的排列顺序。 orderexpression :按着哪些字段进行排序。
● asC :标明是升序排序,
● desc :将结果集按照降序排序。
● limit :限制每次查询出来的数据条数。
全表查询、
用户有时需要查看当前表内的所有内容,分析表的信息内容时,可以采用下面的方式查 看学生表中所有的数据。
例:
mysql > USE SchoolDB ;
Database changed
mysql > SELECT * FROM Studentlnfo ;
在执行成功后由于在查询命令中使用了“*”号,将会返回 Studentinfo 表中的所有列,并按照定义表时的顺序进行显示。如下所示:
mysql > SELECT * FROM Studentinfo ;
注意:
在示例4.1中的“*”符号代表的是当前查询表中所有的列名。如果不使用“*”符号,要查询全表的数据时就需要将表中的所有列名写出,每一列使用“,”分割,如:
SELECT ld , StudentName , Gender , Age , Birthday , StudentNO , ClassID , Beginiime ,
Phone , Province , City , Emaill
from Studentlnfo ;
选择列查询
使用 SELECT 关键字,可以针对表中的列进行选择性的查询,即只查询符合条件记录的部分字段值。例如:由于学生信息表中的列有很多,假设我们现在只需要查询所有学生的学号、姓名、性别和年龄,可以使用下面命令来进行操作:
例:
mysql > SELECT ID , StudentName , Gender , Age from Studentlnfo ;
注意:
一般情况下,最好不要使用通配符”*”来进行全表查询操作。使用了”*”通配符虽然可以节省输入查询语句的时间,但是获取不需要的列数据通常会减低查询和所使用的应用程序的效率。
3. 查询中别名
当直接使用 SELECT 査间后,由于在设计数据库时使用的都是英文的字段名,而且有的語名不是很好理解,对用尸米说不够直观,例如在上一个示例程序中“ StudentID ”不如学号”直观。在査询语句中可以使用 AS 、空格为查询结果中的列重新命名,重命名后的列名称为原有列的别名。例如,将查询结果中的 StudentID 改为”学号”、“ StudentName ”改为“姓名”、“ Gender ”改为“性别”、“ Age ”改为“年龄”等。
使用 AS 关键字为字段定义别名
语法:
SELECT 字段名1AS别名,字段名2 AS 别名.…. FROM 表名;示例4.3:
mysql > SELECT ID AS 学号, StudentName AS 姓名, Gender AS 性别, Age AS 年龄 FROM Studentinfo ;
2.使用空格为字段定义别名
语法:
SELECT 字段名1别名,字段名2别名…. FROM 表名
例:
mysq > SELECT iD 学号, StudentName 姓名, Gender 性别, Age 年龄 FROM Studentinfo ;
| 学号 | 姓名 | 性别 | 年龄 |
------------------------------------------------------
12022001002 | 张耀仁 | 男 | 21 |
I2022001003 | 李启全 | 男 | 22 |
------------------------------------------------------
二、条件查询
全表查询虽然能够将所有的数据查询出来,但是这样操作也有一定的弊端,如果表的数据量非常大,则会消耗掉大量的内存和系统资源,而且一般的全表查询结果,对于用户来说作用并不是很大,有时候只需要查看某些限制条件内的数据,因此需要按照条件进行数据的査询。例如:如果同学们去一些购物类的网站,不会查看所有的商品,都会按条件进行查找。
1. where限制查询结果
- 单条件
单条件查询是指在 WHERE 语句后面只有一个条件,例如要求查询年龄在21岁以上的学生信息。
例:
mysql > SELECT Id , StudentName , Gender , Age FROM Studentinfo WHERE Age >21;
在示例程序中 WHERE 子句部分使用比较运算符“>”。在上一章的比较运算符有很多,例如“>=”、“<”、“<=”、“=”、=”。下面我们通过示例学习在 WHERE 子句部分
使用比较运算符。
例:
mysql >﹣查询所有性别为女的学生信息
SELECTID , StudentName , Gender , Age FROM Studentinfo WHERE Gender ='女;
mysql >…查询所有年龄小于20岁的学生信息
SELECT ID , StudentName , Gender , Age FROM Studentlnfo WHERE Age <20;
mysql >﹣查询出所有户籍不在郑州的学生信息
SELECTID , StudentName , Gender , Age , City FROM Studentinro WHERE City ='郑州;
- 多条件复合查询
有时候条件可能不仅仅是一条,可能是多个条件的组合。在这种情况下就需要使用到上一章中的逻辑运算符来组合多个条件,逻辑运算符有:“ NOT ”、“ AND ”、“ OR ”。我们运行以下代码,并观察其运行结果。
例:
mysql >-﹣查询出年龄为20岁的女生信息
SELECT ID , StudentName , Gender , Age FROM StudentInfo
WHERE Age =20 AND Gender =女;
mysql >﹣查询出家不在郑州的年龄或者年龄不到21岁的学生信息
SELECTID , StudentName , Gender , Age , City FROM Studentlnto WHERE Age <21 OR City <>郑州';
mysql >-﹣查询出不是1班的学生信息
SELECT ID , StudentName , Gender , Age , ClassID FROM Studentlnto WHERE NOT ( ClassID =1);
在刚才的示例程序中第三个查询语句也可以用以下方式来替代
例:
mysql >﹣查询出不是1班的学生信息
SELECT ID , StudentName , Gender , Age , ClassID FROM Studentlnfo WHERE ClassID <>1;
distinct消除重复行
在查询某个列数据的时候,可能返回的结果中存在重复的值,而用户对于重复的值可能只需要知道一个即可,例如要查询学生表中登记的学生都有哪些班级的,只需要知道这些班级编号即可。因为一个班里一定存在多名同学,所以使用之前的查询方式,返回的班级编号结果一定有很多重复的行,这些重复的行值就需要消除成1个。 Select 语句中的Distinct 关键字就是用来解决这个问题。
例:
mysql > SELECT DISTINCT ClassID FROM Studentlnfo ;
-----------------------
| ClasslD |
| 1 |
| 2 |
-----------------------
2 rows in set
从结果上看当前所有学生属于两个班级,班级编号是:1、2。
limit限制查询返回行
当表中的数据量比较多的时候,用户只需要看到前面的几行就能达到查询的目的,这时用 LIMIT 关键字可以限制返回的查询结构的行数。 LIMIT 限定查询一般和数据查询排序结合使用,来对排序后的数据取前面一定数量的结果。
语法:
LIMIT [位置偏移量]行数
位置偏移量:用于指示 MysQL 从哪一行开始显示,是一个可选参数,如果不指定该参数,将会从结果集的第一条记录开始(从零开始计数);
行数:指示返回的记录条数
例如;现在我们要显示 Studentlnfo 表的前四条记录,命令和运行结果如下所示:
mysql > SELECT ID , StudentName , Gender , Age FROM StudentInfo LIMIT4;
----------------------------------------------------------------------------------------------------
| StudentID | StudentName| Gender | Age |
----------------------------------------------------------------------------------------------------
|2022001002|张耀仁 |男|21|
| 2022001003|李启全|男|22|
|2022001004|许名瑶 |女|22|
|12022001005|章涵 |男|21|
----------------------------------------------------------------------------------------------------
4 rows in set
通过运行结果可以看出,由于没有指定“位置帰移量”这个参数,所以结果集是从第一行开始的,“行数”指定为4,则意味看只显ボ前4条记录。
加果指定了返回记录的开始位置,则返回结果从“位直帰移量”参数开始的指定行数,“行数”参数指定返回的记录条数。 LIMIT 两个参效都与全的情况,在实际项目开发中的数据分页技术中经常会便用到。例如:现有字生表中有18条记求,我们希望在界面中一次只显示其中的5条数据,假设现在需要查闻显ボ的是弟二贝,也就是从第11行到第15行的数据,这时我们可以使用的查询命令如下:
例:
mysql > SELECTID , StudentName , Gender , Age FROM Studentlnfo LIMIT 10,5;
----------------------------------------------------------------------------------------------------
StudentID| StudentName|Gender |Age|
----------------------------------------------------------------------------------------------------
|2022001012|王处一|男|20|
|2022001013|郝大通|男|19|
|2022001014|孙不二|男|20|
|2022003001|刘瑛 |女|20|
|2022003002|曲灵风|女|21|
----------------------------------------------------------------------------------------------------
5 rows in set
由结果可以看出,该语句指示 MySQL 返回从第11条记录行开始之后的5条记录。第一参数10表示从第11行开始(位置偏移量从零开始计数),第二个参数5表示返回的行数。
通过以上两个示例程序我们可以看出带一个参数的 LIMIT 命令指定从查询结果的首行开始,唯一的参数代表返回的行数,即“ LIMIT N ”与“ LIMIT ON ”等价。带两个参数的 LIMIT 可以返回从任何一个位置开始的指定行数
注意: limit 语句是 MySQL 特有的功能。 Oracle 、 sQL Server 限定查询返回行使用的是其他语句。
4. 处理null值
MySQL 中经常有些字段值为 Nul 。 NULL 是一种比较特殊的情况,如果直接通过 sql 语句查询 NULL 是查询不到的结果都是0条。用字段名= NULL 和字段名1= NULL 判断结果是错误的。3
所以 mysql 提供了一个专门针对 NULL 查询的关键字就是 is NULL 和 is not NULL 。比如我们需要查询年龄为空的学生。
例:
mysql > SELECT ID , StudentName , Gender , Age FROM Studentinfo WHERE AGE IS NULL ;
----------------------------------------------------------------------------------------------------
StudentID |StudentName | Gender| Age|
|2022001018|王处一|男| |
|2022001019|郝大通|男| |
|2022003012|曲灵风|女| |
----------------------------------------------------------------------------------------------------
使用orderby进行查询排序
表中数据是按照添加的物理顺序存放的,但是在查询的时候,我们会需要按照某个。则来对结果进行顺序的排列然后再显示,这时就需要用到 Select 命令中的排序子句来都部实现了。在 MySQL 中提供了在查询语句中使用 ORDER BY 子句来进行排序,其包括了单机排序和多列排序,同时还可以进行升序和降序排列。
单列排序
单列排序是指按照表中的某一个列进行排序,即 ORDER BY 子句后面只有一个列名。比如我们想根据学生的年龄从小到大或者从大到小来排列查询的结果。
例:
mysql >﹣按照学生的年龄以升序进行排列查询。
SELECT ID , StudentName , Gender , Age FROM Studentlnfo ORDER BY Age ASC ;
mysql >-﹣按照学生的年龄以降序进行排列查询。
SELECT ID , StudentName , Gender , Age FROM StudentInfo ORDER BY Age DESC ;
注意:
(1)在数据库中默认是以升序进行排序的,所有 ASC 可以略去不写,例如: SELECT * FROM Studentlnfo ORDER BY Age ;
(2)在数据中, NULL 值比所有的值都要小。
多列排序
MySQL 除了支持单列排序外,还可以按多列排序。多列非子时, Order by 子句后面跟多个字段,字段之间用逗号隔开,每个子段后曲都미以跟 ASC 或 DESC 。多列排序的基本运算过程是:数据库引擎会按照第一个字段以及升、降予规则排序查询结果,如果杳询结果里在这个字段上有重复值,则对这些存在重复值的数据行按照第二个排序字段及其升、降序规则进行排序,以此类推。
例如:查询所有学员的信息,按照年龄从大到小排序,同岁的学生按照出生日期从小到大进行排列,命令如下所示。
例:
mysqI > SELECT ID , StudentName , Gender , Age , Birthday FROM Studentinto ORDER BY Age DESC , Birthday ASC ;
四、内置函数
函数表示对输入的参数值返回一个具有特定关系的值, MySQL 提供了大量丰富的函"粘。在进行数据库管理以及数据的査询和操作时将会经常用到各种函数。通过对数据的处理,数据库功能可以变得更加强大,更加灵活的满足不同用户的需求。 MySQL 中的内置函数从功能上可以分为:字符函数日期和时间函数、数学函数等。
字符串函数
字符串函数可以用来修改或运算字符串类型的数据,在 MySQL 中比较重要,也是最常用的函数,在大量编程中使用的次数是最多的。常用的字符串操作函数如下表所示。
函数名 | 示例 | 函数功能 |
CONCAT | SELECT CONCAT(‘晴天’,’今天’) 返回:晴天今天 | 连接成字符串 |
LENGTH | LENGTH(‘hello world’)结果为11 | 返回字符串的长度 |
UPPER | UPPER(‘abcd’)返回为ABCD | 将字符串转为大写 |
LTRIM | LTRIM(‘ abc’)返回为’abs’ | 去除字符串左边的空格 |
RTRIM | RTRIM(‘abc ’)返回为’abs’ | 去除字符串右边的空格 |
TRIM | TRIM(‘ abc ’)返回为’abs’ | 去除字符串左右两边的空格 |
REPLACE | REPLACE(‘abcccd’,’c’,’x’)返回为’abxxxd’ | 将’abcccd’中的’c’替换为’x’ |
STRCMP | STRCMP(S1,S2) | 比较字符串S1和S2,如果S1等于S2,返回0。如果S1小于S2,返回-1。如果S1大于S2,返回1。 |
SUBSTRING | SUBSTRING(‘johnson’,5,3)返回为’son’ | 从第5个位置开始截取长度为3的字符串 |
日期函数
日期和时间函数主要用来处理日期和时间值,一般的日期函数除了使用 DATE 类型的参数外,也可以使用 DATETIME 或者 TIMESTAMP 类型的参数,但会忽略这些值的时间部分。相同的,以 TIME 类型值为参数的函 ,可以接受 TIMESTAMP 类型的参数,但会忽略日期部分,许多日期函数可以同时接受数字和字符串两种类型。
获取时间、日期指定部分的函数
获得当前日期+时间( date + time )函数: NOWO );
获得当前日期函数: CURDATE ();
获得当前时间函数: CURTIME ();
函数名 | 函数功能 |
MONTH(DATE) | 返回日期对应的月份(数字类型,返回1到12的整数) |
MONTHNAME(DATE) | 返回日期对应的月份(字符串类型,返回月份的英文全名,如2月份February) |
DAYNAME(DATE) | 返回日期对应的工作日的英文名称 |
DAYOFWEEK(DATE) | 返回日期对应的一周中的索引。1表示周日,2表示周一...... |
WEEKDAY(DATE) | 返回日期对应的工作日索引。0表示周一,1表示周二......6表示周日 |
WEEK(DATE) | 计算日期是一年中的第几周,范围从1到52 |
DAYOFYEAR(DATE) | 计算日期是一年中的第几天,范围从1到366 |
DAYOFMONTH(DATE) | 计算日期是一个月中的第几天,范围从1到31 |
YEAR(DATE) | 返回日期中年份,范围从1000到9999 |
QUARTER(DATE) | 返回日期对应的一年中的季度值,范围从1到4 |
MINUTE(TIME) | 返回时间的分钟部分,范围从0到59 |
SECOND(TIME) | 返回时间的秒部分,范围从0到59 |
计算日期和时间的函数
函数名 | 函数功能 |
NOW() | 活动当前日期+时间格式 |
DATE_ADD() | 为日期增加一个时间间隔 |
ADDDATE() | 可以用date_add()来代替,用法一致 |
DATE_SUB() | 为日期减少一个时间间隔 |
SUBDATE() | 可以用date_sub()来代替,用法一致 |
ADDTIME() | 可以用date_add()来代替,用法一致 |
DATEDIFF() | 日期时间相减函数 |
3.数学函数
函数名 | 函数功能 |
Fromat(x,y) | 将一个数x,保留y位小数,并且整数部分用逗号分隔千分位,小数部分进行四舍五入。 |
Abs() | 求一个数的绝对值;absolute |
Sqrt() | 求一个数的平方根。Sqrt是sqruar(平方,矩形),root(根)的缩写。 |
Mod(x,y) | x除数,y被除数。结束是余数。 |
Ceil() | 向上取整 |
Floor() | 向下取整 |
Rand() | 用来生成随机数用的 |
Truncate(x,y) | 不管四舍五入,直接把x的y位小数直接删除。 |
Sign() | 返回当前结果得符号,如果是负数返回-1,如果是0返回0,如果是正数,返回1. |
Power() | 幂运算 |
Round() | 将数值表达式四舍五入为指定精度 |
系统函数
函数名 | 函数功能 |
DATAASE() | 返回当前数据库名 |
BENCHMARK(count,expr) | 将表达式expr重复运行count次 |
CONNECTION_ID() | 返回当前客户的连接ID |
FOUND_ROWS() | 返回最后一个SELECT查询进行检索的总行数 |
VERSION() | 返回MySQL服务器的版本 |