一、最基本的select查询语句
select 字段1,字段2,......from 表名;
select * from 表名;//*号代表所有字段
查询xsda表中所有女生的记录
select * from xsda where 性别='女';
查询xscj表中的学号,姓名,计算机三项信息,结果按计算机成绩的降序排列
select 学号,姓名,计算机
from xscj order by 计算机 desc;
-- order by 排序 desc降序
二、列的别名(as)
列别名只能在order by 中使用
例如:select sname as 书名 from book;
as可省略。
列的别名还可以用双引号“ ”,当别名中间用空格时使用。(不要使用单引号)
三、去除重复行(distinct)
例如:select distinct sname from book;
(去除重复行只能去除一个,意思就是只能查询一个,
不能和其他查询的字段一起,会出错
例如:select sname,distinct cno from book;)
四、空值参与计算(null)
SELECT 字段名称
FROM 表名
WHERE 字段名称 IS (not)NULL;
null不等同于0。
空值参与运算,结果一定为空
ifnull(参数1,参数2) 数据为null时用参数2,否则用参数1。
五、着重号
当语句中字段名或者表名等出现关键字时给关键字加着重号
例如:select * from `order`;
六、显示表结构
desc (describe)表名;(显示表中字段的详细信息)
七、where子句
where 字句后面的条件不能用列别名
where字句(声明在from字句后面)
例如:select * from book where sname=‘计算机基础’;(字符串用单引号括起来)
选取所有价格大于30的产品(>)
SELECT * FROM Products
WHERE Price > 30;
八、插入(insert into)
1- 指定要插入的列名和值:
INSERT INTO table_name (字段名称1, 字段名称2, ...)
VALUES (value1, value2, value3, ...);
2-为表的所有列添加值
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
将查询结果插入到另一个表里面:
insert into 目标表
(目标字段1,......)
select
(来源表字段1,......)
from 来源表
[where条件];
九、更新(update)
UPDATE 表名
SET 字段名称1 = value1, 字段名称2= value2, ...
WHERE 条件;
十、删除(delete)
DELETE FROM 表名 WHERE 条件;
从多个表删除:
delete 表名1,表名2......from 表名1,表名2,......
[where条件];
或
delete from 表名1,表名2...... using 表名1,表名2,......
[where条件];
十一、聚合函数
count——max——min——sum——avg
SELECT 聚合函数( )
FROM 表名;
//聚合函数不能和where一起使用,聚合函数有条件时使用having
十二、替换查询结果数据(case)
case
when 条件1 then 表达式1
when 条件2 then 表达式2
......
eles 表达式n
end
from 表名;
十三、运算符
(一)算术运算符(+ - * / div % mod)
除法运算时,若分母为0,结果为null
% mod 运算时,结果的符号和%前一个数,也就是被模数符号相同
例如:12%-5=2 -12%5=-2
(二)比较运算符
1.= <= <=> >= != < > <>
= 符号只要有null参与比较,结果就为null
2.is null /is not null/isnull( )
例如:select * from book where sname is null;
或者
select * from book where isnull(sname);
3.between 条件1 and 条件2
查询条件1到条件2范围的数据,包含边界
条件1是下限,条件2是上限
4.in/not in
例如:select * from book where sname in(‘计算机基础’,‘MySQL数据库’);
满足二者其一即可
5.like 模糊查询
查询姓李的同学
例如:select * from xscj where name like‘李%’;
% 0个或者多个不确定字符
_(下划线)一个不确定字符
当查询的字符里面包含%或者_(下划线)
使用转义字符:\
例如:select * from xscj where name like‘_\_静’;
\符号后面的下划线只是单纯的下划线
或者
使用转义字符:escape
例如:select * from xscj where name like‘_$_静’ escape ‘$’;
escape指定转义符为$,$后面的下划线只是单纯的下划线。
(三)逻辑运算符
1.逻辑非(not/!)
2.逻辑与(and/&&)
3.逻辑或(or/||)
4.逻辑异或(xor)
and 和 or可以一起使用 但是and优先级高于or
十四、排序、分类与分页
(一)排序(order by)
如果没有使用排序操作,默认查询返回数据是按照添加数据的顺序显示
例如:按照成绩grade降序排序
select * from xscj order by grade desc;
升序 asc 降序desc 默认为升序
(可以使用列别名进行排序)
(where声明在from之后,order by 之前)
(二)分页(limit)
limit 偏移量,显示的条目数
例如:limit 0,15 从第1条开始,显示15条
公式:
limit (偏移量—1) * 显示条目数,显示条目数
where,order by ,limit声明顺序:
xacj表中成绩大于九十分的
select * from xscj where grade>‘90’
按照成绩降序排序
order by grade desc
显示出前三个
limit 3;
(三)分类(group by)
语法格式:
SELECT 字段名称1, 字段名称2, ...
FROM table_name
ORDER BY 字段名称1, 字段名称2, ... ASC|DESC;
//desc降序
//asc升序
//默认升序
十五、多表查询(重点)
(一)多表查询的正确方式(需要有连接条件)
例如:select xscj.sno,xs.name,xscj.grade
from xscj,xs
where xscj.sno=xs.sno;
1.如果查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表(例如:xscj.sno)。
2.从SQL优化的角度,建议多表连接时,每个字段前都指明其所在的表。
3.可以给表起别名,在select,where中使用表的别名。
例如:select a.sno,b.name,a.grade
from xscj as a,xs as b
where a.sno=b.sno;
如果给表起了别名,一旦在select或者where中使用表名的话,必须使用取的别名,不能再使用表的原名。
当涉及到一个表,需要自己和自己连接时,必须用别名。
4.如果有n个表实现多表查询,至少需要有(n-1)个连接条件。
(三)等值连接 VS 非等值连接
非等值连接举例:
等值连接:
上面第(二)大点举的例子都是等值连接(等值连接顾名思义就是用=连接起来,非等值连接就是用除了=以外的符号连接起来)。
select 表名1.列名1,表名1.列名2......表名2.列名1.....
from 表名1,表名2
where 表名1.列名=表名2.列名;
(四)自连接 VS 非自连接
一个表自己和自己连接(自连接)
不同的表连接(非自连接)
例如:select xscj.sno,xs.name,xscj.grade
from xscj,xs
where xscj.sno=xs.sno;
(xscj表和xs表的连接)
(五)内连接 VS 外连接
1.内连接:合并具有同一列的两个以上表的行,结果集中不包含一个表和另一个表不匹配的行。(例如求交集)
2.外连接(题目关键字,题目有所有两个字,信息又来自不同的表):合并同一列的两个以上的表的行,结果集中除了包含一个表与另一个表匹配的行以外,还查询到了左表(左外连接)或者右表(右外连接)中不匹配的行。(相当于并集)
(1)左外连接(left join):左表为主+交集部分
例如:select xscj.sno,xs.name,xscj.grade
from xscj left join xs
on xscj.sno=xs.sno;
(2)右外连接(right join):右表为主+交集部分
例如:select xscj.sno,xs.name,xscj.grade
from xscj right join xs
on xscj.sno=xs.sno;
(3)满外连接([inner] join):并集部分
A.例如:select xscj.sno,xs.name,xscj.grade
from xscj join xs
on xscj.sno=xs.sno;
B.union关键字的使用:
语法格式:select 字段名称,....from table1
union[all]
select 字段名称,.....from table2
union关键字返回两个查询结果集的并集,去除重复部分。
union all :返回两个查询结果的并集,对于重复部分,不去除。
(题目没有要求去除重复结果时 )
C.其中join的实现
中图:内连接
左上图:左外连接
右上图:右外连接
左中图:在左上图的基础上要null的部分
右中图:在右上图的基础上要null的部分
左下图:满外连接(如:左上图 union all 右中图)
右下图:(左中图 union all 右中图)
D.using连接
例如:select xscj.sno,xs.name,xscj.grade
from xscj join xs
using (sno);
括号中填要指定的同名字段。
十六、子查询(难点+重点)
子查询:一个查询语句嵌套了另一个查询语句。子查询要包含在一个括号里面,放在语句的右侧。
(一)单行子查询
单行子查询:内查询返回一个数据给外查询使用。(操作符:= > >= < <= <>)
例如:select *from xscj where sno =(select sno from xs where name=‘张三’);
(二)多行子查询
多行子查询:内查询返回多行数据给外查询使用。
操作符:
1.in:等于列表中的任意一个。
例如:select employee_id,last_name
from employees
where salary in
(select min(salary) from employees group by department_id);
2.any:和单行操作符一起使用,和子查询返回得某一个值比较。
例如:
3.all:和单行操作符一起使用,和子查询返回的所有值比较。
例如:
4.some:any的别名,作用相同,一般使用any。
(三)exists子查询
测试子查询结果是否为空表,若为空,返回false,否则返回true
语法
SELECT 字段名
FROM 表名
WHERE EXISTS
(SELECT 字段名 FROM 表名 WHERE条件);