SQL语句
注意
• SQL 语言大小写不敏感。
• SQL 可以写在一行或者多行
• 关键字不能被缩写也不能分行
• 各子句一般要分行写。
• 使用缩进提高语句的可读性。
(一)DQL
https://baijiahao.baidu.com/s?id=1595349117525189591&wfr=spider&for=pc
1、基础查询
SELECT 要查询的东西
【FROM 表名】;
类似于Java中 :System.out.println(要打印的东西);
特点:
①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
② 要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数
一、使用别名
1、使用AS
SELECT last_name AS name
FROM employees;
2、使用空格,别名特殊时建议加双引号
SELECT last_name "Name", salary*12 "Annual Salary"
FROM employees;
二、去重
SELECT DISTINCT last_name
FROM employees;
三、+号
#两个都为数值型,做加法运算
SELECT 100+90;
#有一方为字符型,则尝试转化为数值型,失败则为0
SELECT '100'+90;
SELECT 'join'+90;
#null结果均为null
SELECT null+90;
#+号也可用CONCAT代替
SELECT CONCAT(100,90);
四、IFNULL()
#该字段为null使查询结果为0
SELECT IFNULL(a,0);
2、条件查询
根据条件过滤原始表的数据,查询到想要的数据。
语法:
select
要查询的字段|表达式|常量值|函数
from
表
where
条件 ;
分类:
一、条件表达式
示例:salary>10000
条件运算符:
> < >= <= = !=(建议使用<>)
二、逻辑表达式
示例:salary>10000 && salary<20000
逻辑运算符:
and(&&):两个条件如果同时成立,结果为true,否则为false
or(||):两个条件只要有一个成立,结果为true,否则为false
not(!):如果条件成立,则not后为false,否则为true
三、模糊查询
(1)%代表任意多个字符(包含0个),_代表任意单个字符,\_转义为\
示例:last_name like 'a%'
last_name like '\_%'
last_name like '$_%' ESCAPE '$'
(2)BETWEEN AND
包含临界值,左右别写颠倒
select
要查询的字段|表达式|常量值|函数
from
表
where
a>=100 and a<=120
等价于
select
要查询的字段|表达式|常量值|函数
from
表
where
a (NOT) BETWEEN 100 AND 120
(3)IN
括号中类型必须相同或兼容
select
要查询的字段|表达式|常量值|函数
from
表
where
a=1 OR a=2;
等价于
select
要查询的字段|表达式|常量值|函数
from
表
where
a IN(1,2);
(4)IS NULL 判断是否为空,不可用于其他判断
<=> 安全等于,可用于其他判断
3、排序查询
默认升序,语法:
select
要查询的东西
from
表
where
条件
order by 排序的字段|表达式|函数|别名 【asc|desc】
先a升序排,后b降序排
select
要查询的东西
from
表
where
条件
order by a ASC,b DESC;
4、分组查询
语法:
select 查询的字段,分组函数
from 表
group by 分组的字段
特点:
1、分组筛选
针对的表 位置 关键字
分组前筛选: 原始表 group by的前面 where
分组后筛选: 分组后的结果集 group by的后面 having
select
count(*)
from
表
where
条件
GROUP BY
order by a ASC,b DESC;
HAVING count(*)>1;
2、可以按多个字段分组,字段之间用逗号隔开
5、连接查询
(1)sql92:仅支持内连接和外连接
内连接
(1)等值查询
a.多表查询结果为多表的交集部分
b.n表连接至少需要n-1个条件
c.建议给表起别名
SELECT * from class,stu where class.cid=stu.cid;
#使用别名,注意此时别名和表明限定只能用一个
SELECT * from class c,stu s where c.cid=s.cid;
#字段多个表均有需说明限定
SELECT c.cid from class c,stu s where c.cid=s.cid;
(2)非等值查询
在(1)基础上,条件为不为相等而已
(3)自连接
连接查询多个表为自身
SELECT c.cid from class c,class s where ...
(2)sql99
SELECT c.cid from class c[连接类型]
stu s where c.cid=s.cid;
1、内连接 inner
(1)等值查询
SELECT c.cid from class c
inner join stu s on c.cid=s.cid(连接查询内容)
where ...(其他内容)
(2)非等值查询
(3)自连接
少用
2、外连接
左右外:
用于查询一个表有而另一个表没有的情况
主表:以此为主进行查询 从表
(1)左外left[outer] 左为主表
(2)右外right[outer] 右为主表
全外:结果为共有+表一独有+表二独有,mysql不支持
(3)全外full[outer]
3、交叉连接 cross
即笛卡尔乘积:如果连接条件省略或无效则会出现,查询结果有m*n个
解决办法:添加上连接条件
(3)7种join理论
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4VZSRYxo-1596117243638)(C:\Users\ddjj6\Pictures\Camera Roll\七种join 理论.png)]
a.内连接(两表的共有部分)
SELECT * FROM tbl_dep d INNER JOIN tbl_emp e ON d.id=e.deptId;
b.左连接(左表的全部,右表不满足补NULL)
SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId;
c.右连接(右表的全部,左表不满足的补NULL)
SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId;
d.特殊的左连接(显示为左表的独有的数据)
SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId
--非共有(右边没有)
WHERE e.deptId IS NULL;
e.特殊的右连接(显示为右表的独有的数据 )
SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId
---非共有(左边没有)
WHERE d.id IS NULL;
f.全连接(显示全部数据)(mysql 不支持 full outer join)
--UNION :有去重的功能
SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId UNION
SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId;
g.显示两表的独有的数据
--d+e
SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id=e.deptId WHERE e.deptId IS NULL UNION
SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id=e.deptId WHERE d.id IS NULL;
6、子查询
SELECT name
FROM class
WHERE (SELECT…………)
分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eD02RYa8-1596117243654)(C:\Users\ddjj6\AppData\Roaming\Typora\typora-user-images\1571390759404.png)]
特点
1、子查询都放在小括号内
2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
3、子查询优先于主查询执行,因为主查询使用了子查询的执行结果
4、子查询根据查询结果的行数不同分为以下两类:
① 单行子查询
结果集只有一行
一般搭配单行操作符使用:> < = <> >= <=
非法使用子查询的情况:
a、子查询的结果为一组值
b、子查询的结果为空
② 多行子查询
结果集有多行
一般搭配多行操作符使用:any、all、in、not in
in: 属于子查询结果中的任意一个就行
any和all往往可以用其他查询代替
7、分页查询
语法
select 字段|表达式,...
from 表
【where 条件】
【group by 分组字段】
【having 条件】
【order by 排序的字段】
limit 【起始的条目索引,】条目数;
特点
1.起始条目索引从0开始
2.limit子句放在查询语句的最后
3.查询11-15行共15条
select * from 表 limit 10,5
公式:select * from 表 limit (page-1)*sizePerPage,sizePerPage
假如:
每页显示条目数sizePerPage
要显示的页数 page