MySQL基本查询语句

笔记 专栏收录该内容
4 篇文章 0 订阅

select语句是SQL语言从数据库中获取信息的一个基本语句;
select语句的基本语法格式可归纳如下:
selcet[all | distinct] selection_list
from table_source
[where search_condtion]
[group by grouping_columns] [with rollup]
[having search_condition]
[order by order_expression [asc|desc] ]
[limit count]

查询teaching数据库course表中的所有数据库;
mysql > use teaching;
Database changed
mysql > select * from course;
查询student表中的studentno、sname和phone数据;
mysql > select studentno,sname,phone from student;
select…from基本子句的使用;
格式为select 项的原名 as 别名;
mysql > select distinct studentno,courseno
>from score
>where final > 95
>order by studentno;
>order by studentno;

使用where子句过滤结果集

mysql 允许使用多个where子句,组合where子句允许使用两种方式使用:AND 和OR子句的方式使用.
数据库中的操作符号:AND , OR , IN , NOT.
AND:
SELECT * FROM products WHERE products.vend_id = 1003 AND products.prod_price <= 10;

OR:
SELECT * FROM products WHERE products.vend_id = 1002 OR products.vend_id = 1003 ;

IN:
建议能使用IN的子句中不使用OR,IN行性能好,方便理解.
SELECT * FROM products WHERE products.vend_id IN (1002,1003);

NOT:
Mysql对NOT的支持仅在对IN,BETWEEN,EXISTS子句取反,这与其他多数数据库对各种条件都支持不同.
SELECT * FROM products WHERE products.vend_id NOT IN (1002,1003);

注意:
在同时有AND和OR的子句中,mysql是优先处理AND操作的.一般建议使用()来确定处理顺序和消除歧义.
比如: SELECT * FROM products WHERE (products.vend_id= 1002 OR products.vend_id=1003) AND prod_price >= 10;

使用order by 子句对结果集排序

使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:
ORDER BY {column_name [ASC|DESC]} [,…n]
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排序。
例如:
SELECT *
FROM student
ORDER BY age desc,userid ASC

group by 子句和having 子句的使用

  1. Group by子句(利用group by子句分组数据,当select语句中使用到组函数和字段一起连用时会用到group by,否则会出现错误)

Group by 把select查询的结果集分成几个小组,这个group by子句可以跟在where后面且在having前面。

Group by子句也会触发排序操作,会按分组字段排序。

Select [组函数和分组的字段]…from 表名 group by[字段1],[字段2],。。。。。。;

Oracle sql语句顺序:

a. Select 显示字段或组函数 from 表名

b. [ Where 过滤条件] (不能使用组函数 ,不能使用列别名)

c. [Group by 分组条件] (不能使用列别名,只可是字段名,不可是组函数)

d. [Having 分组的过滤条件] (可以使用组函数)

e. [ Order by 排序 ] (可以使用列别名,可以使用组函数)

说明:其中的[ ]是可选项

注意:group by分组不能用列的别名

注意:只要写了group by子句,select后就只能用group by之后的字段或者是组的函数。Having子句可以过滤组函数结果或者分组的信息,并且写在group by子句后。

使用group by子句时,必须满足下面的一些原则:

l 在select子句的后面,只能有两种类型的表达式,一种是组函数,一种是出现在group by子句后面的列名。

l 没有出现在group by子句后面的列名不能出现在select子句中非组函数表达式中,但是出现在group by子句后面的列名可以不出现在select子句中非组合函数表达式中。

l 如果使用了where子句,那么所有参加分组计算的数据必须首先满足where子句指定的条件。

l 在默认情况下,系统按照group by子句中指定的列升序排列,但是可以使用order by子句指定新的排列顺序。

使用group by 常见的错误:

l 如果在select语句中没有出现group by子句,那么不能在select子句中同时出现单个列名和组函数的混合现象。

l 如果希望限制分组中的数据,那么可以使用having子句而不能使用where子句。即having中可以出现组函数而where不能出现组函数。

注意1:在没有group by时,select后不能把普通字段和组函数同时使用

