基础查询

SELECT  选择,过滤,查看

语法select  查询列表  from  表名

查询列表可以是,表中的字段,常量值,表达式,函数都可以

 

查询结果是一个虚拟的表格并不存在。

查询:

   查询字段

    查询表中单个字段例如:select last_name from 表;

    查询多个字段  select last_name,salary from 表;

    查询所有字段  select * from 表;

  查询常量:

    select   常量;  //直接来

  查询表达式:

    select 100%99;

  查询函数:

    select version();

 

为字段起别名:  

  方式1:使用as关键字

    select 100%3 as 结果  from xxx;

  方式二:

    select 100%3 结果 from 表名;

 

去重:

  在字段名前面添加关键字distinct

 

连接字段:不能使用+号

  在mysql中的+号只能作为运算符

  如果两端都是值类型直接相加,如果一个是字符串先考虑能否转换不能就试为0,

  如果一方有NULL,结果也为NULL

 

  使用函数concat:

    select  concat(a,b,c) as xxx from bbb;

 

查询语句分类:

  1.条件查询

分类:
一、条件查询: 语法: select * from a where 条件; 关键是在where这里 按照where的条件分类: 1.数学条件 条件判断符:< > <= >= != 例子:
select *
from a
               where a != 1;
          2.逻辑运算符
            判断符: and(&&)就是且运算,or(||)就是或运算,not(!)就是非运算
            例子:
                select *
                from a
                where a!=1 and a!=2;
          3.模糊查找:
            判断符 like,between and , in ,in not
            引入概念:
              通配符 %,%表示通配符意思是什么都可以看例子比如容易理解
              占位符 _, _表示是啥都可以
            like:
              例子
                select *
                from a
                where last_name like '%a';#表示最后一个是啊
                where last_name like '%a%';#表示只要中间有a就行了
                where last_name like 'a%'; #表示第一个是a
                where last_name like'_a__'#第二个是a就行
            between and:
              #调高语句的简洁度
              例如: a>= 50 and a<=90 或 a between 50 and 120
            in:
              例:
                where job_id = 'aaa' OR job_id = 'bbb'
                where job_id in ('aaa','bbb','ccc')
            is not:
              NULL不能采用=来判断
              所以采用is not来
              如:coms is NULL
              如果查到有就是 is not NULL

 

  2.排序查询:

排序查询
语法:
select 查询列表

fromwhere 筛选条件

order by 排序列表[asc|desc]//desc降序

#排序列表是按照排序的字段

例:

    select *
​
•   from employees
​
•   order by salary desc
按函数排序:
length()表示长度例:

SELECT  LENGTH(last_name) as 字节长度,last_name,salary
FROM employees
order BY    字节长度 desc;
按多个排序字段排序
例:

SELECT salary,employee_id
FROM employees
ORDER BY salary asc,employee_id desc;
先按照第一个,如果第一个的一样就按照第二个来排序

 

特点:
1.asc是表示升序,从上往下升序,desc降序,不写默认升序

2.order by字句可以支持字段,多个字段,函数或别名

3.order by一般是放在最后面的。

 

  3.分组查询

分组查询
语法:
select  分组函数,列(出现在group by后面)
fromwhere
group by
order by
注意:

分组函数和group by后出现都字段

添加分组后的筛选
在最后添加having 条件句

select  分组函数,列(出现在group by后面)
fromwhere
group by
order by
having 条件
例子:

select count(*),department_id
from employees
goupy by department_id
having count(*)>2
按表达式和函数分组:
在group by 后面使用表达式和函数就行了

例如:

group by length(last_name)
 

按多个分段分组:
select 分组函数,字段1,字段2

...

group by 字段1,字段2

添加排序:
 

添加order by语句

 

  4.多表连接查询

 

 

SQL92的连接查询

连接查询
又叫多表查询

 

整体语法

语法:
    select 查询列表
    from 表1 别名,表2 别名
    where 表1.key=表2.keyand 筛选条件】
    【group by 分组字段】
    【having 分组后的筛选】
    【order by 排序字段】
 

1.等值连接
select * from 1,2
where 1.xx = 2.xxx
​
​
特点1.等值连接的结果 = 多个表的交集
2.n表连接,至少需要n-1个连接条件
3.多个表不分主次,没有顺序要求
4.一般为表起别名,提高阅读性和性能
 

2非等值连接
与等值连接一样,只是把中间的等号变成了其它符号
​
3 自连接
自己与自己连接来查询信息,常常需要给自己用的表取别名来方便操作

例子

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


sql99 连接查询

又叫多表查询四、SQL99语法 1、内连接

相当于查多个表的公共部分

语法: select 查询列表 from 表1 别名

【连接类型】join 表2 别名

on 连接条件

where 筛选条件 

group by 分组列表 

having 分组后的筛选 

order by 排序列表

 

分类:

内连接 inner

外连接:

左外连接 left [outer]

右外连接 right[outer]

全外 full[outer]

交叉连接 : cross

 

1内连接

  用来查每个表有相同的段的时候采用,求交集部分。

  分类:

    1 等值连接:

    例子

select last_name,department_name
from employees e
inner join departments d
on e.xxx = d.xxx
特点:
inner可以生省略
筛选条件在where后面
连接条件在on后面

 

 

    2 非等值连接

      就把等值连接里面的on的限制条件从等于改为其它符号

    3 自连接

 

select last_name,department_name
from employees e
inner join employees d
on e.xxx = d.xxx

 

 

外连接

语法:

select 查询列表
from 表1 别名
left|right|full【outer】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表

 

应用场景:

用来查询一个表里有,另一个表里没有的情况。

左外连接就是以A表为主表去匹配B表的数据,如果没有就表示为NULL

外连接可以看作是 = 内连接+匹配不上的NULL值

特点:

1.外连接的查询结果为主表中的所有记录

如果主表和从表匹配则完全显示

如果不匹配则显示NULL

 

 

左右外连接

select 查询列表
from 表1 别名
left|right【outer】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表

 

特点:

1.如果是左连接 left 左边的表是主表

如果是右连接right右边的表是主表

2 左外和右外交换两个表顺序,实现同样的效果

 

全外连接

mysql不支持

 

交叉连接

就是一个笛卡尔乘积

select b.*,p.*
from table1 b
cross join table2 p;