SQL 查询数据-基本查询和条件查询

目录

准备数据

MySQL

基本查询

条件查询

常用的条件表达式

小结


在关系数据库中,最常用的操作就是查询。

准备数据

为了便于讲解和练习,我们先准备好了一个students表和一个classes表,它们的结构和数据如下:

students表存储了学生信息:

id class_id name gender score
1 1 小明 M 90
2 1 小红 F 95
3 1 小军 M 88
4 1 小米 F 73
5 2 小白 F 81
6 2 小兵 M 55
7 2 小林 M 85
8 3 小新 F 91
9 3 小王 M 89
10 3 小丽 F 85

classes表存储了班级信息:

id name
1 一班
2 二班
3 三班
4 四班

请注意,和MySQL的持久化存储不同的是,由于我们使用的是AlaSQL内存数据库,两张表的数据在页面加载时导入,并且只存在于浏览器的内存中,因此,刷新页面后,数据会重置为上述初始值。

MySQL

如果你想用MySQL练习,可以
下载这个脚本  博客绑定的资源,然后在命令行运行:

$ mysql -u root -p < init-test-data.sql

就可以自动创建test数据库,并且在test数据库下创建students表和classes表,以及必要的初始化数据。

和内存数据库不同的是,对MySQL数据库做的所有修改,都会保存下来。如果你希望恢复到初始状态,可以再次运行该脚本。

基本查询

要查询数据库表的数据,我们使用如下的SQL语句:

SELECT * FROM <表名>

假设表名是students,要查询students表的所有行,我们用如下SQL语句:

-- 查询students表的所有数据
SELECT * FROM students;

使用SELECT * FROM students时,SELECT是关键字,表示将要执行一个查询,*表示“所有列”,FROM表示将要从哪个表查询,本例中是students表。

该SQL将查询出students表的所有数据。注意:查询结果也是一个二维表,它包含列名和每一行的数据。

要查询classes表的所有行,我们用如下SQL语句:

-- 查询classes表的所有数据
SELECT * FROM classes;

运行上述SQL语句,观察查询结果。

SELECT语句其实并不要求一定要有FROM子句。我们来试试下面的SELECT语句:

上述查询会直接计算出表达式的结果。虽然SELECT可以用作计算,但它并不是SQL的强项。但是,不带FROM子句的SELECT语句有一个有用的用途,就是用来判断当前到数据库的连接是否有效。许多检测工具会执行一条SELECT 1;来测试数据库连接。

条件查询

使用SELECT * FROM <表名>可以查询到一张表的所有记录。但是,很多时候,我们并不希望获得所有记录,而是根据条件选择性地获取指定条件的记录,例如,查询分数在80分以上的学生记录。在一张表有数百万记录的情况下,获取所有记录不仅费时,还费内存和网络带宽。

SELECT语句可以通过WHERE条件来设定查询条件,查询结果是满足查询条件的记录。例如,要指定条件“分数在80分或以上的学生”,写成WHERE条件就是SELECT * FROM students WHERE score >= 80

其中,WHERE关键字后面的score >= 80就是条件。score是列名,该列存储了学生的成绩,因此,score >= 80就筛选出了指定条件的记录:

-- 按条件查询students:
SELECT * FROM students WHERE score >= 80;

因此,条件查询的语法就是:

SELECT * FROM <表名> WHERE <条件表达式>

条件表达式可以用<条件1> AND <条件2>表达满足条件1并且满足条件2。例如,符合条件“分数在80分或以上”,并且还符合条件“男生”,把这两个条件写出来:

  • 条件1:根据score列的数据判断:score >= 80
  • 条件2:根据gender列的数据判断:gender = 'M',注意gender列存储的是字符串,需要用单引号括起来。

就可以写出WHERE条件:score >= 80 AND gender = 'M'

-- 按AND条件查询students:
SELECT * FROM students WHERE score >= 80 AND gender = 'M';

第二种条件是<条件1> OR <条件2>,表示满足条件1或者满足条件2。例如,把上述AND查询的两个条件改为OR,查询结果就是“分数在80分或以上”或者“男生”,满足任意之一的条件即选出该记录: 

-- 按OR条件查询students:
SELECT * FROM students WHERE score >= 80 OR gender = 'M';

很显然OR条件要比AND条件宽松,返回的符合条件的记录也更多。

第三种条件是NOT <条件>,表示“不符合该条件”的记录。例如,写一个“不是2班的学生”这个条件,可以先写出“是2班的学生”:class_id = 2,再加上NOTNOT class_id = 2

-- 按NOT条件查询students:
SELECT * FROM students WHERE NOT class_id = 2;

上述NOT条件NOT class_id = 2其实等价于class_id <> 2,因此,NOT查询不是很常用。

要组合三个或者更多的条件,就需要用小括号()表示如何进行条件运算。例如,编写一个复杂的条件:分数在80以下或者90以上,并且是男生:

-- 按多个条件查询students:
SELECT * FROM students WHERE (score < 80 OR score > 90) AND gender = 'M';

如果不加括号,条件运算按照NOTANDOR的优先级进行,即NOT优先级最高,其次是AND,最后是OR。加上括号可以改变优先级。

常用的条件表达式

条件 表达式举例1 表达式举例2 说明
使用=判断相等 score = 80 name = 'abc' 字符串需要用单引号括起来
使用>判断大于 score > 80 name > 'abc' 字符串比较根据ASCII码,中文字符比较根据数据库设置
使用>=判断大于或相等 score >= 80 name >= 'abc'
使用<判断小于 score < 80 name <= 'abc'
使用<=判断小于或相等 score <= 80 name <= 'abc'
使用<>判断不相等 score <> 80 name <> 'abc'
使用LIKE判断相似 name LIKE 'ab%' name LIKE '%bc%' %表示任意字符,例如'ab%'将匹配'ab','abc','abcd'

小结

使用SELECT查询的基本语句SELECT * FROM <表名>可以查询一个表的所有行和所有列的数据;

SELECT查询的结果是一个二维表。

通过WHERE条件查询,可以筛选出符合指定条件的记录,而不是整个表的所有记录。

你可能感兴趣的:(数据库系统概论,sql,数据库)