MySQL的select语法及其相关应用

select基本用法

官网链接

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
    [HIGH_PRIORITY]
    [STRAIGHT_JOIN]
    [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
    [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr] ...
    [into_option]
    [FROM table_references
      [PARTITION partition_list]]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [into_option]
    [FOR UPDATE | LOCK IN SHARE MODE]

into_option: {
    INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
  | INTO DUMPFILE 'file_name'
  | INTO var_name [, var_name] ...
}

执行步骤:

1.先从from字句一个表或多个表创建工作表
2.将where条件应用于1)的工作表,保留满足条件的行
3.GroupBy 将2)的结果分成多个组
4.Having 将条件应用于3)组合的条件过滤,只保留符合要求的组。
5.Order By对结果进行排序。

基本查询SELECT…FROM…

FROM子句是SELECT语句中必不可少的子句,可以使用FROM子句指定查询所需要的数据源名称。

FROM table_source

其中,table_source指定要在SQL语句中使用的表,视图。虽然语句中可用的表源个数的限值可以用内存和查询中其他表达式的复杂性而有所不同,但一个语句中可最多使用256个表源。

注:如果查询中引用了很多表,查询性能会受到影响,编译和优化时间也受到其他因素的影响。

SELECT Id FROM songinfo;
SELECT Id,Name,Artist FROM songinfo ;/**多列查询 /

带条件的查询

  1. 比较运算符
    在这里插入图片描述
/**bewteen操作符/
  1. where子句
    where子句理常用到操作符,查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
/**练习/
SELECT Id,Name,Artist FROM songinfo
WHERE Id>64010;
SELECT Id,Name,Artist FROM songinfo
WHERE Artist = '陈奕迅';
/**MySQL 的 WHERE 子句的字符串比较是不区分大小写的/
/**使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。/
SELECT * from runoob_tbl WHERE BINARY runoob_author='RUNOOB.COM';

SELECT * FROM songinfo WHERE Name!='陈奕迅'
/**null的值没有出现查询结果里/
SELECT * FROM songinfo 
WHERE IFNULL(Name,'')!='陈奕迅'
/**查询到结果里有null就会被转化为''输出出来/
  1. 逻辑操作符
    在这里插入图片描述

分组

  1. 常用聚合函数(aggregate function)
    count() 计数
    sum() 求和
    avg() 平均数
    max() 最大值
    min() 最小值
  2. group by子句实现分组
    GROUP BY 语句根据一个或多个列对结果集进行分组。会把值相同放到一个组中,最终查询出的结果只会显示组中一条记录。GROUP BY子句常常配合着聚合函数一起使用。WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计
SELECT Id,Name,Artist FROM songinfo
GROUP BY Artist; /**分组/
SELECT Artist,COUNT(*) FROM songinfo
GROUP BY Artist;/**查看每个乐手有多少个记录/
SELECT Artist,`Name`,MAX(Id) FROM songinfo
GROUP BY Artist WITH ROLLUP;/**先按照乐手进行分组,在统计乐手对应表中存储的最大ID号/
  1. having子句
    HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足
/**引用菜鸟教程案例选择出访问量大于200的网站/
SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM (access_log
INNER JOIN Websites
ON access_log.site_id=Websites.id)
GROUP BY Websites.name
HAVING SUM(access_log.count) > 200;

回顾与注意事项 :
1、where 后不能跟聚合函数,因为where执行顺序大于聚合函数。
2、where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
3、having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

结果排序

ORDER BY 关键词用于对记录集中的数据进行排序。
ORDER BY 关键词默认对记录进行升序排序,即使
ASC关键字。如果想降序排序,使用 DESC 关键字。

SELECT Artist,`Name`,Id FROM songinfo
WHERE Artist = '陈奕迅'
ORDER BY Id DESC;

对多个列进行排序
根据多个列进行排序。当按照多个列进行排序时,只有第一列的值相同时才使用第二列。

定义列别名

查询时候,MySQL 会显示每个 SELECT 后面指定输出的列,在有些情况下,显示的列名称会很长或者名称不够直观,MySQL 可以指定列的别名,替换字段或表达式。
<列名>:为表中字段定义的名称。<列别名>:字段新的名称。 AS:关键字为可选参数。

SELECT Artist AS songartist 
FROM songinfo;

取名也要“见名知意”。
列别名:如果别名中无空格等,可以省略双引号,如有空格等,不能省略双引号;
附注:
表别名:不能加双引号,表中的别名不要中间有空格等,表取别名时,加双引号,就会报错。尽量简洁命名。

SELECT Artist AS "song artist" 
FROM songinfo;/**可以正常输出,如果无双引号的别名加空格会报错/

空置处理

  1. ISNULL(expr)
    判断expr是否为空,是返回1,否返回0
  2. IFNULL()
    IFNULL(expr1,expr2),含义是:如果第一个参数不为空,则返回第一个参数,否则返回第二个参数。

说明IF函数和IFNULL函数

  1. IF(expr1,expr2,expr3)含义是:如果第一个表达式的值为TRUE(不为0或null),则返回第二个参数的值,否则返回第三个参数的值。
SELECT IF(ISNULL(NULL),1,2)
  1. NULLIF(expr1,expr2)
    如果expr1= expr2 成立,那么返回NULL,否则返回expr1
mysql> SELECT NULLIF(1,1)
result> null
  1. COALESCE ( expression,value1,value2…,valuen)
    COALESCE()函数的第一个参数expression为待检测的表达式,而其后的参数个数不定。COALESCE()函数将会返回包括expression在内的所有参数中的第一个非空表达式。如果expression不为空值则返回expression;否则判断value1是否是空值,如果value1不为空值则返回value1;否则判断value2是否是空值,如果value2不为空值则返value2;……以此类推,如果所有的表达式都为空值,则返回NULL。

假设有一个人员表,表内有人的出生日期。如果出生日期不为空则将出生日期做为“重要日期”,如果出生日期为空则判断注册日期是否为空,如果注册日期不为空则将注册日期做为“重要日期”,如果注册日期也为空则将“2008年8月8日”做为“重要日期”。实现此功能的SQL语句如下:

SELECT FName,FBirthDay,FRegDay, 
COALESCE(FBirthDay,FRegDay,'2008-08-08')  AS ImportDay  
FROM T_Person 

消除重复记录

重复记录有两种

  1. 是完全重复的记录,也即所有字段均重复的记录
  2. 是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

对于第一种重复,比较容易解决,使用distin,让一个列可以仅仅列出不同(distinct)的值。**SELECT DISTINCT 语句用于返回唯一不同的值。**得到无重复记录的结果集。

语法
SELECT DISTINCT column_name,column_name
FROM table_name;

SELECT DISTINCT Artist FROM songinfo;
/**单列去重/
SELECT DISTINCT Artist,Name FROM songinfo;
/**多列去重/

对于第二中通常是是需要使用group加上一定的条件达到去重。

…CASE WHEN … THEN … END

case when 条件1 then 取值1 when 条件2 then 取值2 else 取值3 end

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值