MySQL 基本查询

MySQL 查询语句通用写法

1  SELECT 
2  DISTINCT <select_list>
3  FROM <left_table>
4  <join_type> JOIN <right_table>
5  ON <join_condition>
6  WHERE <where_condition>
7  GROUP BY <group_by_list>
8  HAVING <having_condition>
9  ORDER BY <order_by_condition>
10 LIMIT <limit_number>

执行顺序是3 4 5 6 7 8 1 2 9 10

1、select查询

2、distinct 去重
<select_list>查询列表。表中字段列表,也可以是 常量 表达式 函数。可以使用as 关键字为查询列表起别名。

3 4 5。连接查询 表示进行操作的数据集。
连接查询 多表查询, 连接语法有92语法 和 99语法 没有有效的连接条件默认就是笛卡尔积
内连接 (等值连接 非等值连接 自连接) 外连接 (左外连接 右外连接 全外连接) 交叉连接
根据其中一张表中每一行与另一张表每一行匹配,就是笛卡尔积连接,然后根据连接条件筛选出有效的行,无效的行过滤掉。
查询时可谓表起别名 as 也可以省略 如 (table1 as t1 ) (table2 t2)。注起别名后,限定表时不能使用原始名称了。
sql92标准 mysql中仅仅支持内连接

  • 等值连接 多表等值连接结果为多表的交集部分 n表连接至少需要n-1连接条件
  • 非等值连接 连接条件不为 = 可以使 between and > <等
  • 自连接 自表的等值连接。比如员工表中有员工编号字段和领导标号。可以为一张表起两次别名。

sql99标准(mysql中支持内连 外连(左外,右外不支持全外连接)交叉连接) 推荐
select 查询列表 from 表1 别名 【连接类型】 join 表2 别名 on 连接条件 。。。

  • 内连接 连接类型 inner 等值连接 非等值连接 自连接 同92

  • 外连接 左外(left outer) 右外(right out) 全外(full out) out可省。查询一张表中有而另一张表中没有的数据。

    • 左外连接 左表为主表,会显示左表全部内容,右表中如果没有匹配内容会显示null
    • 右外连接 类似左外 右表为主表
    • 全外连接 MySQL不支持 就是两张表中每一行都会显示,匹配的正常显示,匹配不到的就显示null
  • 交叉连接 (就是笛卡尔积)cross join

6、WHERE 条件查询

  • 按条件表达式筛选 条件运算符: >, <, =, >=, <=, !=, <>(就是不等于)
  • 按逻辑表达式筛选 逻辑运算符:&&, ||, ! 对应 and, or, not
  • 模糊查询 like, between and, in, is null
    • like一般和通配符搭配使用。通配符 %( 任意多个字符) _(一个字符)
    • between and 包含临界值。
    • in 判断某字段的值是否属于in 列表中某一项
  • is null MySQL字段值中可能出现null。这是不能用 = null 做判断安全等与可以判断null,<=>null

7、group by分组查询。一般可以搭配分组函数使用。查询列表比较特殊(分组函数和group by后出现的字段)
select 分组函数,列(出现在group by后面) from 表 group by 分组的列表
可按多个字段进行分组

8、having 分组后筛选条件。
一般来说,分组函数做条件一定是放在hanving字句中。 能用where分组前筛选的尽量使用分组前筛选。
除了字段,group by 也可以按照表达式,函数进行分组。

9、order by 排序 可以按 字段(单个或多个),表达式,函数 排序 关键字 asc 升序(默认) desc 降序一般放在查询语句最后 ,除了limit。

10、limit offset,size 分页 offset要显示条目的起始索引(从0开始) size 要显示的条目个数

