第二章 查询基础
2.1 SELECT语句基础
2.1.1 列的查询
通过SELECT语句查询并选取出必要的数据称为匹配查询或查询(query)
代码1.SELECT语句的基本语法如下:
SELECT <列名>,...... FROM <表名>;
SELECT语句中包含了SELECT和FROM两个子句(clause)。子句是SQL语句的组成要素,是以SELECT或者FROM等作为起始的短句。SELECT子句列举了希望从表中查询出列的名称,而FROM子句则指定了选取出数据的表的名称。
代码2.如果我们要从第一章创建出的Shohin(商品)表中,查询出shohin_id(商品编号)列,shohin_mei(商品名称)列,和shiire_tanka(进货单价)列,语句如下:
SELECT shohin_id,shohin_mei,shiire_tanka FROM Shohin;
查询结果中的列的顺序和SELECT子句中的顺序相同。
输出结果:
2.1.2 查询出表中的所有列
要查询出全部列时,可以使用代表所有列的星号(*)
代码3.查询全部列的语句
SELECT * FROM <表名>;
代码4.输出Shohin表中的全部的列
SELECT * FROM Shohin;
输出结果:
如果使用星号的话就无法设定列的顺序了,这个时候可以按照CREATE TABLE语句的定义对列进行排序
2.1.3 为列设定别名
SQL语句可以使用AS关键字为列设置别名。
代码4.为列设置别名的基本语句
SELECT shohin_id AS id, shohin_mei AS namae, shiire_tanka AS tanka FROM Shohin;
别名可以使用汉语,使用汉语时需要用双引号(“”)括起来
输出结果:
代码5.设定汉语别名代码:
SELECT shohin_id AS "商品编号", shohin_mei AS "商品名称", shiire_tanka AS "进货单价" FROM Shohin;
输出结果:
2.1.4 常数的查询
SELECT子句还可以书写常数
代码6.如下代码中,SELECT子句中的第一列“商品”是字符串常数,第2列38是数字常数,第3列“2009-02-24”是日期常数,它们将与shohin_id列和shohin_mei列一起被查询:
SELECT '商品' AS mojiretsu, 38 AS kazu, '2009-02-24' AS hizuke, shohin_id,shohin_mei FROM Shohin;
输出结果:
2.1.5 从结果中删除重复行
代码7.可以通过在SELECT子句中使用DISTINCT来实现删除重复行的语句
SELECT DISTINCT shohin_bunrui FROM Shohin;
在使用DISTINCT时,NULL也被视为一类数据。存在多条NULL数据行时,也会结合为一条NULL数据。
输出结果:
代码8.对含有NULL数据的列使用DISTINCT关键字
SELECT DISTINCT shiire_tanka FROM Shohin;
输出结果:
代码9.在多列之前使用DISTINCT
SELECT DISTINCT shohin_bunrui,torokubi FROM Shohin;
输出结果;
2.1.6 根据WHERE语句来选择记录
SELECT语句通过WHERE子句来指定查询数据的条件。在WHRER子句中可以指定“某一列的值和这个字符串相等”或者“某一列的值大于这个数字”等条件。执行含有这些条件的SELECT语句,就可以查询出符合该条件的记录了。具体语法如下:
代码10.语法
SELECT <列名>,...... FROM <表名> WHERE <t条件表达式>;
代码11.用来选区shohin_bunrui列为“衣服”的记录的SELECT语句
SELECT shohin_mei,shohin_bunrui FROM Shohin WHERE shohin_bunrui=‘衣服’;
首先通过WHERE子句查询出符合指定条件的记录,然后再选取出SELECT语句中指定的列
输出结果:
代码12.也可以不选取出作为查询条件的列,语句如下:
SELECT shohin_mei FROM Shohin WHERE shohin_bunrui='衣服';
SQL中子句的书写顺序是固定的,不能随意改变,WHERE子句必须紧跟在FROM子句之后
输出结果:
2.1.7 注释的书写方法
1行注释,书写在‘--’之后,只能写在同一行
多行注释,书写在“/*”和“*/”之间,可以跨多行
代码13.1行注释书写的案例:
--本SELECT语句用来除去结果中的重复数据 SELECT DISTINCT shohin_id,shiire_tanka FROM Shohin;
结果展示:
代码14.多行注释书写的案例:
/*本SELECT语句, 用来删除结果中的重复数据。*/ SELECT DISTINCT shohin_id,shiire_tanka FROM Shohin;
输出结果:
代码15.在SQL语句中插入一行注释
SELECT DISTINCT shohin_id,shiire_tanka --本SELECT语句用来除去结果中的重复数据 FROM Shohin;
输出结果:
代码16.在SQL语句中插入多行注释
SELECT DISTINCT shohin_id,shiire_tanka /*本SELECT语句, 用来除去结果中的重复数据。*/ FROM Shohin;
输出结果:
2.2 算术运算符和比较运算符
2.2.3 算术运算符
代码17.SQL语句中可以使用计算表达式。SELECT语句中,想要把各个商品单价的2倍(hanbai_tanka的2倍)以hanbai_tanka_x2列的形式读出来
SELECT shohin_mei,hanbai_tanka, hanbai_tanka*2 AS "hanbai_tanka_x2" FROM Shohin;
输出结果:
运算就是这样以行为单位执行的。
SQL语句中可以使用加(+),减(-),乘(*),除(/)四则运算,也可以像平常的运算表达式那样使用括号。此外,代码中AS之后必须用双引号("")。
2.2.2 需要注意NULL
所有包含NULL的计算,结果肯定还是NULL
2.2.4 比较运算符
代码18.例子:我们可以使用=选取出销售单价(hanbai_tanka)为500元的记录
SELECT shohin_mei,shohin_bunrui FROM Shohin WHERE hanbai_tanka=500;
输出结果:
代码19.续上例,我们也可以使用代表否定含义的比较运算符<>,选取出hanbai_tanka列的值不为500的记录
SELECT shohin_mei,shohin_bunrui FROM Shohin WHERE hanbai_tanka<>500;
输出结果:
还有如下比较远算符:和~相等(=),和~不相等(<>),大于等于~(>=),大于~(>),小于等于~(<=),小于~(<)
代码20.选取出销售单价大于或等于1000元的记录
SELECT shohin_mei,shohin_bunrui,hanbai_tanka FROM Shohin WHERE hanbai_tanka>=100;
输出结果:
代码21.选取登记日期在2009年9月27日之前的记录
SELECT shohin_mei,shohin_bunrui,hanbai_tanka FROM Shohin WHERE torokubi<‘2009-09-27’;
输出结果:
小于某个日期就是在该日期之前的意思。
使用比较运算符时一定要注意不等号和等号的位置。注意一定要加单引号(' ')。
代码22.WHERE子句的条件表达式中也可以使用计算表达式
SELECT shohin_mei,hanbai_tanka,shiire_tanka FROM Shohin WHERE hanbai_tanka-shiire_tanka>=500;
输出结果:
2.2.5 对字符串使用不等号时的注意事项
代码23.SQL语句创建Chars表并插入数据
--DDL:创建表 CREATE TABLE Chars (chr CHAR(3) NOT NULL, PRIMARY KEY (chr)); --DML:插入数据(在SQL Server和PostgreSQL中的操作) BEGIN TRANSACTION; INSERT INTO Chars VALUES ('1'); INSERT INTO Chars VALUES ('2'); INSERT INTO Chars VALUES ('3'); INSERT INTO Chars VALUES ('10'); INSERT INTO Chars VALUES ('11'); INSERT INTO Chars VALUES ('222'); COMMIT;
输出结果:
在MySQL中需要将“BEGIN TRANSACTION”改成‘START TRANSACTION’,在Oracle和DB2中执行时不需要用到这条语句
代码24.对Chars表执行SELECT语句,查询条件是chr列大于‘2’
SELECT chr FROM Chars WHERE chr>'2';
输出结果:
得到的结果是‘3’,‘222’原因是chr是字符串类型,Chars表chr列中的数据依据字典顺序进行排序结果是:‘1’,‘10’,‘11’,‘2’,‘222’,‘3’
字符串类型的数据原则上按照字典顺序进行排序。不能与数字的大小顺序搞混了。
2.2.6 不能对NULL使用比较运算符
代码25.选取进货单价为2800元的记录
SELECT shohin_mei,shiire_TANKA FROM Shohin WHERE shiire_tanka=2800;
输出结果:
代码26.紧接着我们选取进货单价不是2800元的记录
SELECT shohin_mei,shiire_tanka FROM Shohin WHERE shiire_tanka<>2800;
输出结果:
但是我们发现执行结果中没有‘叉子’和‘圆珠笔’,这两条记录为NULL,无法判定为不是2800元
代码27.选取NULL的记录
SELECT shohin_mei,shiire_tanka FROM Shohin WHERE shiire_tanka IS NULL;
输出结果:
代码28.选取不为NULL的记录
SELECT shohin_mei,shiire_tanka FROM Shohin WHERE shiire_tanka IS NOT NULL;
输出结果:
希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。
2.3 逻辑运算符
2.3.1 NOT运算符
NOT不能单独使用,必须和其他查询条件组合起来使用
代码29.选取出销售单价大于等于1000日元的记录
SELECT shohin_mei,shohin_bunrui,hanbai_tanka FROM Shohin WHERE hanbai_tanka>=1000;
输出结果:
代码30.向代码中的查询条件中添加NOT运算符
SELECT shohin_mei,shohin_bunrui,hanbai_tanka FROM Shohin WHERE NOT hanbai_tanka >=1000;
输出结果:
代码31.WHERE子句的查询条件和上一个代码是等价的
SELECT shohin_mei,shohin_bunrui,hanbai_tanka FROM Shohin WHERE hanbai_tanka < 1000;
输出结果:
2.3.2 AND运算符和OR运算符
AND运算符在其两侧的查询条件都成立时整个查询条件才成立。
OR运算符在其两侧的查询条件有一个成立时整个查询条件都成立。
代码32.在WHERE子句的查询条件中使用AND运算符
SELECT shohin_mei,shiire_tanka FROM Shohin WHERE shohin_bunrui = '厨房用具' AND hanbai_tanka>=3000;
输出结果:
代码33.在WHERE子句的查询条件中使用OR运算符
SELECT shohin_mei,shiire_tanka FROM Shohin WHERE shoohin_bunrui = ‘厨房用具’ OR hanbai_kanta >=3000;
输出结果:
多个查询条件进行组合时,需要使用AND运算符和OR运算符。
2.3.3 通过括号进行强化
代码34.将查询条件原封不动地写入条件表达式
SELECT shohin_mei,shohin_bunrui,torokubi FROM Shohin WHERE shohin_bunrui='办公用品' AND torokubi='2009-09-11' OR torokubi='2009-09-20';
输出结果:
不想要的T恤衫、菜刀和叉子也被选了出来,得到了错误的执行结果,这是因为AND的运算执行优先于OR运算执行,该代码的条件表达式会被解释成(shohin_bunrui='办公用品' AND torokubi='2009-09-11')OR (torokubi='2009-09-20')
代码35.通过使用括号让OR运算优于AND运算执行
SELECT shohin_mei,shohin_bunrui,torokubi FROM Shohin WHERE shohin_bunrui='办公用品' AND ( torokubi='2009-09-11' OR torokubi='2009-09-20');
输出结果:
2.3.4 逻辑运算符和真值
逻辑就是对其真值进行操作。真值就是指值为真或假其中之一的值。逻辑运算符对比较运算符等返回的真值进行操作。
2.3.5含有NULL时的真值
使用逻辑运算符也需要特别对待NULL值。
习题:
2.1
SELECT shohin_mei,torokubi FROM Shohin WHERE torokubi>'2009-04-28';
输出结果:
2.2
第一条代码:
第二条代码:
第三条代码:
2.3
代码1
SELECT shohin_mei,hanbai_tanka,shiire_tanka FROM Shohin WHERE NOT hanbai_tanka-shiire_tanka<500;
输出结果:
代码2
SELECT shohin_mei,hanbai_tanka,shiire_tanka FROM Shohin WHERE hanbai_tanka-shiire_tanka>=500;
输出结果:
2.4
代码
SELECT shohin_mei,sohin_bunrui, hanbai_tanka*0.9-shiire_tanka AS rieki FROM Shohin WHERE hanbai_tanka*0.9-shiire_tanka>100 AND (sohin_bunrui='办公用品' OR sohin_bunrui='厨房用 具' );
输出结果:
(注:不能在WHERE子句中直接写rieki,会出现如下错误:
)
全文注意:由于在创建表格的时候输入错误,误将shohin_bunrui输入成sohin_bunrui