注意2:where子句只能够过滤记录,放单行函数。Where后面跟随的条件是对所有数据的过滤的条件,在where子句中不能出现组函数。

注意3:如果希望按照多个列分组,那么会在group by子句后面出现多个列名。这些列名称得顺序非常重要。因为不同的顺序有不同的结果。

例子1:查询求各个部门的最小,最高,工资之和

select dept_id,min(salary),max(salary),sum(salary) from s_emp group by dept_id;

例子2:查询求各个部门的最小,最高,工资之和,部门名称

select e.dept_id,d.name,min(salary),max(salary),sum(salary) from s_emp e , s_dept d where e.dept_id=d.id group by e.dept_id,d.name;

例3:找出各个部门的平均工资

select dept_id,avg(salary) from s_emp group by dept_id;

注:在没有group by时,select后不能把普通字段和组函数同时使用

例4:求各个部门不同职位有多少人

select dept_id,title,count(*) from s_emp group by dept_id,title;

例5:求除了42部门以外的各个部门的平均工资

select dept_id,avg(salary) from s_emp where dept_id<>42 group by dept_id;

例7:求各个部门的平均工资

select max(d.name),max(r.name),avg(salary) from s_emp e,s_dept d,s_region r

where e.dept_id=d.id and d.region_id=r.id group by dept_id;

  1. Having子句(是对分组之后的数据进行过滤,所以使用having时必须用group by先分组)

Having中的组函数可以不是select 中的组函数

利用having子句过滤分组的行

注意:having要先过滤掉不需要的记录,然后再进行分组操作,提高效率。having子句可以过滤组函数结果或是分组的信息,且写在group by子句后。

例:求平均工资大于2000的部门

select dept_id,avg(salary) from s_emp group by dept_id having avg(salary)>2000;

聚合函数查询

1.count()函数
2.sum()函数和avg()函数
3.max()函数和 min()函数
4.利用grounp by 子句与 with rollup 一起进行统计

数据库多表连接(内连接、外连接、交叉连接)

用比较运算符比较要连接的列的值的连接,不匹配的行不会被显示。sql关键字JOIN 或者INNER JOIN,通常写成JOIN。
例:select * from TableA JOIN TableB on TableA.id=TableB.id;
等效于
select * from TableA,TableB where TableA.id=TableB.id
外连接

① 外连接又分为:左外连接、右外连接、全外连接。

② 对应的sql关键字:LEFT/RIGHT/FULL OUTER JOIN,通常省略OUTER关键字,写成LEFT/RIGHT/FULL JOIN。

③ 在左、右外连接中都会以一种表为基表,基表的所有行、列都会显示,外表如果和条件不匹配则所有的外表列值都为NULL。

全外连接则所有表的行、列都会显示,条件不匹配的值皆为NULL。

左外连接示例:

select * from TableA left join TableB on TableA.id=TableB.id

右外连接示例:

select * from TableA right join TableB on TableA.id=TableB.id

全连接示例:

select * from TableA full join TableB on TableA.id=TableB.id

交叉连接

没有where条件的交叉连接将产生连接表所涉及的笛卡尔积,即TableA的行数*TableB的行数的结果集。如果带where,返回或显示的是匹配的行数。(cross join后只能用where不能是on)

select * from TableA cross join TableB;

子查询

1.什么是子查询
在select嵌套select

2.在什么地方使用子查询

select … select
where …select
from …select

3.在where子句中使用子查询
案例:查询哪些员工是领导,显示领导的编号,姓名
第一步:查询所有领导的编号
select distinct mgr from emp;

第二步:从员工表中将领导查询出来
select empno,ename from emp where empno in(select distinct mgr from emp);

思考:查询哪些员工不是领导
select empno,ename from emp where empno not in(select distinct mgr from emp where mgr is not null);

4.在from子句中使用子查询 关键点:将子查询当作一张临时表处理
案例:查询各个部门的平均薪水的所属等级
第一步:select deptno,avg(sal) from emp group by deptno;

第二步:
select
t.deptno,t.avgsal,s.grade
from
(select deptno,avg(sal) avgsal from emp group by deptno)t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;

select …select (了解)

使用正则表达式进行模糊查询

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值