一 select语句
基本语法
select 列名1,列名2 //可以使用完全限定的列名 tables.列名
form tables
过滤(where )
分组(group by 列名1,列名2) // 分组依据必须是 select的所有列名(统计计算的除外) ,否则可能会出现歧义具体见下
having 对分组进行过滤 , 不可使命别名(select里定义的别名)
排序(order by)
limit子句
1)distinc关键字
select distinct A,B,C from tables; 从表中tables 里,查询ABC 三列, distinct 指明 A B C这三列中至少有一列不同时才显示。
2)LIMIT
select A,B,C from tables limit 5; 显示前五行
select A,B,C from tables limit 5,5; 显示行5开始的五行 计数是从行0开始的
3)order by 字句, 对索引行进行排序
order by A,B 先按A进行排序,再按B进行排序 默认是升序
order by A desc,B 按A进行降序排列,再按B进行升序排列, desc 只修饰位于其前面的一列。
3)where字句
= != < <= > >= BETWEEN 指定两个值之间
select A,B,C from tables
where c between 2 and 10; // 为赋值列可以这样索引 where c is NULL
select A,B,C from tables
where A<2 AND C>10 ; // OR 也行 AND 的优先级比OR 高 A = 1 OR A=2 AND C<5 与 A = 1 OR (B>2 AND C<5)等价
IN 用来指定条件范围
select A,B,C from tables
where A IN(1002,1003) // IN 字句还可以包含其他SELECT语句
order by A
4) LIKE 文本匹配
A like 's%e' 中间为任意个任意字符 即只匹配出 s....e 这样的行 as.....e匹配不出来, LIKE 是全量匹配
A like 's_e' 下划线 表示任意一个字符
5)正则表达式 REGEXP (正则表达式规则,后续写) 子串匹配
A REGEXP '1000' 列A中包含子串 ‘1000’的所有列
1000|2000
[123] 1或2或3
[0-9] [a-z] 区间或 [:digit:]任意数字同[0-9]
[:digit:]{4} 后面的4指明匹配四次, 即任意4位数
[:digit:]{4,} 不少于4个
[:digit:]{4,6} 4到6个之间
^文本的开始 ^[0-9\.] 在文本的开始处匹配 数字或者.
$文本的结尾
[[: 词的开始
[[:>:]]词的结尾
6) AS 与 concat函数
concat(A, '(', B,')') 输出列名为 A(B)
A AS E 给列起个别名E进行显示 输出
7) 算数计算 (+ - * /)
select procid, price, num, price*num AS total
form tables;
where total>2000;
order by total; 输出总价大于2000的 所有产品的 id 单价 数量 和总价信息 并排序
8) 函数
文本操作函数
left() 返回串左边的字符
length() 串的长度
lower() 转化为小写
LTrim() 去掉串左边的空格
RTrim()
Upper()
select procid,Upper(procname), price, num, price*num AS total //Upper(procname) 商品名字按大写输出
form tables;
where total>2000;
order by total;
日期与时间处理函数 数值处理函数(绝对值,三角函数等) 略了,真多
9)统计函数
AVG AVG(distinct pro_price)
COUNT 计数
MAX 返回指定列的最大值(数字或者日期), 如果用于文本列时, 返回正序排列的最后一行(先排序才有意义)
MIN
SUM 列值之和
select AVG(pro_price) AS avg_price 返回特定列的平均价格
from tables
where pro_id =2001 ; // 返回产品 2001 的平均价格
select Sum(pro_price*num) AS total 返回采购的产品2001 的总价值
from tables
where pro_id =2001 ;
10) 分组 group by
每个供应商可能提供多个产品, 查询每个供应商提供的产品数量
select ven_id, COUNT(*) AS num_prods // 分组统计行数
form tables;
group by ven_id;
select
select province, countrycode, sum(popu) // 国家 省份 城市
from city
where countrycode = 'CHN'
group by countycode; //本意是统计中国各个省份的总人口, 这里却是按国家分组, 只统计出了中国(where的原因)的总人口, 分组不够细致
11)having 对每个分组单独进行过滤
select province, countrycode, sum(popu) AS popu_of_province // 国家 省份 城市
from city
where countrycode = 'CHN'
group by countycode,province
having sum(popu)>200; 统计中国各个省份的总人口数大于200万的城市
二 子查询(嵌套)
使用子查询,应该保证,select语句与where语句 具有相同的列信息, 子查询也可以使用计算字段,统计函数; 注意使用完全限定名
select cust_name, email // 客户姓名,联系方式
from customers // 客户信息表
Where cust_id IN ( select cust_id // cust_id 客户id
from orders // 订单表象, 包含 订单号,客户id , 订单日期 , 这里并没有实际的订单产品信息
where order_num IN ( select order_num
from orderItems // 订单详细的信息表象 保存了该订单的产品id, 价格,数量等信息
where proc_id = 1002) ;
三 联结
表vendors ven_id(供应商id) vend_name address email
表products proc_id proc_name ven_id price
1 milk 1001 10.0
2 milk 1002 8.9
select vend_name, proc_name price
from vendors ,products // 内部联结
where vendors.ven_id = porducts.ven_id // 不带where 字句, 会做两个表的笛卡尔积 即两个表任意行之间组合, 会输出N*M行
order by vend_name,proc_name;
select vend_name, proc_name price
from vendors INNER JOIN products // 内部联结
on vendors.ven_id = porducts.ven_id // 不带where 字句, 会做两个表的笛卡尔积 即两个表任意行之间组合, 会输出N*M行
order by vend_name,proc_name;
A left OUTER JOIN B // 产生表A的完全集,如果B表中匹配的则有值,没有匹配的则为NULL
right OUTER JOIN