单表查询、多表查询和子查询

2018-06-18 01:03:54来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

查询语句类型: 
  简单查询 
  多表查询 
  子查询(嵌套查询) 

查询语法:

  SELECT  field_name     :field_name为字段名,选择要查询的列
    FROM  table_name    :database_name为数据库名,选择要查询的数据表
  [ WHERE  condition ]     : condition 为查询条件,只有满足where后面条件,才将相应就结果输出
  [ DISTINT ]    :过滤掉重复的行
  [ 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  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 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:MySQL从服务配置文件

下一篇:1.MySQL数据库基础