1、select
显示表格种一个或数个字段的所有数据记录
语法:select "字段" from "表名";
2、distinct
不显示重复的数据记录
语法:select distinct "字段" from "表名";
3、where
有条件查询
语法:select "字段" from "表名" where "条件";
条件:!=、=、<、<=、>、>=、
SELECT Store_Name FROM Store_Info WHERE Sales>1000;
SELECT Store_Name FROM Store_Info WHERE Sales<1000;
SELECT Store_Name FROM Store_Info WHERE Sales=1000;
4、and / or
and(并且)、or(或者)
语法:select "字段" from "表名" where "条件1" {[and|or] "条件2"} ;
SELECT Store_Name FROM Store_Info WHERE Sales > 1000 OR (Sales < 500 AND Sales > 200);
5、IN
显示已知的值的资料
语法:SELECT 字段 FROM 表名 WHERE 字段 IN (‘值1’,‘值2’,……);
select * from Store_info where store_name in ('los angeles','houston');
7、between
显示两个值范围内的资料
语法:select 字段 from 表名 where 字段 between ‘值1’ and ‘值2’;
select * from Store_info where date between '2020-12-06' AND '2020-12-10';
8、通配符、LIKE
通常通配符都是跟LIKE一起使用
%:百分号表示零个、一个或多个字符 _:下划线表示单个字符
like:用于匹配模式来查找资料
语法:select 字段 from 表名 where 字段 like ‘模式’;
SELECT * FROM Store_Info WHERE Store_Name like '%os%';
'A_Z':所有以 'A' 起头,另一个任何值的字符,且以 'Z' 为结尾的字符串。
例如,'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字符,而不是一个字符)。
'ABC%': 所有以 'ABC' 起头的字符串。
例如,'ABCD' 和 'ABCABC' 都符合这个模式。
'%XYZ': 所有以 'XYZ' 结尾的字符串。
例如,'WXYZ' 和 'ZZXYZ' 都符合这个模式。
'%AN%': 所有含有 'AN'这个模式的字符串。
例如,'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个模式。
'_AN%':所有第二个字母为 'A' 和第三个字母为 'N' 的字符串。
例如,'SAN FRANCISCO' 符合这个模式,而 'LOS ANGELES' 则不符合这个模式。
9、order by
按关键字排序
语法:select 字段 from 表名 where 条件 order by 字段 [ASC,DESC];
asc:按照升序进行排序,默认的排序方式
desc:按照降序进行排序
select store_name,sales,date from store_info order by sales desc;
函数
1、数学函数
数学函数: | |
---|---|
abs(x) | 返回 x 的绝对值 |
rand() | 返回 0 到 1 的随机数 |
mod(x,y) | 返回 x 除以 y 以后的余数 |
power(x,y) | 返回 x 的 y 次方 |
round(x) | 返回离 x 最近的整数 |
round(x,y) | 保留 x 的 y 位小数四舍五入后的值 |
sqrt(x) | 返回 x 的平方根 |
truncate(x,y) | 返回数字 x 截断为 y 位小数的值 |
ceil(x) | 返回大于或等于 x 的最小整数 |
floor(x) | 返回小于或等于 x 的最大整数 |
greatest(x1,x2...) | 返回集合中最大的值,也可以返回多个字段的最大的值 |
least(x1,x2...) | 返回集合中最小的值,也可以返回多个字段的最小的值 |
2、聚合函数
聚合函数 | |
---|---|
avg(字段) | 返回指定列的平均值 |
count(字段) | 返回指定列中非 NULL 值的个数,(*)则不会回来NULL值 |
min(字段) | 返回指定列的最小值 |
max(字段) | 返回指定列的最大值 |
sum(字段) | 返回指定列的所有值之和 |
3、字符串函数
字符串函数 | |
---|---|
trim() | 返回去除指定格式的值 |
concat('x','y') | 将提供的参数 x 和 y 拼接成一个字符串 |
substr('x','y') | 获取从字符串 x 中的第 y 个位置开始的字符串 |
substr('x','y','z') | 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串 |
length('x') | 返回字符串 x 的长度 |
replace('x','y','z') | 将字符串 z 替代字符串 x 中的字符串 y |
upper('x') | 将字符串 x 的所有字母变成大写字母 |
lower('x') | 将字符串 x 的所有字母变成小写字母 |
left('x','y') | 返回字符串 x 的前 y 个字符 |
right('x','y') | 返回字符串 x 的后 y 个字符 |
repeat('x','y') | 将字符串 x 重复 y 次 |
space('x') | 返回 x 个空格 |
strcmp('x','y') | 比较 x 和 y,返回的值相等(0),左边大(返回-1)右边大(返回1) |
reverse('x') | 将字符串 x 反转 |
4、||连接符
#如sql_mode开启了PIPES_AS_CONCAT,"||"视为字符串的连接操作符而非或运算符,
和字符串的拼接函数Concat相类似,这和Oracle数据库使用方法一样的
SELECT Region || ' ' || Store_Name FROM location WHERE Store_Name = 'Boston';
5、group by
BY后面的栏位的查询结果进行汇总分组,通常是结合聚合函数一起使用的
GROUP BY 有一个原则,就是 SELECT 后面的所有列中,没有使用聚合函数的列,必须出现在GROUP BY后面
语法:SELECT 字段1,SUM(字段2) FROM 表名 GROUP BY 字段1;
select Store_Name,sum(Sales) from Store_Info group by Store_Name order by Sales desc;
6、having
用来过滤由GROUP BY语句返回的记录集,通常与GROUP BY语句联合使用。 HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。如果被SELECT的只有函数栏,那就不需要GROUP BY子句
语法:select 字段1,SUM(字段2) FROM 表名 GROUP BY 字段1 HAVING(函数条件);
select Store_Name,sum(Sales) from Store_Info group by Store_Name having sum(Sales)>1500;
根据group by分组后的结果再进行条件过滤
7、别名
字段别名、表格别名
select 字段 AS 字段别名 from 表 AS 表别名
语法:SELECT “表格別名”.“字段1” [AS] “字段1別名” FROM “表格名” [AS] “表格別名”;
select A.Store_Name Store,sum(A.Sales) "Totol Sales" from Store_Info A group by A.Store_Name;
8、子查询
select A.字段 from 左表 A where A.字段 in (select B.字段 from 右表 B);
9、内查询和外查询
select 字段 from 表 where 字段 运算符 (select 字段 from 表 where 字段);
外查询 内查询(内查询的结果会作为外查询的条件来使用)
10、exists
用来测试内查询有没有产生任何结果
如果有的话,系统会执行外查询中的SQL语句,如果没有,那整个SQL语句就不会产生任何结果
语法:
select '字段1' from '表格1' where exists (select * from '表格2' where '条件');
外查询 内查询(若不成立则整个语句失效)
表连接
inner join(内连接):
只返回两个表的字段相等的行记录
left join(左连接):
返回左表所有的行记录和右表字段相等的行记录 ,不相等的行返回null
right join(右连接):
返回右表所有的行记录和左表字段相等的行记录,不相等的行返回null
union:
联集,将两个select查询语句的结果合并,并去重。
union all:
联集,将两个select查询语句的结果合并,不去重。
union&union all
联集,将两个SQL语句的结果合并起来,两个SQL语句所产生的字段需要是同样的数据记录种类
union :生成结果的数据记录值将没有重复,且按照字段的顺序进行排序
语法:
[SELECT 语句 1] UNION [SELECT 语句 2];
求交集
select A.字段 from 左表 as A inner join 右表 as B on A.字段 = B.字段;
求左表无交集
select A.字段 from 左表 as A left join 右表 as B on A.字段 = B.字段 where B.字段 is null;
求右表无交集
select B.字段 from 左表 as A left join 右表 as B on A.字段 = B.字段 where A.字段 is null;
求两个表无交集
把求左表右表无交集的方法中间加union
select A.字段 from 左表 as A left join 右表 as B on A.字段 = B.字段 where B.字段 is null,
union,
select B.字段 from 左表 as A left join 右表 as B on A.字段 = B.字段 where A.字段 is null;
多表查询
select A.字段 from 左表 A, 右表 B where A.字段 = B.字段;
视图表
create view 视图表名 as select distinct 字段 from 左表 union all select distinct 字段 from 右表;
select 字段 from 视图表名 group by 字段 having count(字段) = 1;
create view 视图表名 as select语句;
面试题
视图表的数据是否能修改?
视图表保存的是select查询语句的定义
如果select语句查询的字段是没有被处理过的源表字段,则可以通过视图表修改源表数据。
如果select语句查询的字段被group by 或函数等处理过的字段,则不可以直接修改视图表的数据。
如何批量插入数据
脚本:
a=0
while [ $a -le 100000]
do
mysql -uroot -pabc123 -e "insert into 库.表 values(……)"
let a++
done
delimiter $$
create procedure proc7()
begin
declare i int;
set i =1;
create table test03 (id int primary key auto_increment,name varchar (20));
while i <= 100000
do insert int test03 (name) values (concat('student',i));
set i = i+1;
end while;
end$$
delimiter;
call proc7
CASE
是SQL用来做if、then、else之类逻辑的关键字
语法:
select case '字段'
when '值1/条件表达式' then '结果1(值/条件表达式)'
when '值2/条件表达式' then '结果2(值/条件表达式)'
……
else 值或表达式 and AS '字段别名'
END
from 表;
无值null&空值''
空值 null 的长度为null
占用空间;
可以通过字段is null 或字段 is not null 判断是否为null 行;count(字段) 会忽略null行
无值'' 的长度为0
不占用空间;
可以通过字段=''或字段<>''判断是否为无值的行;count(字段)不会忽略无值的行
正则表达式
匹配模式 | 描述 | 实例 |
---|---|---|
^ | 匹配文本的开始字符 | '^bd'匹配以bd开头的字符串 |
$ | 匹配文本的结束字符 | 'qn$'匹配以qn结尾的字符串 |
. | 匹配任何单个字符 | 's.t'匹配任何s和t之间的一个字符的字符串 |
* | 匹配0个或多个在它前面的字符 | 'fo*t'匹配t前面有任意个0 |
+ | 匹配前面的字符1次或多次 | 'hom+'匹配以ho开头,后面至少一个m的字符串 |
字符串 | 匹配包含指定的字符串 | 'clo'匹配含有clo的字符串 |
p1|p2 | 匹配p1或p2 | |
[……] | 匹配字符集合中的任意一个字符 | '[abc]'匹配a或者b或者c |
[^……] | 匹配不在括号中的任何字符 | '[ ^ ab ]'匹配不包含a或者b的字符串 |
{n} | 匹配前面的字符串n次 | 'g{2}'匹配含有2个g的字符串 |
{n,m} | 匹配前面的字符串至少n次,至多m次 | 'f{1,3}'匹配f最少1次,最多3次 |
regexp '正则表达式'
存储过程
一组为了完成特定功能的SQL语句集合
存储过程的优点
1.执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
2.SQL语句加上控制语句的集合,灵活性高
3.在服务器端存储,客户端调用时,降低网络负载,降低服务器的压力
4.可多次重复被调用,可随时修改,不影响客户端调用
5.可完成所有的数据库操作,也可控制数据库的信息访问权限
创建存储过程
1.修改SQL语句
2.创建存储过程
3.把结束符改回分号
4.调用存储过程
查看存储过程
show create procedure 存储过程名;
show procedure status like '存储过程名'\G
存储过程参数(只能用于字段)
in 传入参数
out 传出参数
inout 传入传出参数
create procedure 存储过程名 (in 传入参数名 参数数据类型 out 传出参数名 参数数据类型)
begin
select 字段 into 传出参数 from 表 where 字段 = 传入参数;
end$$
call 存储过程名(参数值|@变量名; @变量名); #传入参数指定的值可以是纯量值,也可以是变量名;传出参数指定的值只能是变量名
create procedure 存储过程名 (inout 参数名 参数数据类型)
begin
select 字段 into 参数名 from 表 where 字段 = 参数名
end$$
set @变量名 = 传入的值; #设置传入的值
call 存储过程名(@变量名); #传入产出参数指定的值只能是变量名
select @变量名; #查看传出的值
存储过程控制语句
1)条件判断语句:
if 条件表达式 then
SQL语句序列1
else
SQL语句序列2
fi
2)循环语句:
while 条件表达式
do
SQL语句序列;
set 条件迭代;
end while;