附1:常见函数。 使用 函数名(实参列表)
单行函数

  • 字符函数

    • length 获取参数值字节个数 length(“张三丰hahaha”) 结果15,所占字节数和charset有关
    • concat 拼接字符串 concat(‘a’,’-’,‘b’) 结果 ‘a-b’
    • substr,substring 截取字符串,共四个函数重载。索引从1开始 。常用
      • substr(‘张无忌陆展元www’, 6) 截取指定索引处后面所有字符 结果 ‘元www’
      • substr(‘张无忌陆展元www’, 6, 1) 截取指定索引处后指定长度字符 结果 ‘元’
    • instr 返回子字符串在主串中起始索引 找不到返回 0 instr(‘abcb’, ‘b’) 结果 2
    • trim 去除前后指定字符 默认 ’ ‘, trim(’ 张翠山 ') 结果 ‘张翠山’ trim(‘aaa张aaa翠山aaaa’) 结果 ‘张aaa翠山’
    • upper 转大写 upper(‘aBc’) 结果 ABC
    • lower 转小写lower(‘Abc’) 结果 abc
    • lpad 用指定字符实现左填充指定长度 lpad(‘殷素素’, 5, ‘*’) 结果 ‘**殷素素’,若指定长度小于字符串长度,字符串从左截取指定长度
    • rpad 用指定字符实现右填充指定长度 同上相反。。。
    • replae 替换 replace(‘杨过爱上小龙女,小龙女’, ‘小龙女’, ‘黯然销魂’) 结果’杨过爱上黯然销魂,黯然销魂’
  • 数学函数

    • round 四舍五入 round(1.45) 结果1 round(-1.55) 结果-2。重载round(1.567, 2)结果 1.57
    • ceil 向上取整 ceil(1.02) 1 返回 大于等于该参数的最小整数 ceil(-1.02) -1
    • floor 向下取整 返回小于等于该参数的最大整数
    • truncate 截断 小数点后保留位数 truncate(1.6999, 1) 1.6
    • mod 取模/趋于 mod(10, 3) 1相当于 10%3 1。mod(-10,3) -1, mod(10,-3) 1。算法a-a/b*b
  • 日期函数

    • now 返回当前系统日期+时间
    • curdate 返回当前系统日期
    • curtime 返回当前系统时间
    • year 返回年 year(now())
    • month 返回月
    • monthname 返回英文月名 monthname(now())
    • day 返回日
    • hour 返回时
    • minute 返回分
    • second 返回秒
    • str_to_date 将日期格式字符串转换成指定格式的日期 str_to_date(“9-13-1999”, ‘%m-%d-%Y’) 1999-09-13。 格式符 %Y 四位年份 %y 两位年份 %m月份(01,02。。。12)%c月份(1,2。。。12)%d 日 (01,02。。。)%H 小时 24小时制 %h 12小时制 %i分钟(00,01,02。。。)%s秒(00,)
    • date_format 将日期转换成字符date_format(now(), ‘%y年%m月%d日’) 19年07月29日
  • 其他函数
    - version mysql 版本
    - database 当前使用数据库
    - user 当前用户

  • 控制函数

    • if if(条件表达式1, 表达式2,表达式3)当条件表达式1成立,返回表达式2的值,不成立返回表达式3的值。 if(10>5, 10, 5) 10。
    • case 两种一种类似于switch case 一种类似于 if else if else

switch case 适合等值判断

case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
。。。
else 要显示的值n或语句n;

if else if else

case
when 条件表达式1 then 显示的值1或语句1;
when 条件表达式1 then 显示的值1或语句1;
。。。
else 要显示的值n或语句n

多行函数(做统计使用)又称统计函数,聚合函数,组函数。 可以组合使用
sum avg一般用于处理数值型,max,min,count可以处理任何类型。可与distinct搭配如 sum(distinct 字段)
与分组函数搭配查询的字段有限制

  • sum 求和 忽略null
  • avg 求均值 忽略null
  • max 求最大值 忽略null
  • min 求最小值 忽略null
  • count 求非空值数量忽略null 一般使用count(*) 统计行数
    • count (*) 统计个数,
    • count (1) 统计个数。相当于每列加一个 1 然后统计1 的个数
    • 效率 myisam引擎中 count()效率最高 innodb中count()与count(1)效率差不多。

附2: 子查询 出现在其他语句中的select语句,称为子查询或内查询。
子查询放在小括号内 一般房在条件右侧 执行优先于主查询,主查询条件用到了子查询结果
按结果集的行列数不同:

  • 标量子查询(结果集只有一行一列) 一般搭配单行操作符使用 > < >= <= <>
  • 列子查询 结果只有一列多行 一般搭配多行操作符使用 in any/some all(括号内是查询语句)
    • in not in 等于/不等于 列表中任意一个
    • any | some 和子查询返回的某一个值比较 a>any(10, 20, 30) a大于其中任一个就可以查出结果
    • all 和子查询返回的所有值比较 a>all(10,20,30) a大于括号中所有的才可以查询出
  • 行子查询 (结果集有一行多列)
  • 表子查询(结果集一般为多行多列)

按子查询出现位置

  • select 后 仅仅支持标量子查询 就是一行一列
  • from 后 支持表子查询
  • where 或 having后 标量子查询(较多) 列子查询(较多) 也支持行子查询(使用较少)
    • 标量子查询
    • 列子查询搭配操作符使用时如果有 any|some/all 可以使用min,max相关语句代替
    • 行子查询 (结果集是一行多列 或多行多列) 使用较少
  • exists 后(相关子查询)查询结果集是否存在 也就是返回布尔型数据 查询可能涉及到了主查询相关字段,因此执行是在主查询之后,类似筛选条件。可以使用in 代替

附3 联合查询 union 将多条查询语句结果放在一起。
应用场景 要查询的结果来自多个表其多个表没有直接的连接关系,但查询的信息一致时
多条查询结果语句的查询列数一致
多条查询结果每一列对应的类型与顺序一致

发布了59 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/dandanfengyun/article/details/97623091