數(shù)據(jù)庫的單表查詢操作

數(shù)據(jù)庫的單表查詢操作?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)的開發(fā),更需要了解用戶,從用戶角度來建設(shè)網(wǎng)站,獲得較好的用戶體驗。成都創(chuàng)新互聯(lián)公司多年互聯(lián)網(wǎng)經(jīng)驗,見的多,溝通容易、能幫助客戶提出的運(yùn)營建議。作為成都一家網(wǎng)絡(luò)公司,打造的就是網(wǎng)站建設(shè)產(chǎn)品直銷的概念。選擇成都創(chuàng)新互聯(lián)公司,不只是建站,我們把建站作為產(chǎn)品,不斷的更新、完善,讓每位來訪用戶感受到浩方產(chǎn)品的價值服務(wù)。

單表查詢指的是在一張表中進(jìn)行數(shù)據(jù)的查詢,它的執(zhí)行順序是“from->where->group by->having->distinct->order by->limit->select”。

在數(shù)據(jù)庫操作中,單表查詢就是在一張表中進(jìn)行數(shù)據(jù)的查詢,詳細(xì)它的語法是:

select distinct 字段1,字段2... from 表名
	where 分組之前的過濾條件
	group by 分組字段
	having 分組之后的過濾條件
	order by 排序字段
	limit 顯示的條數(shù);

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

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

至于為什么這樣的一個執(zhí)行順序,我就不說了,也沒這個自信說清楚。如果小白只要記得是這個執(zhí)行順序就可以了,如果非要刨根問底,可以去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
);

插入數(shù)據(jù):

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);

數(shù)據(jù)庫的單表查詢操作

where條件過濾

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

5. 邏輯運(yùn)算符:在多個條件直接可以使用邏輯運(yùn)算符 and、or、not。

6、正則表達(dá)式

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

數(shù)據(jù)庫的單表查詢操作

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

數(shù)據(jù)庫的單表查詢操作

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

數(shù)據(jù)庫的單表查詢操作

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

數(shù)據(jù)庫的單表查詢操作

查詢名字是字母m開頭,以字母e或x結(jié)尾的員工!些時就可以用到正則表達(dá)示了,MySQL里提供了regexp來現(xiàn)正則。

數(shù)據(jù)庫的單表查詢操作

group by分組

先設(shè)置mysq的sql_mode為only_full_group_by,意味著以后但凡分組,只能取到分組的依據(jù)。

set global sql_mode="strict_trans_tables,only_full_group_by";

分組發(fā)生在where之后,即分組是基于where之后得到的記錄而進(jìn)行的。

分組指的是:將所有記錄按照某個相同字段進(jìn)行歸類,比如針對員工信息表的職位分組,或者按照性別進(jìn)行分組等

怎么要分組呢?
   如:取每個部門的最高工資。
   如:取每個部門的員工數(shù)。
每’這個字后面的字段,就是我們分組的依據(jù)。
注意:我們可以按照任意字段分組,但是分組完畢后,比如group by post,只能查看post字段。

但如果想查看組內(nèi)信息,需要借助于聚合(聚在一起合成一個內(nèi)容)函數(shù)

每個部門的最高工資
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;
每個部門的總?cè)藬?shù)
select post,count(id) from emp group by post;

group_concat(分組之后用來用它獲得組內(nèi)字段的內(nèi)容。)

數(shù)據(jù)庫的單表查詢操作

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

數(shù)據(jù)庫的單表查詢操作

可以用下面的代碼自己試一下吧:

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;

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

數(shù)據(jù)庫的單表查詢操作

 # 補(bǔ)充as語法
    mysql> select emp.id,emp.name from emp as t1; # 報錯
    mysql> select t1.id,t1.name from emp as t1;

group by 就說這些了,如果還不懂,可以作一下面的小練習(xí)。

    1. 查詢崗位名以及崗位包含的所有員工名字
        select post,group_concat(name) from emp group by post;
    2. 查詢崗位名以及各崗位內(nèi)包含的員工個數(shù)
        select post,count(id) from emp group by post;
    3. 查詢公司內(nèi)男員工和女員工的個數(shù)
        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、統(tǒng)計各部門年齡在30歲以上的員工平均工資
       select post,avg(salary) from emp where age >= 30 group by post;
having過濾

having的語法格式與where一模一樣,只不過having是在分組之后進(jìn)行的進(jìn)一步過濾。

where不能用聚合函數(shù),但having是可以用聚合函數(shù),這也是它們最大的區(qū)別。

統(tǒng)計各部門年齡在24歲以上的員工平均工資,并且保留平均工資大于4000的部門。

數(shù)據(jù)庫的單表查詢操作

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

如果不使用 group by子句,不會報錯,但會出現(xiàn)以下的情況。

數(shù)據(jù)庫的單表查詢操作

distinct去重

數(shù)據(jù)庫的單表查詢操作

order by 排序

數(shù)據(jù)庫的單表查詢操作

select * from emp order by salary asc; #默認(rèn)升序排
select * from emp order by salary desc; #降序排
select * from emp order by age desc; #降序排
select * from emp order by age desc,salary asc; #先按照age降序排,再按照薪資升序排

數(shù)據(jù)庫的單表查詢操作

limit 限制顯示條數(shù)

數(shù)據(jù)庫的單表查詢操作

如查要獲取工資最高的員工的信息,我們可以用order by和limit也可以做到。

數(shù)據(jù)庫的單表查詢操作

如果查一個表數(shù)據(jù)量大的話可以用limit分頁顯示。

select * from emp limit 0,5;

數(shù)據(jù)庫的單表查詢操作

select * from emp limit 5,5;

數(shù)據(jù)庫的單表查詢操作

ps:看到這里如果上面的東西你都明白的話,單表查詢你基本上已經(jīng)熟悉它了。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

文章名稱:數(shù)據(jù)庫的單表查詢操作
分享地址:http://muchs.cn/article2/jpjdic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、面包屑導(dǎo)航、網(wǎng)站導(dǎo)航、電子商務(wù)、標(biāo)簽優(yōu)化品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司