SELECT 语句

  1. SELECT
  2. [ALL|DISTINCT|DISTINCTROW]
  3. select_expr[,select_expr,...]
  4. FROM table_references // 数据来源
  5. [WHERE where_condition] // 数据的选择条件
  6. [GROUP BY {col_name|expr|position}[ASC|DESC],...[WITH ROLLUP]] // 对检索到的数据分组
  7. [HAVING where_condition] // 指定组的选择条件
  8. [ORDER BY {col_name|expr|position}[ASC|DESC],...]
  9. [LIMIT {[offset,]row_count|row_count OFFSET OFFSET}] // 限制行数

例子:

  1. select cust_name,cust_sex,cust_city from mysql_test.customers;

列的选择与指定:

1、定义并使用列的别名

  1. select
  2. cust_name,cust_address AS dizhi,cust_contact
  3. FROM mysql_test.customers;

2、替换查询结果中的数据

  1. CASE
  2. WHEN 条件1 THEN 表达式1
  3. WHEN 条件2 THEN 表达式2
  4. ...
  5. ELSE 表达式
  6. END [AS] column_alias

例子:

  1. select cust_name,
  2. case
  3. when cust_sex='m' then '男'
  4. else '女'
  5. end as xingbie
  6. from mysql_test.customers;

3、计算列值

  1. select cust_name,cust_sex,cust_id+100
  2. from customers;

聚合函数count 与 GROUP BY 联用

聚合函数是内置函数

count 求组中项数,返回INT类型整数
max 求最大值
min 求最小值
sum 返回组中所有值的和
avg 求组中值的平均值
BIT_AND 逻辑与
BIR_OR 逻辑或
BIT_XOR 逻辑异或

FROM 子句与多表链接查询

1、交叉链接,又称为笛卡尔积

  1. SELECT * FROM table1 CROSS JOIN table2;
  2. // 下面是简写
  3. SELECT * FROM tbl1,tbl2;

2、内连接

  1. SELECT some_columns FROM tbl1
  2. INNER JOIN tbl2
  3. ON some conditions;

例子:

  1. select * from tbl_student
  2. inner join tbl_score
  3. on tbl_student.studentNo=tbl_score.studentNo;

3、外链接

左外链接:

在FROM子句中使用关键字 LEFT OUTER JOINLEFT JOIN

右外链接

在FROM子句中使用关键字 RIGHT OUTER JOINRIGHT JOIN

数据查询

WHERE 子句与条件查询

1、比较运算符

= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
<=> 不会返回 unknown

2、判定范围

当查询的过滤条件被限定在某个范围时,可以使用关键字 BETWEEN (与AND连用)

  1. select * from customers
  2. where cust_id between 903 and 912;

3、关键字 IN

使用关键字 IN 可以指定一个值的枚举表,该表中会列出所有可能的值
例子:查询cust_id为903,906,908的客户信息

  1. select * from customers
  2. where cust_id in(903,906,908);

4、关键字 LIKE

在where子句中有时候我们需要查询包含xxx 字符串的所有记录,这时候就需要用到运算符 like。

  1. SELECT column_name from table_name WHERE column_name LIKE '%value%'

说明:

  1. LIKE 子句中的 % 类似于正则表达式中的 * ,匹配任意0个或多个字符
  2. LIKE 子句中的 _ 匹配任意单个字符
  3. LIKE 子句中如果没有 % 和 _ ,就相当于运算符 = 的效果

例如:查找所有姓张的人

  1. select user_name from mt.user
  2. where user_name like '张%';

5、判定空值

  1. expr IS [NOT] NULL

例子:

  1. select * from customers
  2. where cust_address is null;

子查询

  • 表子查询
  • 行子查询
  • 列子查询
  • 标量子查询

    1、结合关键字 IN 使用子查询

    1. WHERE expr [NOT] IN(subquery)
    示例:查询任意所选课程成绩高于80分的学生的学号和姓名
    1. select studentNo,studentName
    2. from tb_student
    3. where studentNo in(select studentNo from tb_score where score > 80); // studentNo 是外键

    2、结合比较运算符的子查询

    1. expr {=|<|<=|>|>=|<=>|<>|!=} {ALL|SOME ANY}(subquery)

    3、结合关键字 EXISTS 使用子查询

    1. EXISTS(subquery)
    子查询的结果集不为空,则返回 true,否则返回 false

    GROUP BY 子句 与 分组数据

    GROUP BY 子句常与聚合函数一起调用
    1. GROUP BY {col_name|expr|position}[ASC|DESC]...[WITH ROLLUP];
    示例
    1. select address,sex,count(*) as '人数'
    2. from customers
    3. group by address,sex
    4. with rollup

    HAVING 子句

    HAVING子句 用于过滤分组(与GROUP BY 连用),可以包含聚合函数,在数据分组后过滤

    ORDER BY 子句(排序)

    1. ORDER BY {col_name|expr|position}[ASC|DESC],...
    示例:
    1. select name,sex from cust
    2. order by name desc,address desc;

    LIMIT 子句

    使用LIMIT 子句限制被select语句返回的行数
    1. LIMIT {[offset,]row_count|row_count OFFSET offset}
    示例:
    1. select cust_id,cust_name from cust
    2. order by cust_id
    3. limit 4,3; // 从第5行开始,返回3行
    4. // 另一种写法
    5. limit 3 offset 4; // 返回3行,初始值第5行