sql基础(一)-查询语句


一.查询语句

1.基础查询

1.查询表中某一字段:select 字段名 from 表名;
2.查询表中多个字段:select 字段名,字段名 from 表名;  (字段名用逗号隔开)  
3.查询表中所有字段: select * from 表名

2.进阶查询

    select 字段名 from 表名 where 筛选条件;

筛选条件大致有如下这些,其中

条件查询的条件类型
1.<>表示的是不等于
2.通配符:
① %:表示可以匹配任意多个字符包括0个

② _:表示可以匹配的任意一个字符

③ \:表示转字字符

注意:ESCAPE ‘X’可以用来自定义转义字符,比如 where name like ‘$‘;,这个句子表示把$定义为转义字符,那么这句的条件是 第二个字符为x第一个字符任意的数据

3.

  • like xx:表示查询的字段值里有xx表达式所表示的内容
  • between xx and yy:在xx和yy之间
  • in [‘xx’,’yy’]:和参数列表中字符串格式完全相同的值
  • is null :判断是否为空 (=和<>不能判断null)
  • <=>null:安全等于(可读性差,既可以判断null也可以判断普通数值)

3.排序查询

语法

 select xx from 表名 where 筛选条件 order by 排序列表 [asc|desc] 

 order by x1 ASC,x2 DESC 表示按照x1升序再按照x2降序

特点:

  • 支持按照多字段排序
  • 默认升序(ASC)
  • 排序列表内可以放表达式,函数,单个字段,多个字段

4.分组查询

作用:将表中的数据按照不同类型分组(比如相同部门中的最高工资)
语法:

select 分组函数,列(要求出现在group by的后面)

from 表

【where 筛选条件】

group by (可以放多个字段)分组的列表

【having 分组后的筛选】

【order by 子句】

注:sql语句的顺序有严格要求,不要自己随便写
案例:查询邮箱中包含a字符的,每个部门的平均工资
group by会把department_id相同的人的数据整合在一起

SELECT 
  AVG(salary),
  department_id 
FROM
  employees 
WHERE email LIKE '%a%' 
GROUP BY department_id ;

having的用法:
添加分组后的筛选用having,分组前的用where
举例:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

SELECT 
  MAX(salary) AS 最高工资,
  job_id 
FROM
  employees 
WHERE commission_pct IS NOT NULL 
GROUP BY job_id 
HAVING 最高工资 > 12000 ;#已经按照id对最高工资进行分组了,然后再用having进行分组后的帅选
  • 分组查询支持多个字段,两个字段要对应的时候分为一组

5.连接查询

关于连接查询可以看这个链接中的例子会更直观

含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

连接方式

一.内连接

一.sql192标准

注1:当没有有效连接(比如没有条件的时候)的时候会发生笛卡尔乘积现象

注2:可以通过表名.字段名的形式来具体定义


  • 等值连接(有个等号)
    案例一:匹配女生对应的男朋友(等值连接)

    SELECT 
    NAME,
    boyname 
    FROM
    boys,
    beauty    
    WHERE beauty.boyfriend_id = boys.id ;
  • 非等值连接(不相等)
    案例二:查询员工的工资和工资级别

    SELECT 
    salary,
    grade_level 
    FROM
    employees e,
    job_grades g 
    WHERE salary BETWEEN g.lowest_sal 
    AND g.highest_sal ;
  • 自连接(自己的表连接自己)
    案例三:查询员工名和上级的名称

    SELECT 
    e.employee_id,
    e.last_name,
    m.employee_id,
    m.last_name 
    FROM
    employees e,
    employees m 
    WHERE e.`manager_id` = m.`employee_id` ;

二.sql99语法

sql99语法
* 注2:连接查询必须两张表有相同元素然后以相同元素为连接条件进行连接表(没有的话得用联合查询) *
注1:这里on和where的作用是on先进行一次筛选再进行where筛选

  • 1、 on条件(连接条件)是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
  • 2、where条件(过滤条件)是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

  • inner(两表交集)
    注:用inner进行多表查询的时候连接条件是有顺序要求的
    案例一:查询名字中包含e的给员工名和工种名
    SELECT 
    last_name,
    job_title 
    FROM
    employees e 
    INNER JOIN jobs j 
      ON e.`job_id` = j.`job_id` 
    WHERE last_name LIKE "%e%" ;
    案例二:(多表查询)
    注:on的连接条件必须要带上当前插入表的数据
    SELECT 
    last_name,
    department_name,
    job_title 
    FROM
    employees e 
    INNER JOIN departments d 
      ON e.`department_id` = d.`department_id` 
    INNER JOIN jobs j 
      ON e.`job_id` = j.`job_id` 
    ORDER BY d.`department_id` DESC ;
    
* 非等值连接(改一下on的条件即可)  
案例:
```SQL
SELECT 
  salary,
  grade_level 
FROM
  employees e 
  INNER JOIN job_grades g 
    ON e.`salary` BETWEEN g.`lowest_sal` 
    AND g.`highest_sal` ;
  • 自连接(同理略)

二.外连接

外连接特性

  • 左外连接(join左边为主表,和从表没有匹配的数据值为null)
    案例一:查询没有男朋友的女神名
    SELECT 
    b.name,
    bo.* 
    FROM
    beauty b 
    LEFT JOIN boys bo 
      ON b.boyfriend_id = bo.id 
    WHERE bo.`id` IS NULL ;
    #on条件连接女神男朋友,有匹配就连接,没有就NULL
    # a LEFT JOIN B, A在左B在右
    结果:
    案例一没有where条件时的结果
  • 右外连接(同理略)
  • 全外连接(略)

6.子查询

简单来说就是查询的嵌套而已,子查询语句用括号括起来
概念

案例1:查询员工编号最少并且工资最高的员工信息(where多个条件)

SELECT 
  * 
FROM
  employees 
WHERE (employee_id, salary) = 
  (SELECT 
    MIN(employee_id),
    MAX(salary) 
  FROM
    employees) ;

7.分页查询

应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
语法(重点在limit):

select 查询列表

from 表

【join type】 join 表2

on 连接条件

where 筛选条件

group by 分组字段

having 分组后的筛选

order by 排序的字段】

limit offset,size;

offset:要显示条目的起始索引(从0开始)

size:要显示的条目个数

公式:
要显示的页数page,每页的条目数size
select 查询列表
from 表
limit (page - 1)
size, size;*

案例1:查询第11条-第25条

8.联合查询

union:联合,合并,将多条查询语句的结果合并成一个结果

注:结果集的字段名按照前者的来选,两个表的元素的是一一对应关系,比如name就插在boyname后面,如果把name和id对换的话就会变成id插在boyname下面

案例:把女生和男生和id和名字分别在同一列输出

SELECT id,boyName 
FROM boys
UNION SELECT id,NAME
FROM beauty;

结果:
结果

10. 查询总结

语法(包括代码的执行顺序):

语法:

select 查询列表 7

from 表1 别名 1

连接类型 join 表2 2

on 连接条件 3

where 筛选 4

group by 分组列表 5

having 筛选 6

order by 排序列表 8

limit 排序列表 9

文章作者: 灿若星河
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 灿若星河 !
评论
  目录