sql基础

SELECT 语法

  • SELECT 列名称 FROM 表名称

    • SELECT LastName,FirstName FROM Persons
  • SELECT * FROM 表名称

    • mysql> select * from mytable;
  • Select+where条件

    • select Name,age from mytable where age >=20 and age <=25 addre = ‘gucheng’;
    • 或select * from mytable where age >=20 and age <=25 addre = ‘gucheng’;
  • Select+where+like条件

    • select Name from mytable where Name like ‘y%’ or Name like ‘n%’;
  • 使用 Rlike 筛选已mny开头的用户(正则表达式)。

    • select Name from mytable where Name Rlike ‘1.*$’;
  • 使用 in 关键字,后面跟上一个列表

    • select Name from student where age in (18,20,25);
  • students 中有个字段课程(CID2)。查找出改字段,里面为空的字段的,学生姓名 Name

    • select Name from students where CID2 is null ;
      查询不为空就是要 is not null
    • is null 和 is not null可以实现判断字段是否为空
  • limit 子句:用于显示 结果的前 N 行
    只显示前3行

    • select * from students limit 3;
  • 只显示3行,从第5行开始计算

    • select * from students limit 3,5;
  • group by 子句 :

  • 用于分组,比如把students 表的 学生 按照男女进行分组

    • select age,Gender from students group by gender

    • students 表中的字段 有个课程的字段 CID 求出该字段中,需要将课程的人数,大于等于2的显示出来

  • having 子句

    • 只能和group by 搭配使用,使用group by 分组之后,再用having 过滤
    • select CID from students where having CID >=2
  • 多表查询如mytable(name,sex,addre,job),mypersons(name,birth)表,已知name,求douzi的年纪,生日,地址。

select mytable.sex,mytable.addre ,mypersons.birth
from mytable ,mypersons 
where mytable.name = mypersons.name;
  • 多表查询2个表中相同名称的人。
Select * 
from mytable join mypersons 
on mytable.name=mypersons.name;

SQL UNION 实例

查询2个表中相同字段下不同值

SELECT 列名 
FROM 表名
UNION #  Union All 是可以不去重的 
SELECT 列名 
FROM 表名 
ORDER BY 列名;
SELECT country FROM Websites UNION SELECT country FROM apps ORDER BY country;
  • UNION all 输出列名下所有值
SELECT 列名 
FROM 表名
UNION 
SELECT 列名 
FROM 表名
ORDER BY 列名;
SELECT country 
FROM Websites
UNION ALL 
SELECT country 
FROM apps 
ORDER BY country;
  • 带有 WHERE 的 SQL UNION ALL
SELECT 列名, 列名 
FROM 表名
WHERE 列名='CN'UNION ALL 
SELECT 列名, 列名  
FROM 表名
WHERE 列名='CN'ORDER BY 列名;
SELECT country, name 
FROM Websites 
WHERE country='CN' 
UNION ALL 
SELECT country, app_name 
FROM apps 
WHERE country='CN' 
ORDER BY country;
  • 匹配列前缀查询
    指匹配列值的开头部分,如:查询用户名以feinik开头的所有用户
 Select * 
 from mytable 
 where name like ‘jing%;
  • MySQL 排序
    我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
    使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列
SELECT * 
from 表名 
ORDER BY 列名 ASC;

如SELECT * from runoob_tbl ORDER BY submission_date ASC;

  • MySQL GROUP BY 语句

GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:

Select name ,count(*) 
from mytable 
group by name;

Select执行顺序

 SELECT a.customer_id, COUNT(b.order_id) as total_orders
 FROM table1 AS a
 LEFT JOIN table2 AS b
 ON a.customer_id = b.customer_id
 WHERE a.city = 'hangzhou'
 GROUP BY a.customer_id
 HAVING count(b.order_id) < 2
 ORDER BY total_orders DESC;

1、FORM: 对FROM左边的表和右边的表计算笛卡尔积,产生虚表VT1。
2、ON: 对虚表VT1进行ON过滤,只有那些符合的行才会被记录在虚表VT2中。
3、JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3。
4、WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。
5、GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5。
6、HAVING: 对虚拟表VT5应用having过滤,只有符合的记录才会被 插入到虚拟表VT6中。
7、SELECT: 执行select操作,选择指定的列,插入到虚拟表VT7中。
8、DISTINCT: 对VT7中的记录进行去重。产生虚拟表VT8.
9、ORDER BY: 将虚拟表VT8中的记录按照<order_by_list>进行排序操作,产生虚拟表VT9.
10、LIMIT:取出指定行的记录,产生虚拟表VT10, 并将结果返回。

where 和 join on区别

参考连接

总结一下就是
可得到on条件是在left join之前先进行条件筛选,而后才对两个表格join操作

在这里是以left join为例,对于inner join来说由于其性质,这两种条件得到的结果会是一样,但中间内部过程还是有差异的

on比where起作用更早,,先根据on条件进行多表的连接操作,生成一个临时表再通过where来筛选

group by 与Having 的使用方法

介绍

group by 用于对多条记录中有一个相同属性的集合

如 一个学生可以有多个课程

然后我们就可以对这些多个课程做聚集函数的一些操作

LIMIT与OFFSET的使用

limit 与 offset:从下标0开始
offset X 是跳过X个数据
limit Y 是选取Y个数据
limit X,Y 中X表示跳过X个数据,读取Y个数据
例如: select * from table limit 2,1; // 跳过2个数据,读取1个数据
常与order by使用:如,

     select distinct Salary
     from Employee
     order by Salary desc
     limit 1 offset 1; 

从Employee(员工)表中,读取第二高的salary(薪水),排序后,跳过第一个下标,读取一个元素


  1. MNY ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值