SELECT语句的组成:

子句 描述 备注
SELECT 显示指定列的内容 不可缺少,可以为列名指定别名,列名也可以是表达式
FROM 指明数据来源 不可缺少,可以为表名指定别名
INTO 将查询结果存储到新表中 可缺少,新表中各列的参数与原表相同,用于快速建表
WHERE 指定条件 若缺少此项,则表示全部记录
ORDER BY 将查询结果排序 可缺少,可以指定排列方式为升序(默认)和降序
GROUP BY 将查询结果分组显示 可缺少,分组依据通常是一个列名
LIMIT 用来限制结果数量 可缺少

SELECT语句的完整语法:

SELECT【ALL/DISTINCT】目标列表达式  [AS 别名], ···    --ALL不去掉重复 DISTINCT去掉重复
FROM 表名或视图名 或者(SELECT语句)AS 表名(属性)
[WHERE] 条件表达式
[GROUP BY] 列名 【HAVING 条件表达式】
[ORDER BY] 列名 【ASC|DESC】 --ASC = ASCENDING(默认为递增递增)DESC = DESCENDING(递减)
[LIMIT子句]

其中SELECT和FROM是必须的,其他关键字是可选的。

注意:这几个关键字的执行顺序与SQL语句的书写顺序并不是一致的。


执行顺序:

  1. FROM:需要从那个数据表检索数据
  2. WHERE:过滤表中数据的条件
  3. GROUP BY:如何见上面过滤出的数据分组
  4. HAVING:对上面已经分组的数据进行过滤的条件
  5. SELECT:挑选结果集中的哪个列 或 列的计算结果
  6. ORDER BY:按照什么样的顺序来查看返回的数据

去重选项

去重选项:是指是否对结果中完全相同的记录(所有字段数据都相同)进行去重:

  • ALL:不去重 (默认)
  • DISTINCT:去重

  • 语法:SELECT 去重选项 字段列表 FROM 表名;
CREATE TABLE student(name VARCHAR(15),gender VARCHAR(15));
INSERT INTO student(name,gender) VALUES("lihua","male");
INSERT INTO student(name,gender) VALUES("lihua","male");
SELECT * FROM student;
SELECT DISTINCT * FROM student;

注意:去重针对的是查询出来的记录,而不是存储在表中的记录。如果说仅仅查询的是某些字段,那么去重针对的是这些字段。

字段别名

字段别名:是指给列名另取一个名字。

  • 字段别名只会在当次查询结果中生效。
  • 字段别名一般都是简写字段名、辅助了解字段意义(比如我们定义的名字是name,我们希望返回给用户的结果显示成姓名)

  • 语法:SELECT 字段 AS 字段别名 FROM 表名;
CREATE TABLE student(name VARCHAR(15),gender VARCHAR(15));
INSERT INTO student(name,gender) VALUES("lihua","male");
INSERT INTO student(name,gender) VALUES("lihua","male");
SELECT * FROM student;
SELECT name AS "姓名",gender AS "性别" FROM student;

数据源

事实上,查询的来源可以不是“表名”,只需是一个二维表即可。那么数据来源可以是一个SELECT结果。

数据源可以为单表数据源 或者 多表数据源

  • 单表: SELECT 字段列表 FROM 表名;
  • 多表: SELECT 字段列表 FROM 表名1,表名2,…;

    注意:多表查询时是将每个表中的X条记录与另一个表Y条记录组成结果,组成的结果的记录条数为X*Y (笛卡尔积)


  • 语法:SELECT 字段列表 FROM (SELECT语句) AS 表别名;

    这是将一个查询结果作为一个查询的目标二维表,需要将查询结果定义成一个表别名才能作为数据源

SELECT name FROM (SELECT * FROM student) AS d;

WHERE子句

WHERE子句:是用于筛选符合条件的结果的。

WHERE几种语法:

  • 基于值:

    • =:WHERE 字段 = 值;
      查找出对应字段等于对应值的记录。
      (相似的,<是小于对应值,<=是小于等于对应值,>是大于对应值,>=是大于等于对应值,!=是不等于)

      例如:WHERE NAME = 'lihua'

    • LIKE:WHERE 字段 LIKE 值;
      功能与 = 相似 ,但可以使用模糊匹配来查找结果。

      • 通配符 % 用法:替代一个或多个字符
      • 通配符 _ 用法:仅替代一个字符
      • 通配符 [charlist] 用法:字符列中的任何单一字符
      • 通配符 [^charlist] 用法:不在字符列中的任何单一字符

        例如:WHERE NAME LIKE 'li%'

    • IS:WHERE 字段 IS 值;
      判断对应字段是否为空。(IS [NOT] NULL)
  • 基于值的范围:
    • IN:WHERE 字段 IN 范围;查找出对应字段的值在所指定范围的记录。

      例如:WHERE AGE IN (18,19,20)

    • NOT IN:WHERE 字段 IN 范围;
      查找出对应字段的值不在所指定范围的记录。

      例如:WHERE AGE NOT IN (18,19,20)

    • BETWEEN X AND Y:WHERE 字段 BETWEEN X AND Y;
      查找出对应字段的值在闭区间[X,Y]范围的记录。

      例如:WHERE AGE BETWEEN 18 and 20。

  • 条件复合:
    • OR:WHERE 条件1 OR 条件2… ;
      查找出符合条件1或符合条件2的记录。
    • AND:WHERE 条件1 AND 条件2… ;
      查找出符合条件1并且符合条件2的记录。
    • NOT:WHERE NOT 条件1 ;
      查找出不符合条件的所有记录。
    • &&的功能与AND相同;
      ||OR功能类似;
      !NOT功能类似。

