在进行基础查询学习之前,我们首先新建一个数据库和表格,如下代码:
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`课程号` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`课程名称` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`教师号` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`课程号`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('0001', '语文', '0002');
INSERT INTO `course` VALUES ('0002', '数学', '0001');
INSERT INTO `course` VALUES ('0003', '英语', '0003');
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`学号` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`课程号` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`成绩` float(3,0) NOT NULL,
PRIMARY KEY (`学号`,`课程号`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES ('0001', '0001', '80');
INSERT INTO `score` VALUES ('0001', '0002', '90');
INSERT INTO `score` VALUES ('0001', '0003', '99');
INSERT INTO `score` VALUES ('0002', '0002', '60');
INSERT INTO `score` VALUES ('0002', '0003', '80');
INSERT INTO `score` VALUES ('0003', '0001', '80');
INSERT INTO `score` VALUES ('0003', '0002', '80');
INSERT INTO `score` VALUES ('0003', '0003', '80');
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`学号` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`姓名` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`出生日期` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`性别` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`学号`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('0001', '张三', '1989-01-01', '男');
INSERT INTO `student` VALUES ('0002', '张三', '1990-12-21', '女');
INSERT INTO `student` VALUES ('0003', '李四', '1991-12-21', '男');
INSERT INTO `student` VALUES ('0004', '王五', '1993-05-20', '男');
-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`教师号` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`教师姓名` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`教师号`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES ('0001', '孟扎扎');
INSERT INTO `teacher` VALUES ('0002', '马化腾');
INSERT INTO `teacher` VALUES ('0003', null);
INSERT INTO `teacher` VALUES ('0004', '');
可以将上述代码保存为文件test.sql,然后再mysql环境中执行:
SOURCE test.sql;
也可以在navicat的数据库中,新建查询执行。
以下查询,我们都按场景来实现具体操作。
1. 基本查询语句
SELECT FROM语句是SQL中最常用的语句,如下代码中SELECT FROM 本质上是两条子语句,
SELECT 字段1,字段2 ---SELECT 子语句
FROM <name>; --FROM 子语句
通过以上两个子语句可以完成在某个表中,查询全部或者某几列。
如下图执行结果:
2. 语句执行顺序
SQL 语句执行顺序是能够读写SQL代码的关键中的关键,也是我们分析问题并将其分步解决的关键,每个子语句完成一个任务,然后拼接到一起,就能够得到最终的查询结果。
记住一句话:SELECT子句最后执行,其他子句按照书写顺序执行。
3. 去重查询
使用DISTINCT关键词来实现,如下代码:
SELECT DISTINCT 字段1 FROM <name>; --作用于一列,表示该列字段去重,只保留不重复的
SELECT DISTINCT 字段1,字段2 FROM <name>; --作用于多列,表示只有两列字段都相同才算做重复
注意:DISTINCT 必须出现在列名之前,否则会报错
如下图,可以看到两者执行的区别。
4. 重命名查询
别名查询用AS实现:
SELECT 字段1 as 别名1, 字段2 as 别名2 FROM <name>;
如下图,
5. 条件限定查询
条件限定查询,就是在基本查询基础上加入 WHERE 判断条件,如下代码:
SELECT * FROM <name> WHERE <条件>
这时候SQL语句的执行顺序如下图所示:
简化为:
6. 运算符
基本运算符和意义如下图所示:
6.1 算数运算
算术运算符作用可以作用在列上,如下代码:
SELECT 列名/100 AS <字段名> FROM <name> WHERE <条件>;
将成绩一列除100,查询结果如下图:
6.2 比较运算符
比较运算符可以使得WHERE的条件限定更加丰富,数字按照大小比较,字符串按照字典序比较。
SELECT * FROM <name> WHERE <比较运算>;
查询成绩大于80的学生学号,如下图:
查询教师姓名不是null的教师,如下图:
6.3 逻辑运算符
简言之,逻辑运算符就是将比较运算符结合起来,组成更加复杂的判定条件。
SELECT * FROM <name> WHERE <逻辑运算>;
查询男性并且名字是张三或者李四的人,如下图:
7. LIKE 模糊匹配
类似正则表达式,相对简单。
% 表示,任意多个字符;_ 表示,任意一个字符或者数字。
- %李四:以李四结尾的所有字符串。
- 李四%:以李四开头的所有字符串。
- %李四%:包含李四的所有字符串。
- 王_:王某
- 王__:王某某
查询张姓学生,如下图:
8. 常量查询
SELECT *, '常量名' AS <字段名> FROM student WHERE <条件>;
常量名必须用单引号包裹起来,否则会被认为是字段名。
比如将成绩等于80的人归为优秀一列,如下图: