1. 程式人生 > >牛客網SQL題

牛客網SQL題

1.分頁查詢employees表,每5行一頁,返回第2頁的資料。

由於每一頁有5行,注意到SQL中行號是從0開始的,因此從第5行開始就是第二頁了
因此使用LIMIT 5,5,即方法一:
SELECT * FROM employees LIMIT 5,5;
也可以使用LIMIT m OFFSET n :表示從第n行開始(包括)讀取m行,如果不足m行,則讀取到表最後停止
該語句等價於 LIMIT n,m;
在SQL Server和Access中可以使用TOP語句,但SQLite不支援。
 方法二:
SELECT * FROM employees
LIMIT 5 OFFSET 5;

2.獲取select * from employees對應的執行計劃。

explain select * from employees.

可以用 "EXPLAIN" 關鍵字或 "EXPLAIN QUERY PLAN" 短語,用於描述表的細節,具體說明與用法

3.將employees表的所有員工的last_name和first_name拼接起來作為Name,中間以一個空格區分

不同資料庫連線字串的方法不完全相同,MySQL、SQL Server、Oracle等資料庫支援CONCAT方法,而本題所用的SQLite資料庫只支援用 連線符號"||"來連線字串。

SELECT last_name||" "||first_name AS Name FROM employees

4.對於表actor批量插入如下資料,如果資料已經存在,請忽略,不使用replace操作. 對於sqlite3:

insert or ignore into actor

values(3,'ED','CHASE','2006-02-15 12:34:33');

對於mysql:

 

insert IGNORE into actor values( 3 , 'ED' , 'CHASE' , '2006-02-15 12:34:33'
);

 

insert into:插入資料,如果主鍵重複,則報錯

insert repalce:插入替換資料,如果存在主鍵或unique資料則替換資料

insert ignore:如果存在資料,則忽略

  5.針對如下表actor結構建立索引: CREATE TABLE IF NOT EXISTS actor ( actor_id smallint(5) NOT NULL PRIMARY KEY,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')))
對first_name建立唯一索引uniq_idx_firstname,對last_name建立普通索引idx_lastname。
    //建立唯一索引 CREATE UNIQUE INDEX uniq_idx_firstname on actor(first_name);
//建立普通索引
CREATE INDEX idx_lastname on actor(last_name);

 6.(網易2018資料分析實習卷)考拉運營"小明"負責多個品牌的銷售業績,請完成:

(1)請統計小明負責的各個品牌,在2017年銷售最高的3天,及對應的銷售額。 銷售表 a: 欄位:logday(日期,主鍵組),SKU_ID(商品SKU,主鍵組),sale_amt(銷售額) 商品基礎資訊表 b: 欄位:SKU_ID(商品SKU,主鍵),bu_name(商品類目),brand_name(品牌名稱),user_name(運營負責人名稱) (2)請統計小明負責的各個品牌,在2017年連續3天增長超過50%的日期,及對應的銷售額。

select

 sum(casewhen sat_name ='好評'then count(sat_name) end ) / count(sat_name)  as "好評率"

 from a,b

where a.good_id = b.good_id

and a.user_name ='小明'

and a.sub_time between to_date('2018-1-1','yyyy-mm-dd') and to_date('2018-1-31','yyyy-mm-dd')

and b.bu_name = '母嬰'

and b.brand_name ='花王'

  7.(網易2018資料分析實習卷)好評率是會員對平臺評價的重要指標。現在需要統計2018年1月1日到2018年1月31日,使用者'小明'提交的母嬰類目"花王"品牌的好評率(好評率=“好評”評價量/總評價量): 使用者評價詳情表:a 欄位:id(評價id,主鍵),create_time(評價建立時間,格式'2017-01-01'), user_name(使用者名稱稱),goods_id(商品id,外來鍵) , sub_time(評價提交時間,格式'2017-01-01 23:10:32'),sat_name(好評率型別,包含:“好評”、“中評”、“差評”) 商品詳情表:b 欄位:good_id(商品id,主鍵),bu_name(商品類目), brand_name(品牌名稱)。 1)
select b.brand_name,a.logday,sum(sale_amt) as sale
from a,b
where a.SKU_ID=b.SKU_ID and user_name='小明' and logday between '2017-01-01' and '2017-12-31' group by brand_name,logday having( select count(logday) from ( select b1.brand_name,a1.logday,sum(sale_amt) as sale1
from a a1,b b1
where a1.SKU_ID=b1.SKU_ID and b1.user_name='小明' and a1.logday between '2017-01-01' and '2017-12-31'
group by b1.brand_name,a1.logday ) t where b.brand_name=b1.brand_name and sale1>sale )<3
(2)第二問比較複雜,所以要建立幾個檢視

create view t_view as select brand_name,logday,sum(saleamt) as sale
from a,b
where a.SKU_ID=b.SKU_ID and user_name='小明' and logday in ('2017-01-01','2017-12-31')
group by brand_name,logday; 
create view f_view as select t1.brand_name,t1.logday,(t1.sale/t2.sale-1) as growth,t1.sale
from t_view t1,t_view t2
where t1.logday-t2.logday=1; 

select distinct f1.brand_name,f1.logday,f1.sale from f_view f1,f_view f2,f_view f3
where
f1.brand_name=f2.brand_name
and f2.brand_name=f3.brand_name
((f1.logday-f2.logday=-1
and
f1.logday-f3.logday=-2)
or
(f1.logday-f2.logday=1
and
f1.logday-f3.logday=-1)
or
(f1.logday-f2.logday=1
and
f1.logday-f3.logday=2))
and f1.growth>0.5 and f2.growth>0.5
and f3.growth>0.5;