牛客网SQL篇刷题篇(38-47)
1.視圖:視圖是可視化的表。
視圖的作用:
第一點:使用視圖,可以定制用戶數據,聚焦特定的數據。
解釋:
在實際過程中,公司有不同角色的工作人員,我們以銷售公司為例的話,
采購人員,可以需要一些與其有關的數據,而與他無關的數據,對他沒
有任何意義,我們可以根據這一實際情況,專門為采購人員創建一個視
圖,以后他在查詢數據時,只需select * from view_caigou 就
可以啦。
第二點:使用視圖,可以簡化數據操作。
解釋:我們在使用查詢時,在很多時候我們要使用聚合函數,同時還要
顯示其它字段的信息,可能還會需要關聯到其它表,這時寫的語句可能
會很長,如果這個動作頻繁發生的話,我們可以創建視圖,這以后,我
們只需要select * from view1就可以啦~,是不是很方便呀~
第三點:使用視圖,基表中的數據就有了一定的安全性
解釋:
因為視圖是虛擬的,物理上是不存在的,只是存儲了數據的集合,我們可以
將基表中重要的字段信息,可以不通過視圖給用戶,視圖是動態的數據的集
合,數據是隨著基表的更新而更新。同時,用戶對視圖,不可以隨意的更改
和刪除,可以保證數據的安全性。
第四點:可以合并分離的數據,創建分區視圖
解釋:
隨著社會的發展,公司的業務量的不斷的擴大,一個大公司,下屬都設有很
多的分公司,為了管理方便,我們需要統一表的結構,定期查看各公司業務
情況,而分別看各個公司的數據很不方便,沒有很好的可比性,如果將這些
數據合并為一個表格里,就方便多啦,這時我們就可以使用union關鍵字,
將各分公司的數據合并為一個視圖。
創建視圖:
CREATE VIEW view_name
AS SELECT column_name(s) FROM table_name WHERE condition
2.強制索引
MYSQL中強制索引查詢使用:FORCE INDEX(indexname);
SQLite中強制索引查詢使用:INDEXED BY indexname;
題目:針對salaries表emp_no字段創建索引idx_emp_no,查詢emp_no為10005,使用強制索引。
在SQLite中:
| 1 | SELECT?*?FROM?salaries?INDEXED?BY?idx_emp_no?WHERE?emp_no?=?10005 |
在Mysql中:
| 1 2 | create?index?idx_emp_no?on?salaries(emp_no); select?*?from?salaries?FORCE?INDEX?(idx_emp_no)?where?emp_no?=?10005; |
2.ALTER TABLE 語句
ALTER TABLE 語句用于在已有的表中添加、修改或刪除列。
如需在表中添加列,請使用下列語法:
ALTER TABLE table_name ADD column_name datatype
要刪除表中的列,請使用下列語法:
ALTER TABLE table_name DROP COLUMN column_name
要改變表中列的數據類型,請使用下列語法:
ALTER TABLE table_name ALTER COLUMN column_name datatype
題目:在last_update后面新增加一列名字為create_date, 類型為datetime, NOT NULL,默認值為'2020-10-01 00:00:00'
ALTER TABLE actor
ADD create_date datetime NOT NULL default '2020-10-01 00:00:00'
3.刪除重復記錄
題目描述:刪除emp_no重復的記錄,只保留最小的id對應的記錄。
?
討論中答案:
題目描述:刪除emp_no重復的記錄,只保留最小的id對應的記錄。
思路:1.找出每個emp_no里對應的最小id。2.刪除除1里記錄的所有數據。
| 1 2 3 4 5 6 7 | delete from titles_test where id not in ( ????select min(id) ????from titles_test ????group by emp_no ) |
遭遇問題:you can't specify target table 'titles_test' for update in FROM clause
網查原因:在MYSQL里,不能先select一個表的記錄,在按此條件進行更新和刪除同一個表的記錄,
解決辦法:將select得到的結果,再通過中間表select一遍,這樣就規避了錯誤,這個問題只出現于mysql,mssql和oracle不會出現此問題。
復制代碼
| 1 2 3 4 5 6 7 8 9 10 | delete from titles_test where id not in ( ????select * from ????( ????????select min(id) ????????from titles_test ????????group by emp_no ????) as T1 ) |
4.replace函數
描述
將id=5以及emp_no=10001的行數據替換成id=5以及emp_no=10005,其他數據保持不變,使用replace實現,直接使用update會報錯。
CREATE?TABLE?titles_test?( ???id?int(11)?not?null?primary?key, ???emp_no??int(11)?NOT?NULL, ???title??varchar(50)?NOT?NULL, ???from_date??date?NOT?NULL, ???to_date??date?DEFAULT?NULL); insert?into?titles_test?values ('1',?'10001',?'Senior?Engineer',?'1986-06-26',?'9999-01-01'), ('2',?'10002',?'Staff',?'1996-08-03',?'9999-01-01'), ('3',?'10003',?'Senior?Engineer',?'1995-12-03',?'9999-01-01'), ('4',?'10004',?'Senior?Engineer',?'1995-12-03',?'9999-01-01'), ('5',?'10001',?'Senior?Engineer',?'1986-06-26',?'9999-01-01'), ('6',?'10002',?'Staff',?'1996-08-03',?'9999-01-01'), ('7',?'10003',?'Senior?Engineer',?'1995-12-03',?'9999-01-01');
題解
update titles_test set emp_no=replace(emp_no,"10001","10005")
where id=5
http://https://blog.csdn.net/bingguang1993/article/details/80592579/(SQL中的替換函數replace()使用)
5.修改表名
題目:將titles_test表名修改為titles_2017
題解:
RENAME TABLE titles_test to titles_2017;
ALTER TABLE titles_test RENAME TO titles_2017;
6.ADD CONSTRAINT FOREIGN KEY 創建外鍵約束
創建外鍵語句結構:
ALTER TABLE <表名>
ADD CONSTRAINT FOREIGN KEY?(<列名>)
REFERENCES <關聯表>(關聯列)
eg:alter table audit
add constraint FK_ID foreign key (emp_no)
REFERENCES employees_test(id)
總結
以上是生活随笔為你收集整理的牛客网SQL篇刷题篇(38-47)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql操作库命令_MYSQL数据库-
- 下一篇: python中idle怎么打开_为什么我