-- 查找单列SELECT course_id FROM courses;-- 查找多列SELECT course_id, course_name FROM courses;-- 检索所有列-- * 是个通配符. 检索不必要的列通常会降低性能.SELECT*FROM courses;-- 检索不同的行-- 不能部分使用 DISTINCTSELECT DISTINCT course_id FROM courses;-- 限制结果-- 返回结果不多于 5 行SELECT course_id FROM coursesLIMIT5;-- 完全限定名称-- 为了避免命名空间冲突SELECT courses.course_id FROM courses;
排序检索: ORDER BY
SQL 语句由子句(clause)构成, 有些子句是必须的, 有些则不是.
ORDER BY 字句
-- 按 course_name 排序SELECT course_name FROM coursesORDER BY course_name;-- 按多列排序SELECT course_id, course_name FROM coursesORDER BY course_id, course_name;-- 按指定排序方向, 关键字: DESC(ascending)-- 默认是 ASC(ascending)-- 本例按 id 高排序SELECT course_id, course_name FROM coursesORDER BY course_id DESC, course_name;
数据过滤: WHERE
通常数据过滤在服务器而不是在客户端解决. 想想为什么?
ORDER BY 得放在 WHERE 后面.
使用圆括号分组操作符是个好习惯.
MySQL 里的 NOT 和其他 SQL 语句略有不同. NOT IN, NOT BETWEEN 也支持.
-- 按指定的搜索条件条件过滤SELECT prod_name, prod_priceFROM productsWHERE prod_price =2.50;-- 空值检查SELECT prod_name FROM productsWHERE prod_price ISNULL;-- AND, OR-- AND 运算优先级高于 ORSELECT prod_name, prod_priceFROM productsWHERE (vend_id =1002OR vend_id =1003) AND prod_price >=10;-- IN-- 像是个语法糖-- 但比常规的 OR 要快SELECT prod_name, prod_priceFROM productsWHERE vend_id IN (1002, 1003) AND prod_price >=10;-- NOT-- 和 Python 里的一样SELECT prod_name, prod_priceFROM productsWHERE vend_id NOTIN (1002, 1003)ORDER BY prod_name;
-- 聚集函数-- 效率更高. 想想看和下面的差在哪?SELECTMAX(column_name) AS max_valueFROM table_name;-- 普通的查询SELECT column_name FROM table_nameORDER BY column_nameDESCLIMIT1;
-- 用子查询-- 括号里的先算SELECT cust_idFROM ordersWHERE order_num IN (SELECT order_numFROM orderitemsWHERE prod_id ='TNT2');-- 其实你可以拆成两个查询. 最好先写成两步, 然后合并为子查询.-- 作为计算字段使用子查询/*| cust_name | cust_state | orders ||-----------|------------|--------|| John | NY | 3 || Mary | CA | 2 || David | TX | 0 || Lisa | NY | 1 |*/SELECT cust_name, cust_state, (SELECTCOUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS ordersFROM customersORDER BY cust_name