注意:WHERE是从磁盘中获取数据的时候就进行筛选的,所以某些在内存是才有的东西WHERE无法使用。(字段别名什么的是本来不是“磁盘中的数据”(是在内存这中运行时才定义的),所以WHERE无法使用,一般都依靠HAVING来筛选)

SELECT name AS n ,gender FROM student WHERE name ="lihua";
-- SELECT name AS n ,gender FROM student WHERE n ="lihua"; 报错
SELECT name AS n ,gender FROM student HAVING n ="lihua";

GROUP BY子句

GROUP BY子句:可以将查询结果依据字段来将结果分组。


  • 语法:SELECT 字段列表 FROM 表名 GROUP BY 字段...;

    注意:字段可以有多个,实际就是二次分组

SELECT name,gender,count(name) AS "组员" FROM student AS "学生" GROUP BY name;
SELECT name,gender,count(name) AS "组员" FROM student AS "学生" GROUP BY name,gender;

实际上,GROUP BY的作用主要是统计(使用情景很多,比如说统计某人的总分数,学生中女性的数量。。),所以一般会配合一些统计函数来使用:

  • COUNT(X):统计每组的记录数,X是*时,代表记录数;为字段名时,代表统计字段数据数(除去NULL)
  • MAX(X):统计最大值,X是字段名
  • MIN(X):统计最小值,X是字段名
  • AVG(X):统计平均值,X是字段名
  • SUM(X):统计总和,X是字段名

注意:GROUP BY子句后面还可以跟上ASC或DESC,代表分组后是否根据字段排序。

HAVING子句:

HAVING子句:功能与WHERE类似,不过HAVING的条件判断发生在数据在内存中时,所以可以使用在内存中才发生的数据,如“分组”,“字段别名”等。(操作符之类的可以参考WHERE的,增加的只是一些“内存”中的筛选条件)


  • 语法:SELECT 字段列表 FROM 表名 HAVING 条件;【操作符之类的可以参考WHERE的,增加的只是一些“内存”中的筛选条件】
SELECT name AS n ,gender FROM student HAVING n ="lihua";
SELECT name,gender,COUNT(*) AS "组员" FROM student AS d GROUP BY name,gender HAVING COUNT(*) >2 ;--这里只显示记录数>2的分组

ORDER BY子句:

ORDER BY子句:可以使查询结果按照某个字段来排序。

  • ASC:代表排序是递增的(默认)
  • DESC:代表是递减

    注意:也可以指定某个字段的排序方法。
    比如第一个字段递增,第二个递减。只需要在每个字段后面加ASC或DESC即可(虽然默认不加是递增,但还是加上更清晰明确)。


  • 语法:SELECT 字段列表 FROM 表名 ORDER BY 字段 [ASC|DESC];

    注意:字段可以有多个,从左到右,后面的排序基于前面的,(比如:先按NAME排序,再按GENDER排序,后面的GENDER排序是针对前面NAME排序时NAME相同的数据)

SELECT * FROM student ORDER BY name;
SELECT * FROM student ORDER BY name,gender;
SELECT * FROM student ORDER BY name ASC,gender DESC;

LIMIT子句

LIMIT子句:是用来限制结果数量的。
与WHERE\HAVING等配合使用时,可以限制匹配出的结果。
但凡是涉及数量的时候都可以使用LIMIT(这里只是强调LIMIT的作用,不要过度理解)


  • 语法:SELECT 字段列表 FROM 表名 LIMIT [OFFSET] COUNT;
  • COUNT:是数量(常数)
  • OFFSET:是偏移量(常数),OFFSET默认从0开始,可以说是每条记录的索引号
SELECT * FROM student LIMIT 2;
SELECT * FROM student LIMIT 3,2;
SELECT * FROM student WHERE name ="lihua" limit 2; --取前2个记录行
SELECT * FROM student WHERE name ="lihua" limit 3,2; --从第3条开始,取2条

