MySQL数据库基础 数据查询语句DQL(一)字段控制,where限制查询
数据查询语句DQL(Data Query Language)可以说是SQL最让人神魂颠倒的部分了。将它说成数据从数据库以不同需求、不同姿势中取出的一门艺术一点也不过分。它更体现出SQL(structured query language)所谓结构化查询的精髓。
接下来的几篇,我们就来一步步的整理这门获取数据的艺术。
由于本节内容较多,结果排序和聚合函数的内容就放到下一篇了
【传送门】
对了,前面三篇在这里:
查询所有结果
说到查询,第一个需要掌握的最基础的语句就是查询表中的所有记录。
语句的格式如下SELECT * FROM 表名
我们用这条语句查询本文演示所需要用到的所有数据:
然后,导出的这张表的SQL语句放在这里:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`student_class` smallint(0) NOT NULL DEFAULT 1,
`grade` tinyint(0) NOT NULL DEFAULT 1,
`sex` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`score` double NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `name`(`name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (2, '小刚', 4, 1, '男', 60);
INSERT INTO `student` VALUES (3, '小红', 5, 3, '女', 70);
INSERT INTO `student` VALUES (4, '小丽', 5, 1, '女', 77);
INSERT INTO `student` VALUES (5, '李雷', 3, 5, '男', 89);
INSERT INTO `student` VALUES (6, '小明', 1, 1, '男', 99);
INSERT INTO `student` VALUES (7, '李华', 2, 1, '男', 85);
INSERT INTO `student` VALUES (8, '韩梅梅', 1, 1, '女', 98);
INSERT INTO `student` VALUES (9, '狗剩', 5, 2, '男', 67);
INSERT INTO `student` VALUES (11, '小明', 6, 1, '男', 99);
SET FOREIGN_KEY_CHECKS = 1;
下面就要开始将select语句玩出花咯~~~
控制字段
在刚刚的查询中,使用*代表通配,只能查询所有的字段。而往往,我们有着仅获得部分字段的需求,这就需要手动的选择要查询的字段了。
选择查询字段
选择要查询的字段,只需要将*替换成为要查询的字段名称即可,字段与字段之间使用逗号隔开。结果集中字段的顺序就是语句中的顺序,与表中字段顺序无关。
语句格式为:SELECT 字段1,字段2,... FROM 表名;
例如,查询所有学生的班级和名称:
编写SQL语句:
SELECT student_class,name FROM student;
运行之:
字段别名
查询某些字段,可能会存在着名称冲突(多表查询),或是命名格式的更换(下划线分隔向驼峰命名等)等情况,这就需要给字段命一个别名,使得查询出来的虽然还是原来的字段,但是显式在虚拟表中的名称确实不一样的。
给字段取别名,只需要在查询字段后用空格隔开直接书写即可,格式如下:SELECT 字段1 别名,字段2 别名..... FROM 表名;
例如,查询所有学生的班级姓名,将班级转成驼峰命名,将姓名转为studentName
编写SQL语句:
SELECT student_class studentClass,name studentName FROM student;
运行之:
新的字段
除了可以查询表中已有的字段,MySQL还允许使用表中字段的计算表达式创建新的字段。这些表达式的结果可以是数值类型,也可以是布尔类型或是字符串类型。当然,这些新的字段也允许取别名。
例如:查询所有同学年级和班级的和,姓名以“姓名-性别”的形式呈现,并且显示其是否成绩在75分以上
tips:连接字符串需要使用CONCAT函数
编写SQL语句:
SELECT student_class+grade,CONCAT(name,'-',sex) name,score > 75 FROM student;
运行之:
where限制查询
刚才的查询,都是查询全部数据,但是在实际应用中,往往需要查询一些特定的数据,也就是说,对数据的范围进行限制。这就要用到我们的where
关键字了。where的作用不仅仅在查询上,在删除数据和更新数据的时候也是经常用的。在前面的文章中粗略的介绍了一下,在这里我们更加细致的说明他的用法。
基础运算符
基础运算符包括:=
>
>
=
<
<=
<>
!=
最后个都是不等于,他们等价
例如,查询所有性别不是男性的同学
编写SQL
SELECT * FROM student WHERE sex <> '男';
运行之:
NOT
可以说,where后面跟着的,是一个布尔表达式,而提到布尔运算,就不得不提基础的逻辑运算“与或非了”
NOT
用于否定一个命题
例如,使用not查询所有性别不为男性的同学
编写SQL;
SELECT * FROM student WHERE NOT sex = '男';
运行之
AND
AND
用于以“且”的逻辑连接两个命题
例如,查询性别为女且分数为77分的同学
编写SQL
SELECT * FROM student WHERE sex = '女' AND score = 77;
运行之:
OR
OR用于以“或”的逻辑连接两个命题
例如:查询年级为1或者为2的同学
编写SQL
SELECT * FROM student WHERE grade = 1 OR grade = 2;
运行之
IN
IN语句不同于与或非算符,它用于判断目标字段的取值是否位于一个集合中。换句话说,IN用于查询一个集合中的元素。
它的结构如下:字段 IN (元素1,元素2......)
例如,查询分数为67,77,99分的同学
编写SQL
SELECT * FROM student WHERE score IN (67,77,99);
运行之:
BETWEEN AND
使用 BETWEEN AND 可以查询一个区间内的信息,它的格式为:字段 BETWEEN 下限 AND 上限;
值得注意的是,这个区间是闭区间。
例如,查询所有分数在区间[60,80]分的同学
编写SQL
SELECT * FROM student WHERE score BETWEEN 60 AND 80;
IS NULL & IS NOT NULL
对于空值(null)我们无法使用他们与任何的值进行比较,如果想要找到他们就可以使用IS NULL
。寻找所有非空值可以使用IS NOT NULL
他们的格式是:字段 IS NULL
字段 IS NOT NULL
模糊查询
模糊查询主要针对字符串。在使用=
判断条件时,字符串的内容必须一模一样。而模糊查询则提供了一种更宽松的查询政策,使得可以使用模糊的条件利用通配符对于字符串的特点进行查询。
他需要使用关键字LIKE
作为运算符,格式是:字段名 LIKE 模糊字符串;
使用模糊查询,主要需要掌握使用两种通配符_
和%
组成模糊字符串。
通配符"_"
通配符_
在字符串中占据一个字符的位置,这个位置可以替换做任意一个字符。使用它通常用于查询长度比较清晰,内容模糊的字符串、
例如,查询所有名字长度为二,且姓李的同学
编写SQL
SELECT * FROM student WHERE name LIKE '李_';
执行之:
通配符"%"
通配符%
可以占据任意长的位置(可以为零),常用于长度和内容和都模糊的查询。它比_
更加模糊,可以用来根据字符串中的关键字查询。
例如,查询姓名中带有“梅”字的同学
编写SQL
SELECT * FROM student WHERE name LIKE '%梅%';
参考资料:
- 《MySQL必知必会》
- 站内****:Mysql数据库基础入门****