欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL数据库学习之查询语句

程序员文章站 2022-06-23 15:04:24
第一:select 语句包含的对象 select 表中存在的列、内置函数【upper(),round()等】、逻辑运算【+-*/等】、新加列【‘’单引号内引用名】 from...

第一:select 语句包含的对象

select 表中存在的列、内置函数【upper(),round()等】、逻辑运算【+-*/等】、新加列【‘’单引号内引用名】 from

表名;

select emp_id ,'active',emp_id * 3.14,upper(lname) from `employee`;

注意:from 表名;语句可以省略,例如:执行一个内建函数,或者简单表达事

select user(),database();

第二:列的别名【as 关键字】

意思:原本表中列名含义模糊,或者对操作的描述

select emp_id ,'active' as status,
emp_id *3.14 as empid_x_pi,
upper(lname) as last_name_upper
from `employee`;

怎么样实现别名:在原始表名后面加加上关键字as即可;新加入的列,也同样操作,比如楼上的‘active' as status 语句。

注意:关键字在mysql命令行中可以省略。

第三:去除重复行【distinct 关键字】

select distinct cust_id from `account`;

注意:该关键字distinct 消耗较多资源,因此不建议随意使用

第四:from 语句

from语句定义了查询中所使用的表,以及链接这些表的方式。

宽泛定义下,存在三种类型的表:

1、永久表 create table 语句创建

2、临时表 select 子查询语句返回的表

3、虚拟表 使用create view 子句所创建的视图

a、子查询语句产生的表【相当于嵌套select语句】

语法:select 别名.列名1,别名.列名2,别名.列名3 from (select 列名1,列名2,列名3,列名4,,from 表名)as 别名;

select e.emp_id,e.fname,e.lname from (select emp_id,fname,lname,start_date,title from 
`employee`) as e;

外围查询需要通过别名来引用 子查询;

b、视图

视图:实际上不拥有任何数据,只是行为表现的像一个表,针对视图的查询,实际上针对视图定义的查询。

1、定义视图

create view  employee_vw  as
select emp_id,fname,lname,year(start_date) as start_year from `employee`;

语法 :create view 视图名(列1,列2,,,) as select 。。from 表名;

如果 视图名(列1,列2,,,)中没定义括号的列名,那么直接引用子查询的列名。

以上语句,对原始表start_date语句应用了个取年份的year函数,并且设置了 start_year的别名。

2、查询视图

select emp_id,start_year from employee_vw;

查询操作时,可以直接把视图当作表来处理。

c、from 子句 表连接

如果 from 语句中出现了多个表,那么语句要包含各表之间的连接条件。

语法:select 表1.列1,表1.列2 ,,,表2.列1 as 别名 from

表1 inner join 表2

on 表1.某列=表2.某列;

1、语法中表1,表2既可以引用全名,如下

select employee.emp_id ,employee.fname,
employee.lname,department.name as dept_name 
from employee inner join department on employee.dept_id = department.dept_id;

2、也可以在from 语句中定义别名

select e.emp_id,e.fname,e.lname,d.name as dept_name
from `employee` as e inner join `department` as d on e.dept_id = d.dept_id;

连接两张表的机制,此处时join方式;

两张表的连接条件由on 语句指定,本例是 on employee.dept_id = department.dept_id确定。

第五:where 语句

提取符合条件的行,过滤不需要的行。

1、单个过滤条件

select * from `employee` where title='teller';

2、多个过滤条件,即通过与或非语句 定义 过滤条件。

select * from `employee` where title='teller' and start_date > '2006-1-1';

3、同时使用and or操作符,则需要使用圆括号()

select * from `employee` where (title='head teller' and start_date >'2006-1-1') or (title='teller' and start_date >'2007-1-1');

混合使用不同操作符,需要用圆括号来分隔成组条件。

第六:group by 语句 having子句

之前语句只是提出数据,并没有做任何加工,本节语句能够以where语句类似的方式对分组数据进行加工过滤。

select d.name,count(e.emp_id) as num_employee from
`department` as d inner join `employee` as e on d.dept_id = e.dept_id
group by d.name having count(e.emp_id)>2;

分组计算各部门雇员人数,并且只提取雇员大于2的部门。

group by 条件,以某种条件分组,having 子句,则对分组条件,进一步限制。

第七:order by 子句

1、对原始列数据/根据列数据计算的表达式结果,进行排序。

select open_emp_id,product_cd from account order by open_emp_id,product_cd;

结果,先按照open_emp_id排序,在按照product_cd排序。默认的都是升序。

2、关键字:desc 降序,asc升序。

select open_emp_id,product_cd from account order by open_emp_id desc ,product_cd desc; 

3、根据表达式进行排序

排序的条件并没有出现在查询内容中

select * from `customer` order by right(fed_id,3);

根据fed_id列是值,应用right()函数,取最后3位数字进行排序。

4、根据占位符排序

如果根据select 子句中的列来排序可以用占位符。

注意:如果是用表中其他的列或者表达式,肯定就不能应用占位符。

select emp_id,title,start_date,fname,lname
from `employee`
order by 2,5;