首頁 >資料庫 >mysql教程 >單表查詢是什麼

單表查詢是什麼

藏色散人
藏色散人原創
2020-07-01 09:23:255920瀏覽

單表查詢指的是在一張表中進行資料的查詢,它的執行順序是「from->where->group by->having->distinct->order by- >limit->select」。

單表查詢是什麼

在資料庫操作中,單表查詢就是在一張表中進行資料的查詢,詳細它的語法是:

select distinct 字段1,字段2... from 表名
	where 分组之前的过滤条件
	group by 分组字段
	having 分组之后的过滤条件
	order by 排序字段
	limit 显示的条数;

語法是樣的一個順序,但是它的執行順序就不是從語法的順序來執行了,而是這樣的一個順序。

    from--->where--->group by--->having-->distinct--->order by--->limit--- >select

至於為什麼這樣的一個執行順序,我就不說了,也沒這個自信說清楚。如果小白只要記得是這個執行順序就可以了,如果要刨根問底,可以去google一下。

在了解單表查詢前,我們先來建立一張僱員表:

emp表:
员工id      id                  int             
姓名        emp_name            varchar
性别        sex                 enum
年龄        age                 int
入职日期    hire_date           date
岗位        post                varchar
职位描述    post_comment        varchar
薪水        salary              double
办公室      office              int
部门编号    depart_id           int	

建表:

create table emp(
id int not null unique auto_increment,
name varchar(20) not null,
sex enum('male','female') not null default 'male', 
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, 
depart_id int
);

插入資料:

insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
('niange','male',23,'20170301','manager',15000,401,1), 
('monicx','male',23,'20150302','teacher',16000,401,1),
('wupeiqi','male',25,'20130305','teacher',8300,401,1),
('yuanhao','male',34,'20140701','teacher',3500,401,1),
('anny','female',48,'20150311','sale',3000.13,402,2),
('monke','female',38,'20101101','sale',2000.35,402,2),
('sandy','female',18,'20110312','sale',1000.37,402,2),
('chermy','female',18,'20130311','operation',19000,403,3),
('bailes','male',18,'20150411','operation',18000,403,3),
('omg','female',18,'20140512','operation',17000,403,3);

where條件過濾

where字句中可以使用:
1. 比較運算子:>、f539a70d3ea090bac4faa80192f58ccc=、 d07f72b53da1482bf6b3cbe6c6f09290 、!=。
2. between 1 and 5 值在1到5之間。
3. in(1,3,8) 值是1或3或8。
4. like 'monicx%'
    %表示任意多字元
    _表示一個字元 

5. 邏輯運算子:在多個條件直接可以使用邏輯運算子and、or、not。

6、正規表示式

找出員工id在2到5之間的名字:


 查詢員工姓名中包含y字母的員工姓名與其薪資:


#查詢員工姓名是由四個字元組成的員工的姓名與其薪資:


查詢職位描述為空的員工名稱與職位名稱:


##查詢名字是字母m開頭,以字母e或x結尾的員工!些時就可以用到正規表示示了,mysql裡提供了regexp來現正則。


group by分組


先設定mysq的sql_mode為only_full_group_by,表示以後但凡分組,只能取到分組的依據。

set global sql_mode="strict_trans_tables,only_full_group_by";

分組發生在where之後,即分組是基於where之後得到的記錄而進行的。

分組指的是:將所有記錄依照某個相同欄位進行歸類,例如針對員工資訊表的職位分組,或是依照性別進行分組等

怎麼要分組呢?

    如:取各部門的最高薪資。
    如:取各部門的員工人數。
每’這個字後面的字段,就是我們分組的依據。
注意:我們可以按照任意欄位分組,但是分組完畢後,例如group by post,只能查看post欄位。

但如果想查看群組內信息,需要藉助於

聚合(聚在一起合成一個內容)函數 #

每个部门的最高工资
select post,max(salary) from emp group by post;
每个部门的最底工资
select post,min(salary) from emp group by post;
每个部门的平均工资
select post,avg(salary) from emp group by post;
每个部门的工资总合
select post,sum(salary) from emp group by post;
每个部门的总人数
select post,count(id) from emp group by post;

group_concat(分組之後用來用它來取得群組內欄位的內容。)



而且它還可以這樣子使用:

可以用下面的程式碼自己試試看:

select post,group_concat(name) from emp group by post;
select post,group_concat(name,"_NB") from emp group by post;
select post,group_concat(name,": ",salary) from emp group by post;
select post,group_concat(salary) from emp group by post;

機智的同學會說那麼不分組的情況下也能用它嗎?不行!但是mysql提拱了另外的方式來操作。它就是concat。


 # 补充as语法
    mysql> select emp.id,emp.name from emp as t1; # 报错
    mysql> select t1.id,t1.name from emp as t1;
group by 就說這些了,如果還不懂,可以作一下面的小練習。

    1. 查询岗位名以及岗位包含的所有员工名字
        select post,group_concat(name) from emp group by post;
    2. 查询岗位名以及各岗位内包含的员工个数
        select post,count(id) from emp group by post;
    3. 查询公司内男员工和女员工的个数
        select sex,count(id) from emp group by sex;
    4. 查询岗位名以及各岗位的平均薪资
        select post,avg(salary) from emp group by post;
    5. 查询岗位名以及各岗位的最高薪资
        select post,max(salary) from emp group by post;
    6. 查询岗位名以及各岗位的最低薪资
	select post,min(salary) from emp group by post;
    7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
        select sex,avg(salary) from emp group by sex;
    8、统计各部门年龄在30岁以上的员工平均工资
       select post,avg(salary) from emp where age >= 30 group by post;

having過濾

having的語法格式與where一模一樣,只不過having是在分組之後進行的進一步過濾。


where不能用聚合函数,但having是可以用聚合函数,这也是它们最大的区别。

统计各部门年龄在24岁以上的员工平均工资,并且保留平均工资大于4000的部门。


注意:having只能与 select 语句一起使用。
having通常在 group by 子句中使用。

如果不使用 group by子句,不会报错,但会出现以下的情况。


distinct去重

order by 排序

select * from emp order by salary asc; #默认升序排
select * from emp order by salary desc; #降序排
select * from emp order by age desc; #降序排
select * from emp order by age desc,salary asc; #先按照age降序排,再按照薪资升序排


limit 限制显示条数

如查要获取工资最高的员工的信息,我们可以用order by和limit也可以做到。


如果查一个表数据量大的话可以用limit分页显示。

select * from emp limit 0,5;


select * from emp limit 5,5;


ps:看到这里如果上面的东西你都明白的话,单表查询你基本上已经熟悉它了。

以上是單表查詢是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn