select */字段1,字段2… from nametab where 条件
条件:
-
条件1 AND/OR 条件2 id>10 AND grade <60
-
IN/NOT IN id IN (1,3,5,7,8,9)
-
LIKE & _ (一个未指定字符),% (不定个未指定字符)
select * from nametab where phone like ‘0411 8789 05__’;
select * from nametab where name like ‘c%’; -
排序 (ASC 升序 DESC 降序)
SELECT * FROM nametab ORDER BY id DESC; -
内置函数
数名 COUNT SUM AVG MAX MIN 计数 求和 求平均值 最大值 最小值 SELECT MAX(age) AS older ,MIN(age), AVG(age) FROM nametab ;
-
子查询函数
在执行子查询时,MySQL 需要创建临时表,查询结束后,才会删除这些临时表,所以在子查询的执行过程中,会多一个创建与销毁表的过程,当数据量大时,查询效率比连接查询更低。
关键词 IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS
SELECT* FROM nametab WHERE id IN (SELECT id FROM grades WHERE grade<60);
SELECT* FROM nametab GROUP BY class HAVING id IN (SELECT id FROM grades WHERE grade<60);
SELECT * FROM <表名1> WHERE EXISTS (SELECT * FROM <表名2> WHERE <条件>);
SELECT <字段名> FROM <表1> WHERE <字段名> <比较运算符> ALL (SELECT <字段名> FROM <表2>) ‘>’,就是大于最大的就行为啥用这个?
eg:查询一下 English 表中是否所有成绩 全部大于 语文 表中的成绩
SELECT * FROM English WHERE grade > ALL (SELECT grade FROM Chinese);
SELECT <字段名> FROM <表1> WHERE <字段名> <比较运算符> ANY (SELECT <字段名> FROM <表2>)【理解和ALL差不多】
- 连接 join
SELECT id,name,people_num
FROM employee,department
WHERE employee.in_dpt = department.dpt_name
ORDER BY id;
等价与
SELECT id,name,people_num
FROM employee JOIN department
ON employee.in_dpt = department.dpt_name
ORDER BY id;
内连接查询
内连接查询(INNER JOIN)是用户根据一些过滤条件来匹配表之间的数据。在逻辑查询的前三个阶段处理中,INNER JOIN 应有前两个阶段,即首先产生笛卡尔积的虚拟表,再按照过滤条件来进行数据匹配操作。
内连接的查询原理是从左表中取出每条数据与右表中的数据匹配。匹配原则为左表的这条记录和右表的记录满足相同条件,则匹配成功,查询保留此结果。
显式内连接
SELECT * FROM <左表> INNER JOIN <右表> ON <条件>;
隐式内连接
SELECT * FROM <左表>,<右表> WHERE <条件>;
外连接查询
外连接(OUTER JOIN)也是用户可以根据一些过滤条件来匹配表之间的数据。它与内连接的区别在于,通过 OUTER JOIN 查询,表中会保留未找到的数据。其中,
左外连接(LEFT OUTER JOIN) 是以左表为主表
【SELECT * FROM <左表> LEFT JOIN <右表> ON <左表>.<字段名> = <右表>.<字段名>;】;
右外连接(RIGHT OUTER JOIN)是以右表为主表
【SELECT * FROM <左表> RIGHT JOIN <右表> ON <左表>.<字段名> = <右表>.<字段名>;】。
交叉连接查询
交叉连接查询(CROSS JOIN)是对两个表执行笛卡尔积,返回两个表中所有列的组合。
SELECT * FROM <表1>,<表2>;
SELECT * FROM <表1> CROSS JOIN <表2>;
- 正则表达式
eg:选择表中以A开头的数据
SELECT * FROM table WHERE ziduan REGEXP ‘^A’;
- 联合查询
关键字 UNION(重复数据过滤) 或者 UNION ALL(重复数据不过滤)
SELECT <字段名> FROM <表名>
UNION
SELECT <字段名> FROM <表名>;