单表查询、多表查询和子查询,旧
旧,
查询语句类型:
简单查询
多表查询
子查询(嵌套查询)
查询语法:
SELECT
[ DISTINT ] :过滤掉重复的行
field_name :field_name为字段名,选择要查询的列
FROM table_name :database_name为数据库名,选择要查询的数据表
[ WHERE condition ] : condition 为查询条件,只有满足where后面条件,才将相应就结果输出
[ ORDER BY filed_name [ASC|DESC] ] :filed_name为字段名, 以指定的列排序, ASC 升序(默认),DESC降序
[ HAVING condition ] : condition 为查询条件, having 只能和group by 一起使用,用于对分组结果过滤
[ LIMIT [offset,]Count ] : [offset,]Count 从第offset行开始显示(注意第一行为0),显示count行
简单查询
1.SELECT * FROM tb_name; * 代表所有列,如果只输出指定字段,则把“* ” 代替为指定字段名
查询tb_book表中的所有数据:select * from tb_book ;
2. SELECT field1,field2 FROM tb_name; 只输出指定字段称为 投影
只查询tb_book表中id和 books 的字段: select id,books from tb_book ;
3.SELECT * FROM tb_name WHERE 条件; 只输出符合条件的行称为 选择
查看tb_book表中sort列的值是基础类的记录: select * from tb_book where sort='基础类' ;
DISTINCT 相同的值只显示一次(过滤掉重复的行)
查询tb_book表中sort字段有几种类型: select distinct sort from tb_book ;(注意用distinct 过滤掉重复的行)
不加distinct的结果如下:
WHERE子句:后面跟布尔关系表达式
SELECT * FROM tb_name WHERE 条件
比较运算符:
1. =、>、>=、<=、< 数值比较不加引号,字符串比较加引号
例如: select * from tb_book where sort='基础类' ; 查看tb_book表中sort列的值是基础类的记录:
2. BETWEEN 值1 AND 值2 :在值1和值2(包括值1和值2) 之间则匹配
查询出tb_book表中id列的值在20~30中间的记录:select * from tb_book where id between 20 and 30 ;
3. LIKE ‘’
%: 匹配任意长度任意字符
_:匹配任意单个字符
4. REGEXP, RLIKE 支持正则表达式
5. IN ("value1" ,"value2"……) 在列表中的任意一个,则匹配
6. IS NULL 判断是否为空,为空则匹配
7. IS NOT NULL 判断是否不为空,不为空则匹配
逻辑运算符:
1. AND 同时满足所有条件
2. OR 满足任意一个条件
3. NOT 不满足指定条件,则匹配
ORDER BY field_name {ASC|DESC} : 查询结果排序(ASC升序,DESC降序) ,默认为ASC
语法: select 列名 from 表名 order by 以那个列排序 [ASC|DESC]
字段别名:AS
select name as student_name from student; 显示时显示为student_name不是name
LIMIT子句:
LIMIT [offset,]Count 从第offset开始显示(注意第一行为0),显示count个
聚合:
SUM(), 求某个字段值的总和
MIN(),求某个字段值的最小值
MAX(), 求某个字段值的最大值
AVG(), 求某个字段值的平均值
COUNT() 返回所选列中非NULL值的行的数目
GROUP BY: 分组
HAVING 条件(having 只能和group by 一起使用,用于对分组结果过滤)
执行次序如图所示
多表查询:
连接: 交叉连接(笛卡尔乘积)::用一个表中的每一行与另一个表中的每一行相连接
select * from 表名1,表名2
或者
select * from表名1 cross join 表名2
自然连接(内连接):将两种表中相应字段的值逐一比较,只列出那些等值关系的行
select * from 表名1,表名2 where表名1.字段名= 表名2.字段名
或者
select * from表名1 inner join 表名2
表名1.字段名= 表名2.字段名
外连接:
左外连接:select 字段名 from 表名1 LEFT JOIN 表名2 ON 表名1.字段名= 表名2.字段名
返回除内连接的数据外,还包括左表中不符合条件的数据,(也就是说左外连接包括左表的所有数据)并在右表的相应列添加空 右外连接:select 字段名 from 表名1 RIGHT JOIN 表名2 ON 表名1.字段名= 表名2.字段名
返回除内连接的数据外,还包括右表中不符合条件的数据,(也就是说右外连接包括右表的所有数据)并在左表的相应列添加空
自连接(表必须使用别名):
子查询:
在外面一层的查询中使用里面一层查询产生的结果,当遇到多层查询时,mysql从最内层的查询开始,然后从它开始向外向上移动到外层(主)查询,在这个过程中每个查询产生的结果集都被赋给包围它的父查询
1.比较操作中使用子查询:子查询只能返回单个值;
语法: select 列名 from 表名 where 字段名 比较运算符 (子查询)
比较运算符包括 =,!=,>,>=,<,<=。
注意:用"()" 括住子查询,只有子查询的结果只能返回一个值,比较运算符才适用
2.IN()中使用子查询:假如一个子查询返回结果有多个,这时比较运算符就必须用关键字IN代替
语法: select 列名 from 表名 where 字段名 in (子查询)
注意:用"()" 括住子查询,子查询的结果可以有多个
3.带关键字EXISTS的子查询: 使用关键字exists时,内查询语句不返回查询的记录,而是返回一个真假值,如果内查询语句查询到满足条件的记录,就返回一个真值(True),否则 将返回一个假值(false)。当返回的值为true时,外查询语句将进行查询,当返回的值为false时,外查询语句就不进行查询或查询不出任何记录。
语法: select 列名 from 表名 where exists (子查询)
注意:用"()" 括住子查询, NOT EXISTS 刚好与EXISTS 相反.
4.带关键字ANY的子查询:any 表示满足其中任意一个条件。使用关键字any时,只要满足内查询语句返回的结果中的任意一个,就可以通过该条件执行外查询
select 列名 from 表名 where 字段名 比较运算符 any (子查询)
5..带关键字ALL的子查询:all表示满足所有条件。使用关键字all时,只有满足内查询语句返回的所有结果,才可以执行外查询
select 列名 from 表名 where 字段名 比较运算符 all (子查询)
联合查询:联合查询结果是将多个select 语句的查询结果合并到一起,
关键字UNION:将所有的查询结果合并到一起 ,然后去除相同的记录
关键字UNION ALL:只是简单将结果和并到一起
(select 1) UNION (select 2); 将两个查询结果合并起来
视图: 存储下来的SELECT语句;(在MySQL中用处不大,跟安全相关时有意义)
基于基表的查询结果;
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
显示创建某个表、视图、数据库等用了什么语句
SELECT CREATE {DATABASE | TABLE | VIEW} NAME
广义查询:
DML:
DELETE
INSERT INTO
UPDATE
INSERT INTO tb_name (col1, col2, ...) VALUES (val1, val2, ...)[,(val1, val2, ...),...]
INSERT INTO tb_name SET col1= ,col2= ,....
INSERT INTO tb_name (col1,col2...) SELECT ....
字符型:单引号
数值型:不需要引号
日期时间型:
空值:NULL, ''
REPLACE INTO 与INSERT类似
DELETE:
DELETE FROM tb_name WHERE condition;
TRUNCATE tb_name: 清空表,并重置AUTOINCREMENT计数器;
UPDATE tb_name SET col1=..., col2=... WHERE
原文来自 http://www.cnblogs.com/xiaonengsho/p/8567937.html