SELECT <列名>,FROM <表名>;
当选出满足某些条件的数据时,使用WHERE语句,SELECT语句通过WHERE子句来指定查询数据的条件,在WHERE子句中可以指定“某一列的值和这个字符串相等”或“某一列的值大于这个数字”等条件。
eg.SELECT ,
FROM
WHERE
SELECT product_name, product_type FROM product WHERE product_type = '衣服'
用来选取product type 列为衣服的SELECT语句,其中product_name不是查询的列
SELECT product_name FROM product WHERE product_type = '衣服';
也可以选取出不是WHERE查询条件的列
相关
星号"*"代表全部列
SQL语句中可以随意使用换行符,不影响语句执行(但不可插入空行)
设置汉语别名时需要使用双引号("")括起来,类似于字符串
DISTINCT 关键字可以删除重复行
注释是SQL语句中用来标识说明或注意事项的部分,分为1行注释“–”和多行注释两种"/* */".
eg. --查询所有数据,使用星号"*"
SELECT *
FROM
;-- SQL语句可以使用"**AS**"关键字为列名设定别名(用中文时需要双引号("")). SELECT product_id AS id, product_name AS name, purchase_price AS "进货单价" FROM product; -- 使用 DISTINCT删除product_type列中重复的数据 SELECT DISTINCT product_type FROM product;
算术运算符:
+,-,*,/
比较运算符:
-- 选取sale_price列为500的记录 SELECT product——namep, roduct_type FROM product WHERE sale_price = 500;
常见比较运算符:=,<>(和~不相等),>=,>,<,<=;
常用法则
SELECT子句中可以使用常数或者表达式
使用比较运算符时一定要注意不等号的位置和等号的位置 不等号总是在等号("=")前面
选取NULL记录时,需要在条件表达式中使用IS NULL运算符。 希望选取不是NULL记录时,需要在条件表达式中使用IS NOT NULL运算符
-- SQL语句中也可以使用运算表达式 SELECT product_name, sale_price, sale_price * 2 AS "sale_price x2" FROM product; -- WHERE子句的条件表达式中也可以使用计算表达式 SELECT product_name, sale_price, purchase_price FROM product WHERE sale_price - purchase_price >=500; /* 对字符串使用不等号首先创建chars并插入数据选取出大于'2'的SELECT语句 */ -- DDL:创建表 CREATE TRABLE chars( chr CHAR(3) NOT NULL, PRIMARY KEY(chr); ) -- 选取出大于'2'的数据SELECT语句('2'为字符串) SELECT chr FROM chars WHERE chr > '2'; -- 选取NULL的记录 SELECT product_name, purchase_price FROM product WHERE purchase_price IS NULL; -- 选取不为NULL的记录 SELECT product_name, purchase_price FROM product WHERE purchase_price IS NOT NULL
想要表示"不是…"时,除了前文的<>运算符外,还存在另外一个表示否定、使用范围更广的运算符:NOT
NOT不能单独使用, 如下
eg.
-- 选取出销售单价大于等于1000日元的记录 SELECT product_name, product_type, sale_price FROM product WHERE sale_price >= 1000; -- 添加NOT运算符 SELECT product_name, product_type, sale_price FROM producct WHERE NOT sale_price >= 1000;
当希望同时使用多个查询条件时,可以使用AND或者OR运算符.
AND相当于"并且",类似于数学中的取交集;
OR相当于"或者", 类似数学中的取并集。
-- 通过使用括号让OR运算符优先于AND运算符执行 SELECT product_name, product_type, regist_date FROM product WHERE product_type = '办公用品' AND (regist_DAte = '2009-09-11' or regist_date = '2009-09-20');
这里需要注意因为AND运算符优先级高于or往往不注意使用括号将or运算括起来
NULL的真值结果既不为真,也不为假,因为并不知道这样一个值
这时真值是除真假之外的第三种值——不确定。一般的逻辑运算并不存在这第三种值。SQL之外的语言也基本上只使用真和假这两种真值。与通常的逻辑运算被称为二值逻辑相对,只有SQL中的逻辑运算被称为三值逻辑。
SQL中用于 汇总的函数叫做 聚合函数,常用如下
将现有数据按照某列来汇总统计,使用GROUP BY
SELECT <COL>,..., FROM <TABLE> GROUP BY<COL1>, <COL2>,...,;
-- 按照商品种类统计数据行数 SELECT product_type,COUNT(*) FROM product; GROUP BY product_type; -- 不含GROUP BY SELECT produc_type, COUNT(*) FROM product;
聚合函数与GROUP BY的使用必须针对某一列,若出现歧义则会报错,如上述第二段SQL缺少GROUP BY只含有COUNT(*)故报错。
GROUP BY子句就像切蛋糕那样将表进行了分组,GROUP BY子句中指定的列称为聚合建或者分组列
将进货单价(purchas_price)作为聚合键举例:
SELECT purchase_price, COUNT(*) FROM product GROUP BY purchase_price;
COUNT(COL)具体到列名时筛选结果不包含NULL,COUNT(*)筛选时结果包含NULL,此时NULL作为一组特殊数据处理。
GROUP BY书写位置
GROUP BY的子句书写顺序有严格要求,不按照顺序SQL会报错。
**顺序:**SELECT --FROM–WHERE–GROUP BY
前三项用于筛选数据,GROUP BY对筛选出的数据进行处理
WHERE子句中使用GROUP BY
SELECT purchase_price, COUNT(*) FROM product WHERE product_type = '衣服' GROUP BY purchjase_pricel;
在使用聚合函数及GROUP BY子句时,经常出现的错误:
将表使用GROUP BY分组后,如何取出其中两组?
此时WHERE不可行,因为WHERE子句中只能指定记录(行)的条件,而不能用来指定组的条件(eg.“数据行数为2行"或者"平均值为500”)。
可在GROUP BY后使用HAVING子句,HAVING的用法类似WHERE
HAVING子句用于对分组进行过滤,可以使用数字、聚合函数和GROUP BY中指定的列名
-- 数字 SELECT product_type, COUNT(*) FROM product GROUP BY product_type HAVING COUNT(*) = 2; -- 错误形式(因为product_name不包含在GROUP BY聚合键中) SELECT product_type, COUNT(*) FROM product GROUP BY product_type HAVING product_name = '圆珠笔'
HAVING语句可以过滤出特定筛选的聚合对象,如有两行数据的COUNT(*)=2
SQL中执行结果为随机排列,当需要按特定顺序,可以使用ORDER BY 子句
SELECT <COL>,...., FROM <COL> ORDER BY <排列基准>,...;
默认为升序排列,降序排列为DESC
-- 降序排列 SELECT product_id, product_name, sale_price, purchase_price FROM product ORDER BY sale_price DESC; -- 多个排序键 SELECT product_id, product_name, sale_price, purchase_price FROM product ORDER BY sale_price, product_id; -- 当用于排序的列名中含有NULL时,NULL会在开头或末尾进行汇总 SELECT product_id, product_name, sale_price, purchase_price FROM product ORDER BY purchase_price;
GROUP BY子句中不能使用SELECT子句中定义的别名,但在ORDER BY 子句中却可以使用别名,为什么呢?因为SQL在使用SELECT语句的执行顺序为:
FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
其中SELECT 的执行顺序在GROUP BY子句之后,ORDER BY子句之前,也就是说当在ORDER BY中使用别名时,已经知道了SELECT设置的别名存在,但是在GROUP BY中使用别名时还不知道别名的存在,故在 ORDER BY中可以使用别名,但是在GROUP BY中不能使用别名
SQL语句书写顺序: SELECT–FROM–WHERE–GROUP BY–HAVING–ORDER BY