1.检索数据:select 其中一列或者几列
2.排序检索数据:order by
3.数据过滤:where(where可以和and,or,in连用)
4.利用通配符进行数据过滤:like
(1)%表示任意字符出现任意次数
找出以jet开头的产品:
where product_name like 'jet%'
(2)_下划线只匹配单个字符
5.汇总数据:聚合函数
select avg(price) from products 得到:16.13357
select count(customer_email) from customers
select max(price) from products
select min(price) from products
select sum(price) from products
6.数据分组 having和group by
将数据分成几个组,每个组分别计算
select sex ,max(age)
from student
group by sex
按照性别分组,一行就是一组(分成男生组和女生组两组)
下面的例子就是按照job_id进行分组,一个job_id就是一组,然后选出每个组的 max(salary),job_id两列
select max(salary),job_id
from employee
group by job_id;
having非常类似于where,where过滤行(保留哪些行,不要哪些行),having过滤分组(保留哪些分组,不要哪些分组),先决定留下哪些分组,再决定留下每个分组里面的哪些行
要求分组种行数必须大于2,行数不大于2的分组不进行计算
select max(salary),job_id
from employee
group by job_idhaving count(*) >=2
select ....... from........
where........
group by .......
having .......
7.联表查询
等值连接:也称内部连接 inner join
其他三种连接:自连接(自己连接自己),自然连接,外部连接(又分为左外连接和右外连接)
语法:
等值连接(内部连接):select...... from A inner join B on A.id=B.id
自连接:
外部连接:select....... from A left outer join B on A.id=B.id(把这当作一张新的表)
首先当然是建表语句:
CREATE TABLE user
(
id INT(6) ,
username VARCHAR(60),
realname VARCHAR(60),
PASSWORD VARCHAR(50),
sex VARCHAR(4),
STATUS VARCHAR(4),
regsterTime TIMESTAMP
);
字段名+这个字段的类型就可以定义一个字段
1.insert 插入语句:
插入一列:
插入多列:
2.upgrade 修改语句
修改一列:
修改多列:
3.删除一行
想把整张表删除:trancate 表名
4.最重要的是查询语句:
(1)查询出整张表: select * from 表名
(2)查询出一张表的某几列:
(3)查询结果起别名可以给查询结果的列起一个别名(也可以给表起别名):
(4)去重:select distinct `StudentNo` from result
没加distinct之前可能是1001,1001,1002,1002,1002,1003,1003,1003
加了distinct之后是:1001,1002,1003
(5)模糊查询:like 查找姓刘的同学
like结合% 和_,其中%代表0到任意个字符,_代表一个字符
(6)in
一条比较全面的sql语句如下:
select *
from People
where age>=18 && sex!='male'
order by birth_date asc|desc
分组查询:其实就是分组,将表中的数据分成若干组
查询每个工种的最高工资:每个工种就是一组
select max(salary),job_id
from employee
group by job_id;
where,having和group by连用
group by的结果最后升序或者降序排列(与order by)连用
经典案例:查询每个部门的平均工资
分页查询:
select *
from employee
limit 0,5
limit后面跟两个参数offset size
offset表示起始索引是多少,size表示要显示的行数
比如 limit 0,5,显示的就是0,1,2,3,4这五条记录
如果是limit 1,5,那显示的就是1,2,3,4,5这5条记录
如果想要查询第11-25这15条数据,那就是limit 10,15
以上都是单表查询,下面展示联立两个表格的数据进行查询,即联表查询:
等值连接:
select beauty.id,beauty.name,boys.boyName
from beauty,boys
where beauty.boyfriend_id=boys.id
自连接:
就是同一张表给他起两个别名,一个叫a,一个叫b,然后这两个表做等值连接
查询哪些学生的01这门课的成绩比02这门课成绩高
只用到一张表,成绩表Score,这张表里面有三个字段,s_id,c_id,s_score
考察自连接:
都是score分数表,一张给它起别名叫表a,专门用来查01这门课程的分数,另一张给它起别名叫表b,专门用来查02这门课程的分
select *
from score a
where a.c_id='01'
select *
from score b
where b.c_id='02'
现在连接两张表:
SELECT a.s_id,a.s_score course01,b.s_score course02
FROM score a,score b
WHERE a.c_id='01' AND b.c_id='02' AND a.s_id=b.s_id AND a.s_score>b.s_score
(1)inner join 合并两个表格的数据(求交集)
表A
有四行:(1,2,3,4),表B
有四行:(3,4,5,6)
当表A
使用内部联接与表B
连接时,我们得到结果集(3,4),它是表A
和表B
的交集。
具体实例如下:
创建下面两个表,customers表orders表
输入以下sql语句:
select customers.id,customers.name,orders.amount,orders.date
from customers inner join orders
on customers.id=orders.id
此时你就站在customers的角度,对于customers表中的每一行的id(比如说是x),都会去另一张表order表中查询所有行,看有没有哪一行的id和x是相等的,如果有id相等的行,就将customers里这行和order里的这一行连接起来
具体来说:对于customer表中id=2的这一行,遍历order表中每一行,发现有一行(也就是第三行)id也等于2,于是按照sql语句中的描述,将customer表中的id,name两列和order表中的amount和date两列进行拼接,得到:
而对于customer表中id=3的这一行,遍历order表中每一行,发现有两行(也就是第一行,第二行)id也等于3,于是按照sql语句中的描述,将customer表中的id,name两列和order表中的amount和date两列进行拼接,得到:
最终查询结果:
(2) left join
设有两个表A
和B
。表A
有四行:1
,2
,3,
4
。表B
还有四行:3
,4
,5
,6
。
当将表A
与表B
连接时,表A
中的所有行(左表)都包含在结果集中,而不管无论表B
中是否存在匹配的行。
A left join B:保留左边的表格所有选取的数据,然后再把右边表格符合条件的合并过来
student表学生表
grade表成绩表
执行sql语句:
SELECT student.student_id,student.name,student.age,grade.score,grade.course_name
FROM student LEFT JOIN grade
ON student.student_id=grade.student_id
得到结果:
其实就是inner join的基础上,加上student表中没有在grade表中
这是inner join的结果:
在这个结果的基础上,加上student表中有的,grade表中没有的行,也就是student表中student_id=2的行
(3)Union 求并集
(4)