参考资料: 《SQL基础教程》
基础查询
数据准备
在查询数据之前,需要往数据库里插入需要用到的数据。
1.创建数据库
-- 创建数据库shop
CREATE DATABASE shop;
2.创建表 使用数据库shop:
USE shop;
在数据库Shop中创建表:
CREATE TABLE Product
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));
3.插入数据
INSERT INTO Product VALUES ('0001', 'T恤' ,'衣服', 1000, 500, '2009-09-20');
INSERT INTO Product VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO Product VALUES ('0003', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Product VALUES ('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
INSERT INTO Product VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
INSERT INTO Product VALUES ('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');
INSERT INTO Product VALUES ('0007', '擦菜板', '厨房用具', 880, 790, '2008-04-28');
INSERT INTO Product VALUES ('0008', '圆珠笔', '办公用品', 100, NULL, '2009-11-11');
COMMIT;
经过上面的操作,我们已经准备好了后面需要用到的数据表。
Product表
SELECT语句基础
列的查询
SELECT语句,从表中选取(SELECT)数据。
基本的SELECT语句
SELECT <列名>, ...
FROM <表名>
包含了两个子句:
- SELECT子句:列出了希望从表中查询出的列的名称;
- FROM子句:指定了选取出数据的表的名称。
从Product表中输出3列
SELECT
product_id,
product_name,
purchase_price
FROM Product;
执行结果:
查询出表中所有的列
想要查询出全部列,可以使用代表所有列的星号(*)。
查询全部的列
SELECT *
FROM <表名>;
输出Product表中全部的列
SELECT *
FROM Product;
和以上代码具有相同意义的语句:
SELECT
product_id,
product_name,
product_type,
sale_price,
purchase_price,
regist_date
FROM Product;
执行结果:
但是,如果使用星号,就无法设定列的显示顺序了。
为列设定别名
可以使用AS关键字为列设定别名,AS关键字也可以省略。
为列设定别名
SELECT
product_id AS id,
product_name AS name,
purchase_price AS price
FROM Product;
执行结果:
别名可以使用中文,使用中文时需要用双括号("")括起来。
设定中文别名
SELECT
product_id AS "商品编号",
product_name AS "商品名称",
purchase_price AS "进货单价"
FROM Product;
执行结果:
常数的查询
SELECT子句中不仅可以书写列名,还可以书写常数。
查询常数
SELECT
'商品' AS string,
38 AS number,
'2009-02-24' AS date,
product_id,
product_name
FROM Product;
执行结果:
从结果中删除重复行
想要删除重复行,可以在SELECT子句中使用DISTINCT来实现。
使用DISTINCT删除product_type列中重复的数据
SELECT DISTINCT product_type
FROM Product;
执行结果:
对含有NULL数据的列使用DISTINCT关键字 NULL也被视为一类数据,如果存在多行NULL时,将被合并成一行。
SELECT DISTINCT purchase_price
FROM Product;
执行结果:
在多列之前使用DISTINCT
SELECT
DISTINCT product_type,
regist_date
FROM Product;
没使用DISTINCT关键字的情况:
执行结果:
可以看出,DISTINCT关键字会将product_type列和regist_data列都相同的数据合并为一条。 注意:**DISTINCT**关键字只能用在第一个列名之前。
WHERE语句选择记录
WHERE子句可以指定查询数据的条件。
SELECT语句中的WHERE子句
SELECT <列名>, ...
FROM <表名>
WHERE <条件表达式>;
选取product_type列为‘衣服’的数据
SELECT
product_name,
product_type
FROM Product
WHERE product_type = '衣服';
执行结果:
SQL顺序
- 书写顺序:SELECT ——> FROM ——> WHERE
- 执行顺序:FROM ——> WHERE ——> SELECT
注释
注释是SQL语句中用来标识说明或注意事项的部分,注释对SQL的执行没有任何影响。 注释的书写方法有如下两种:
- 单行注释
-- 这是单行注释,只能写在同一行,注意“--”之后有一个空格。
- 多行注释
/*
这是多行注释,书写在‘/*’和‘*/’之间;
可以跨多行。
*/
运算符
运算符:就是对其两边的的列或者值进行运算的符号。
算数运算符
算数运算符:可以进行四则运算的运算符。
SQL语句中使用运算表达式
SELECT
product_name,
sale_price,
sale_price*2 AS 'sale_price_x2'
FROM Product
执行结果:
注意NULL 所有包含NULL的计算,结果肯定是NULL!。
只包含SELECT子句的SELECT语句 FROM子句并非必不可少,只使用SELECT子句进行计算也是可以的。
SELECT (100 + 200)*3 AS calculation;
执行结果:
比较运算符
比较运算符:用来比较其两边的列或者值的符号。
比较运算符 | 含义 |
= | 和~相等 |
<> | 和~不等 |
>= | 大于等于~ |
> | 大于~ |
<= | 小于等于~ |
< | 小于~ |
比较运算符可以对字符、数字和日期等几乎所有数据类型的列和值进行比较。
选出登记日期在2009年9月27日之前的记录 小于某个日期就是在该日期之前的意思。
SELECT
product_name,
product_type,
regist_date
FROM Product
WHERE regist_date < '2009-09-27';
执行结果:
对字符串使用不等式时的注意事项
创建Chars表并插入数据
-- DDL:创建表
CREATE TABLE Chars
(chr CHAR(3) NOT NULL,
PRIMARY KEY (chr));
-- DML:插入数据
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;
[图片上传失败…(image-5eb355-1558878011527)]
选出大于‘2’的数据
SELECT chr
FROM Chars
WHERE chr > '2';
执行结果:
对字符串类型的数据进行大小比较时,使用的是和数字比较不同的规则,典型的规则是按照字典顺序进行比较的。
不能对NULL使用比较运算符
我们不能通过使用比较运算符,来判断是否为NULL,SQL专门提供了是否为NULL的IS NULL运算符。
选取NULL的记录
SELECT
product_name,
purchase_price
FROM Product
WHERE purchase_price IS NULL;
执行结果;
反之,希望选取不是NULL的记录时,需要使用IS NOT NULL运算符。
逻辑运算符
逻辑运算符 | 含义 |
NOT | 不是~ |
AND | 并且,在其两侧的查询条件都成立时,整个查询条件才成立 |
OR | 或者,在其两侧的查询条件有一个成立时,整个查询条件都成立 |
查询条件中使用NOT
SELECT
product_name,
product_type,
sale_price
FROM Product
WHERE NOT sale_price >= 1000;
执行结果:
上面的SQL的查询条件和以下SQL的查询条件是等价的:
SELECT
product_name,
product_type,
sale_price
FROM Product
WHERE sale_price < 1000;
查询条件中使用AND
SELECT
product_name,
product_type,
sale_price
FROM Product
WHERE
product_type = '厨房用具'
AND sale_price >= 3000;
执行结果:
查询条件中使用OR
SELECT
product_name,
product_type,
sale_price
FROM Product
WHERE
product_type = '厨房用具'
OR sale_price >= 3000;
执行结果:
使用括号 注意:AND运算符的优先级高于OR运算符,想要优先执行OR运算符时可以使用括号。
逻辑运算符和真值 真值就是值为真(TRUE)、假(FALSE)或不确定(UNKNOWN)其中之一的值。SQL之外的语言基本上只有真假两种真值,只有SQL中有第三种值——不确定(UNKNOWN)。 当对NULL进行逻辑运算时,其结果是不确定(UNKNOWN),这就是不能对NULL值使用不等式的原因。