本文参考:https://www.cnblogs.com/progor/p/8786133.html

SQL笔记之SELECT语句的更多相关文章

  1. SQL指南-SELECT语句

    SELECT 语句 SELECT 语句用于从表中筛选数据.列表结果存储于一个结果表中(称作result-set) 语法 SELECT column_name(s)FROM table_name 注意: ...

  2. SQL 基础:Select语句,各种join,union用法

    一.基本的SELECT语句 1. “*”的注意事项:在SELECT语句中,用*来选取所有的列,这是一个应该抵制的习惯. 虽然节省了输入列名的时间,但是也意味着获得的数据比真正需要的数据多的多.相应的, ...

  3. SQL基础篇----select语句与排序问题

    一.检索--输出所有的列 SELECT * FROM my_friends WHEREfirst_name = 'cake'; 知识点1 * 代表选择出所有的行-----(什么行呢?)就是first_ ...

  4. SQL Server 基本SELECT语句

    1.SELECT 和 FROM 语句 SELECT表示执行的是查询,接着需要更知道从哪边查询数据,FROM就是限制读取的数据在哪一个表或哪几个表中,这样就构成了一个基本语句. SELECT * FRO ...

  5. MySQL学习笔记:select语句性能优化建议

    关于SQL中select性能优化有以下建议,仅当笔记记录. 1.检查索引:where.join部分字段都该加上索引 2.限制工作数据集的大小:利用where字句过滤 3.只选择需要的字段:减少IO开销 ...

  6. SQL insert into select 语句

    遇到权限数据变更的需要批量到别的平台, 在175平台添加一个权限需要, 批量到别的现有平台, 以后的建站, 会把sql放到自动建站里面; 权限的 insert into select 表一: `ous ...

  7. Oracle SQL开发 之 Select语句完整的执行顺序

    查询语句语法: Select 属性 From 表 Where 条件 Group by 分组条件 Having 分组选择条件 Order by 排序条件 1.from子句组装来自不同数据源的数据: 2. ...

  8. sql insert into select语句写法-将查询结果直接插入到表中

    insert into month_gpcj_info(idStr,zszrmygpsl,xyzrmygpsl,mycje,mycjl,month_date,dataCompiledDate) sel ...

  9. SAS学习笔记32 select语句

随机推荐

  1. JS 变量提升与函数提升

    JS 变量提升与函数提升 JS变量提升 变量提升是指:使用var声明变量时,JS会将变量提升到所处作用域的顶部.举个简单的例子: 示例1 console.log(foo); // undefined ...

  2. Centos7搭建SS以及加速配置的操作记录 (转载)

    原文地址https://www.cnblogs.com/kevingrace/p/8495424.html 部署 Shadowsocks之前,对它做了一个简单的了解,下面先介绍下.一道隐形的墙众所周知 ...

  3. http://www.cnblogs.com/langjt/p/4281477.html

    http://www.cnblogs.com/langjt/p/4281477.html

  4. 最简单的struts应用

    博客园 1.搭建一个简单的Struts2应用 具体为一下几个步骤: 1.引入Struts 2工程所需运行库文件. 2.创建并配置web.xml文件 3.创建一个Action类 4.创建并配置strut ...

  5. T-2-java面向对象

    一.类 类对象的数据结构定义,方法是对象的行为. 类是数据类型. 一个类可以创建多个对象,这多个对象结构相同,数据不同. 类中可以包含:(1)成员变量(对象的共同特征,静的):(2)方法(对象的共同行 ...

  6. IDEA的相关使用-----快捷键

    转:https://blog.csdn.net/qq_35091777/article/details/80988165 IntelliJ Idea 常用快捷键列表 Alt+回车 导入包,自动修正Ct ...

  7. 编程感悟-建立好代码sop

    1.最近学django和python,发现很多的函数记不住,这时候我百度了一下,发现记不住是程序员的正常情况, 这下心安理得多了,记好笔记和咱的sop吧,会很快. 社会是不是也这样,好多东西也记不住, ...

  8. C++标准库之string返回值研究

    先说结论(不一定适用所有环境): 1) GCC默认开启了返回值优化(RVO),除非编译时指定“-fno-elide-constructors”: 2) 现代C++编译器一般都支持返回值优化: 3) s ...

  9. C++ STL next_permutation(快速排列组合)

    排列组合必备!! https://blog.csdn.net/bengshakalakaka/article/details/78515480

  10. scrum学习

    一.关于Scrum 什么叫Scrum?Scrum是一种迭代式增量软件开发过程,通常用于敏捷软件开发.Scrum包括了一系列实践和预定义角色的过程骨架.Scrum中的主要角色包括同项目经理类似的Scru ...