Mysql极简笔记(4)---数据查询操作

本篇目录

  • 一、SELECT查询语句结构
  • 二、 主语句用法
    • 1、常规用法
    • 2、别名AS语句及函数调用
  • 三、行过滤语句where
    • 1、 常规用法
    • 2、全字符匹配like语句
    • 3、正则表达式REGEXP语句
    • 4、日期函数操作
  • 四、分组语句group by
  • 五、 排序语句order
  • 六、 筛选边界语句limit

一、SELECT查询语句结构

语句名 解释
SELECT 列名 必选项(顺序1):要显示的列
FROM 表名 必选项(顺序2):选取表
[WHERE 语句] 可选项(顺序3):行级过滤——高频
[GROUP BY语句] 可选项(顺序4):逻辑分组
[ORDER 语句] 可选项(顺序5):排序语句——高频
[LIMIT 语句] 可选项(顺序6):明确筛选边界

二、 主语句用法

1、常规用法

  1. 显示customers表中cust_id和cust_name 的全部数据
    SELECT cust_id,cust_name FROM customers;

  2. 显示customers中全部列,常用此语句会拖慢数据库效率
    SELECT * FROM customers;

  3. 显示customers中cust_address全部数据。DISTINCT:相同的值仅显示一次
    SELECT DISTINCT cust_address FROM customers;

2、别名AS语句及函数调用

  1. 拼接字段
    SELECT Concat(RTrim(ven_name),'(',Upper(vend_address),')') AS vend_title FROM vendor;

    RTrim()去掉串右边的空格,Concat()连接括号内的字符串,Upper()大写,Left()串左边的字符,Length()串长度
    显示结果为表头vend_title,值类似walmart(SHANGHAI)
    AS后为别名:新表头

  2. 聚合函数(忽略NULL)
    SELECT Count(*) AS num_vend FROM vendor;
    显示总共有多少行
    SELECT AVG(prod_price) AS avg_price FROM products;
    显示列的平均值,表头为avg_price,类似的有MAX(),MIN(),SUM()

三、行过滤语句where

1、 常规用法

单语句写法:

SELECT * FROM customers WHERE prod_id=14;

复合写法:

SELECT pro_id,vend_id,prod_name,prod_price,prod_desc FROM products
WHERE (pro_id NOT IN (12,13,14) AND prod_name !='chuck') OR (prod_price >=20 AND prod_desc IS NOT NULL)
  • IN和NOT语句:pro_id NOT IN (12,13,14) 表示pro_id列中,值不是12,13,14这三个的其他行
  • 操作符语句:prod_name !='chuck’表示prod_name 值不是字符串chuck的其他行,还有四个基本运算符=,>,<,!,一个特殊的运算符BETWEEN a AND b
  • NULL语句:NULL表示没有填,不是空格,空字符串或者0
  • 组合操作符:AND 且:两个条件都要匹配,OR 或:两个条件匹配一个即可

2、全字符匹配like语句

SELECT * FROM customers WHERE prod_name LIKE '_uck%’;

  • 通配符:%:相当于word中的*,_:相当于word中的?
  • 全字符匹配:含通配符必须在内容和字符个数上与数据匹配
  • 筛选默认不区分大小写

3、正则表达式REGEXP语句

SELECT * FROM customers WHERE prod_name REGEXP 'huck’;

  • 局部匹配,只要行中出现huck就显示
  • 筛选默认不区分大小写,字符串前加关键句BINARY,则区分大小写
  • 字符串中可使用正则表达式(部分符号)
  • 特殊字符用\\\特殊字符查找

正则表达式部分:

范例 解释 范例 解释
.huck 等同word里?通配符 ^chu chu出现的数据开头处
chucks* chuck、chucks、chuckss… ck$ ck出现在数据结尾处
c(hu|ho)ck chuck或chock [0-2]uk 0uk或1uk或2uk
chucks+ chucks,chuckss… chucks{3} chucksss
chucks{2,4} chuckss、chucksss、chuckssss [^a-cd]uk 非auk或buk或cuk或duk

4、日期函数操作

SELECT cust_id FROM orders WHERE Date(order_date) BETWEEN '2001-06-12' AND '2005-06-15';

范例表:

范例 解释 范例 解释
Date() 输出日期部分 Time() 输出时间部分
Now() 输出当前日期加时间 DayOfWeek() 输出星期部分
CurDate() 返回当前日期部分 CurTime() 返回当前时间部分
Year() 返回年部分(Month,Day,Hour等同

注:时间列的数据类型为DATE

四、分组语句group by

SELECT order_num,SUM(quantity*item_price) AS ordertotal
FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >=50;
  • 结果:显示订单号order_num和相同订单号的总价ordertotal两列(group by 和having中不可用别名)
  • 步骤:以订单号为集合名,将表分成一个个子集,后面的函数SUM()针对的是各个子集做操作,where过滤行,having过滤分组
  • 规定:
    1. group by 可以包含多列,表示可以对子集再分子集
    2. NULL为单独一组,可用函数count(),avg(),sum(),
    3. 合计: GROUP BY order_num WITH ROLLUP会增加合计一行
    4. 除函数外,SELECT列出的每一列必须在GROUP子句中给出

五、 排序语句order

SELECT * FROM customers
ORDER BY  prod_id DESC,prod_name;
  • 先按prod_id 降序排序,如果prod_id 相同,按prod_name排序
  • DESC 为降序排列,与limit子句组合可筛选出极值行

六、 筛选边界语句limit

LIMIT 5,3

  • 从第6行开始,向后3行,即6、7、8行,因为第一行是从0开始编号

LIMIT 3

  • 等同于LIMIT 0,3,即显示前三行

上一篇:Mysql极简笔记(3)—数据增删改操作
下一篇:Mysql极简笔记(5)—复合语句、联结及视图

你可能感兴趣的:(MySQL)