2019年10月9日 開始面試同時整理面試題

2019-10-9:

中科軟:

1、一對兔子從第三個月起每一個月生一對兔子,求24個月兔子的總數:

void Tuzi(){
        for(int i=1;i<=24;i++){
            long n=fib(i);
            //算出的是對數.要算總數的法,*2就行
            System.out.println("第"+i+"個月有兔子對數爲"+n);
            }
    }
    static long fib(int x){
        if(x>2) 
            return (fib(x-1)+fib(x-2));
        else 
            return 1;
    }

2、冒泡排序:

public void bubbleSort(Integer[] arr, int n) {
        if (n <= 1) return;       //如果只有一個元素就不用排序了
 
        for (int i = 0; i < n; ++i) {
            // 提前退出冒泡循環的標誌位,即一次比較中沒有交換任何元素,這個數組就已經是有序的了
            boolean flag = false;
            for (int j = 0; j < n - i - 1; ++j) {        //此處你可能會疑問的j<n-i-1,因爲冒泡是把每輪循環中較大的數飄到後面,
                // 數組下標又是從0開始的,i下標後面已經排序的個數就得多減1,總結就是i增多少,j的循環位置減多少
                if (arr[j] > arr[j + 1]) {        //即這兩個相鄰的數是逆序的,交換
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = true;
                }
            }
            if (!flag) break;//沒有數據交換,數組已經有序,退出排序
        }

}

泰康人壽:

依賴注入的原理:

依賴注入又稱控制反轉,其內涵就是,將創建某個bean的控制權力,由原來需要引用這個bean的bean轉移(反轉)到外部的spring IOC容器,由IOC容器統一創建,並且注入到需要引用的bean中去。其實,spring的本質是一個工廠(beanFactory)或者說bean容器,但是,我們一般都不直接用BeanFactory,而是用它的實現類ApplicationContext,這個類會自動解析我們配置的applicationContext.xml,然後根據我們配置的bean來new對象,將new好的對象放進一個Map中,鍵就是我們bean的id,值就是new的對象。

我們可以發現,通過spring  getBean()拿到的對象實例,都是通過讀取applicationContext.xml文件,再通過反射拿到的類的實例對象。

因此,spring注入的對象必須可以實例化,也就是說,接口和抽象類是不能通過spring實現注入的,因爲兩者都不能實例化。

這就讓人很不能理解了,因爲在做spring-mybatis整合的時候,我們有一個常見的做法就是在service層通過註解注入dao層接口,在這裏不是可以注入接口嗎?爲什麼又說spring不能注入接口呢?

其實,這裏注入的接口,並不是真正的接口,我們不妨吧這個注入的“接口”打印出來看看,到底是個什麼東西:

1 the dao is:  org.apache.ibatis.binding.MapperProxy@33e4ae3b
2 the dao class is : class com.sun.proxy.$Proxy21

輸出顯示,其實注入的並不是接口,而是mybatis中的mapper對象的代理類。

什麼是aop:

AOP思想就是把中間的非主流程的代碼(比如:驗證、事務管理、緩存、日誌記錄等), 橫向抽取出來放在一個公共的類中, 也就是切面.可以通過Spring框架來配置該切面.

spring是什麼?

Spring是一個庫,它的功能是提供了一個軟件框架,這個框架目的是使軟件之間的邏輯更加清晰,配置更靈活,實現這個目的的手段使用AOP和IoC,而AOP和IoC是一種思想

通過類的反射能否訪問私有屬性和方法?

可以

servlet的生命週期?

Servlet啓動時,開始加載  servlet生命週期開始。Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其 service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷燬的時候(服務器關閉)調用其 destroy方法。

jsp的四大域?

page範圍:只在一個頁面保留數據(javax.servlet.jsp.PageContext(抽象類))

request範圍:只在一個請求中保存數據(javax.servlet.httpServletRequest)

Session範圍:在一次會話中保存數據,僅供單個用戶使用(javax.servlet.http.HttpSession)

Application範圍:在整個服務器中保存數據,全部用戶共享(javax.servlet.ServletContext)

jQuery的特點?

1.JQuery是一款輕量級的js框架,JQuery核心js文件才幾十kb,不會影響頁面加載速度。與Extjs相比要輕便的多。

1.JQuery的選擇器用起來很方便,好比說我要找到某個dom對象的相鄰元素js可能要寫好幾行代碼,而JQuery一行代碼就搞定了,再比如我要將一個表格的隔行變色,JQuery也是一行代碼搞定。

2.JQuery的鏈式操作可以把多個操作寫在一行代碼裏。

3.JQuery還簡化了js操作css的代碼,並且代碼的可讀性也比js要強。

4.JQuery簡化了AJAX操作,後臺只需返回一個JSON格式的字符串就能完成與前臺的通信。

4.JQuery基本兼容了現在主流的瀏覽器,不用再爲瀏覽器的兼容問題而傷透腦筋。

5.JQuery有着豐富的第三方的插件,例如:樹形菜單、日期控件、圖片切換插件、彈出窗口等等基本前臺頁面上的組件都有對應插件,並且用JQuery插件做出來的效果很炫,並且可以根據自己需要去改寫和封裝插件,簡單實用。

6.JQuery可擴展性強,JQuery提供了擴展接口:JQuery.extend(object),可以在JQuery的命名空間上增加新函數。JQuery的所有插件都是基於這個擴展接口開發的。

Redis可以存那些類型的數據?

key-velue數據結構存儲

key   只能是字符串

value 有5種數據leixing、

  字符串 string

  哈希 hash

  列表 list

  集合 set

  有序集合 zset

springmvc的優點?

清晰的角色劃分

強大而直接的配置方式

可適配、非侵入

可重用的業務代碼

可定製的綁定(binding)和驗證(validation)li

可定製的handler mapping和view resolution

靈活的model轉換

可定製的本地化和主題(theme)解析

簡單而強大的JSP標籤庫

Spring Bean的生命週期可以被限制在當前的HTTp Request或者HTTp Session。準確的說,這並非Spring MVC框架本身特性,而應歸屬於Spring MVC使用的WebApplicationContext容器

什麼是多態?

用最簡單的一句話就是:父類型的引用指向子類型的對象。用一句比較通俗的話:同一操作作用於不同的對象,可以產生不同的效果。這就是多態。

2019-10-10

合力億捷:

多線程的創建方式?

第一種:繼承Thread類:重寫run()方法

第二種: 實現Runnable接口,實現run()方法

第三種:使用ExecutorService、Callable、Future實現有返回結果的多線程,

bootstrap是什麼?

Bootstrap集合CSS、HTML和JavaScript,使用了最新的瀏覽器技術,爲實現快速開發提供了一套前端工具包,包括佈局、柵格、表格、按鈕、表單、導航和提示等。使用Bootstrap不僅可以構建出非常優雅的前端界面,而且佔用資源非常少,使用zip壓縮後大小僅有10多KB。

bootstrap主要特色

移動設備優先
瀏覽器支持
容易上手
支持式響應式設計
開源代碼
支持HTML5和CSS3
優秀的開發及維護團隊
樣式化的開發文檔

Bootstrap構成模塊

CSS樣式
Bootstrap 自帶以下特性:全局的 CSS 設置、定義基本的 HTML 元素樣式、可擴展的 class,以及一個先進的柵格系統。
基本組件
例如,網站導航、標籤頁、工具條、麪包屑、分頁欄、提示標籤、產品展示、提示信息塊和進度條等。
JavaScript 插件
Bootstrap 包含了十幾個自定義的 jQuery 插件,這些jQuery插件主要用來幫助開發者實現與用戶交互的功能

依賴注入的理解?

對spring的理解?

list和set的區別?

List和Set是用來存放集合的接口,並且二者都繼承自接口Collection。

1、 在List中的元素存放是有序的,可以存放重複的元素,檢索效率較高,插入刪除效率較低。 
ArrayList、LinkedList、Vector是List的兩個實現類。 
ArrayList: 
底層的實現就是一個可變數組非同步實現,當數組長度不夠用的時候就會重新開闢一個新的數組,然後將原來的數據拷貝到新的數組內。由於這一底層實現,所以ArrayList集合中元素存儲的位置是連續的,查詢起來效率比較高,插入刪除效率較低。 
LinkedList: 
底層實現是雙向循環鏈表數據結構非同步實現,數據結構如下代碼

class Node 
{
  private Node privious;//引用前一個節點
  private Object value;//當前節點的value值
  private Node next;//引用下一個節點的值
}
LinkList中元素存儲位置是不連續的,插入刪除的執行效率高,查詢效率低。 
Vector: 
Vector作爲List的另外一個典型實現類,完全支持List的全部功能,Vector類也封裝了一個動態的,允許在分配的Object[]數組,Vector是一個比較古老的集合,JDK1.0就已經存在,建議儘量不要使用這個集合,Vector與ArrayList的主要是區別是,Vector是線程安全的,但是性能比ArrayList要低。

2、 set沒有存放順序不能存放重複元素檢索效率較低,插入刪除效率較高,由於set集合儲存位置是由他的HashCode碼決定的,所以他的存儲對象必須有equals()方法,而且set遍歷只能用迭代,沒有下標。 
HashSet: 
底層由哈希表(實際上是一個HashMap實例)支持,不能保證元素的順序,元素是無序的,可以有null,但是null只能有一個,不能有重複的元素。HashSet不是同步的,需要外部保持線程之間的同步問題。 
TreeSet: 
TreeSet實現了SortedSet接口,它是一個有序的集合類,TreeSet的底層是通過TreeMap實現的。TreeSet並不是根據插入的順序來排序,而是根據實際的值的大小來排序。TreeSet也支持兩種排序方式:自然排序和自定義排序。不能放入重複元素和null。

ArrayList和linkedlist的區別?

1、ArrayList和LinkedList可想從名字分析,它們一個是Array(動態數組)的數據結構,一個是Link(鏈表)的數據結構,此外,它們兩個都是對List接口的實現。

前者是數組隊列,相當於動態數組;後者爲雙向鏈表結構,也可當作堆棧、隊列、雙端隊列

2、當隨機訪問List時(get和set操作),ArrayList比LinkedList的效率更高,因爲LinkedList是線性的數據存儲方式,所以需要移動指針從前往後依次查找。

3、當對數據進行增加和刪除的操作時(add和remove操作),LinkedList比ArrayList的效率更高,因爲ArrayList是數組,所以在其中進行增刪操作時,會對操作點之後所有數據的下標索引造成影響,需要進行數據的移動。

4、從利用效率來看,ArrayList自由性較低,因爲它需要手動的設置固定大小的容量,但是它的使用比較方便,只需要創建,然後添加數據,通過調用下標進行使用;而LinkedList自由性較高,能夠動態的隨數據量的變化而變化,但是它不便於使用。

5、ArrayList主要控件開銷在於需要在lList列表預留一定空間;而LinkList主要控件開銷在於需要存儲結點信息以及結點指針信息。

 

Redis可以存的數據類型?

hashmap底層原理?

簡單來說,HashMap由數組+鏈表組成的,數組是HashMap的主體,鏈表則是主要爲了解決哈希衝突而存在的,如果定位到的數組位置不含鏈表(當前entry的next指向null),那麼對於查找,添加等操作很快,僅需一次尋址即可;如果定位到的數組包含鏈表,對於添加操作,其時間複雜度爲O(n),首先遍歷鏈表,存在即覆蓋,否則新增;對於查找操作來講,仍需遍歷鏈表,然後通過key對象的equals方法逐一比對查找。所以,性能考慮,HashMap中的鏈表出現越少,性能纔會越好。
 

緩存穿透和雪崩?

緩存穿透是指查詢一個一定不存在的數據,由於緩存不命中,接着查詢數據庫也無法查詢出結果,因此也不會寫入到緩存中,這將會導致每個查詢都會去請求數據庫,造成緩存穿透;

解決方案

布隆過濾

對所有可能查詢的參數以hash形式存儲,在控制層先進行校驗,不符合則丟棄,從而避免了對底層存儲系統的查詢壓力;

緩存空對象

當存儲層不命中後,即使返回的空對象也將其緩存起來,同時會設置一個過期時間,之後再訪問這個數據將會從緩存中獲取,保護了後端數據源;

但是這種方法會存在兩個問題:

如果空值能夠被緩存起來,這就意味着緩存需要更多的空間存儲更多的鍵,因爲這當中可能會有很多的空值的鍵;

即使對空值設置了過期時間,還是會存在緩存層和存儲層的數據會有一段時間窗口的不一致,這對於需要保持一致性的業務會有影響。

緩存雪崩

緩存雪崩是指,由於緩存層承載着大量請求,有效的保護了存儲層,但是如果緩存層由於某些原因整體不能提供服務,於是所有的請求都會達到存儲層,存儲層的調用量會暴增,造成存儲層也會掛掉的情況。

解決方案

保證緩存層服務高可用性

即使個別節點、個別機器、甚至是機房宕掉,依然可以提供服務,比如 Redis Sentinel 和 Redis Cluster 都實現了高可用。

依賴隔離組件爲後端限流並降級

在緩存失效後,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。

數據預熱

可以通過緩存reload機制,預先去更新緩存,再即將發生大併發訪問前手動觸發加載緩存不同的key,設置不同的過期時間,讓緩存失效的時間點儘量均勻。

緩存併發

緩存併發是指,高併發場景下同時大量查詢過期的key值、最後查詢數據庫將緩存結果回寫到緩存、造成數據庫壓力過大

分佈式鎖

在緩存更新或者過期的情況下,先獲取鎖,在進行更新或者從數據庫中獲取數據後,再釋放鎖,需要一定的時間等待,就可以從緩存中繼續獲取數據。

2019-10-13 億維

簡述面向對象編程的特徵都有哪些方面?

封裝:封裝是保證軟件部件具有優良的模塊性的基礎,封裝的目標就是要實現軟件部件的“高內聚、低耦合”,對象是封裝的最基本單位。

繼承:在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作爲自己的內容,並可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承,提高了軟件的可重用性和可擴展性。

多態:多態是同一個行爲具有多個不同表現形式或形態的能力。 多態就是同一個接口,使用不同的實例而執行不同操作。

抽象:抽象就是找出一些事物的相似和共性之處,然後將這些事物歸爲一個類,這個類只考慮這些事物的相似和共性之處。

描述一下JVM加載class文件的原理機制?

JVM將類加載過程分爲三個步驟:裝載(Load),鏈接(Link)和初始化(Initialize)

1) 裝載:查找並加載類的二進制數據;
2)鏈接:
驗證:確保被加載類的正確性;
準備:爲類的靜態變量分配內存,並將其初始化爲默認值;
解析:把類中的符號引用轉換爲直接引用;
3)初始化:爲類的靜態變量賦予正確的初始值;

int和Integer有什麼區別?

(1)Integer是int的包裝類;int是基本數據類型; 
(2)Integer變量必須實例化後才能使用;int變量不需要; 
(3)Integer實際是對象的引用,指向此new的Integer對象;int是直接存儲數據值 ; 
(4)Integer的默認值是null;int的默認值是0。

String 、StringBuffer 、Stringbuilder的區別?

在這方面運行速度快慢爲:StringBuilder > StringBuffer > String

在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的

String:適用於少量的字符串操作的情況

StringBuilder:適用於單線程下在字符緩衝區進行大量操作的情況

StringBuffer:適用多線程下在字符緩衝區進行大量操作的情況

簡述JSP和servlet的區別、共同點、應用範圍?

JSP在本質上就是SERVLET,但是兩者的創建方式不一樣.

Servlet完全是JAVA程序代碼構成,擅長於流程控制和事務處理,通過Servlet來生成動態網頁很不直觀.

JSP由HTML代碼和JSP標籤構成,可以方便地編寫動態網頁.
因此在實際應用中採用Servlet來控制業務流程,而採用JSP來生成動態網頁.

在struts框架中,JSP位於MVC設計模式的視圖層,而Servlet位於控制層.

JSP是Servlet技術的擴展,本質上就是Servlet的簡易方式。

JSP編譯後是“類servlet”。

Servlet和JSP最主要的不同點在於,Servlet的應用邏輯是在Java文件中,並且完全從表示層中的HTML裏分離開來。而JSP是Java和HTML組合成一個擴展名爲.jsp的文件。

JSP側重於視圖,Servlet主要用於控制邏輯。

簡述cookie和session的作用、區別、應用範圍?

Session用於保存每個用戶的專用信息. 每個客戶端用戶訪問時,服務器都爲每個用戶分配一個唯一的會話ID(Session ID) . 她的生存期是用戶持續請求時間再加上一段時間(一般是20分鐘左右).Session中的信息保存在Web服務器內容中,保存的數據量可大可小.當 Session超時或被關閉時將自動釋放保存的數據信息.由於用戶停止使用應用程序後它仍然在內存中保持一段時間,因此使用Session對象使保存用戶數據的方法效率很低.對於小量的數據,使用Session對象保存還是一個不錯的選擇

Cookie 用於保存客戶瀏覽器請求服務器頁面的請求信息,程序員也可以用它存放非敏感性的用戶信息,信息保存的時間可以根據需要設置.如果沒有設置Cookie失效日期,它們僅保存到關閉瀏覽器程序爲止.Cookie存儲的數據量很受限制,大多數瀏覽器支持最大容量爲4K

session的工作原理?

(1)當有Session啓動時,服務器生成一個唯一值,稱爲Session ID(好像是通過取進程ID的方式取得的)。

(2)然後,服務器開闢一塊內存,對應於該Session ID。

(3)服務器再將該Session ID寫入瀏覽器的cookie。

(4)服務器內有一進程,監視所有Session的活動狀況,如果有Session超時或是主動關閉,服務器就釋放改內存塊。

(5)當瀏覽器連入IIS時並請求的ASP內用到Session時,IIS就讀瀏覽器Cookie中的Session ID。

(6)然後,服務檢查該Session ID所對應的內存是否有效。

(7)如果有效,就讀出內存中的值。

(8)如果無效,就建立新的Session。

簡述過濾器和攔截器的區別和使用場景?

  1. 攔截器是基於java的反射機制的,而過濾器是基於函數回調。
  2. 攔截器不依賴與於servlet容器,過濾器依賴於servlet容器。
  3. 攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
  4. 攔截器可以訪問action上下文、值棧裏的對象,而過濾器不能訪問。
  5. 在action的生命週期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
  6. 攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裏注入一個service,可以調用業務邏輯。

使用場景:

1、日誌記錄:記錄請求信息的日誌,以便進行信息監控、信息統計、計算PV(Page View)等。

2、權限檢查:如登錄檢測,進入處理器檢測檢測是否登錄,如果沒有直接返回到登錄頁面;

3、性能監控:有時候系統在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完後記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);

4、通用行爲:讀取cookie得到用戶信息並將用戶對象放入請求,從而方便後續流程使用,還有如提取Locale、Theme信息等,只要是多個處理器都需要的即可使用攔截器實現。

簡述springMVC原理?

 

SpringMVC工作流程概述:

1、客戶端向web服務器(如tomcat)發送一個http請求,web服務器對http請求進行解析,解析後的URL地址如果匹配了DispatcherServlet的映射路徑(通過web.xml中的servlet-mapping配置),web容器就將請求交給DispatcherServlet處理。

2、DispatcherServlet接收到這個請求後,再對URL進行解析,得到請求資源標識符(URI)。然後調用相應方法得到的HandlerMapping對象,再根據URI,調用這個對象的相應方法獲得Handler對象以及它對應的攔截器。(在這裏只是獲得了Handler對象,並不會操作它,在SpringMVC中,是通過HandlerAdapter對Handler進行調用、控制的)

3、DispatcherServlet根據得到的Handler對象,選擇一個合適的HandlerAdapter,創建其實例對象,執行攔截器中的preHandler()方法。

4、在攔截器方法中,提取請求中的數據模型,填充Handler入參,所以所有準備工作都已做好,開始執行Handler(我們寫的controller代碼並不是能被直接執行,需要有剛纔那些操作,才能轉變爲Handler被執行)。

5、Handler執行完畢後返回一個ModelAndView對象給DispatcherServlet。

6、這個ModleAndView只是一個邏輯視圖,並不是真正的視圖,DispatcherServlet通過ViewResolver視圖解析器將邏輯視圖轉化爲真正的視圖(通俗理解爲將視圖名稱補全,如加上路徑前綴,加上.jsp後綴,能指向實際的視圖)。

7、DispatcherServlet通過Model將ModelAndView中得到的處數據解析後用於渲染視圖。將得到的最終視圖通過http響應返回客戶端。

列舉springMVC常用註解幾用途?

1、@Controller

     @Controller 用於標記在一個類上,使用它標記的類就是一個SpringMVC Controller 對象。分發處理器將會掃描使用了該註解的類的方法,並檢測該方法是否使用了@RequestMapping 註解。@Controller 只是定義了一個控制器類

2、@RequestMapping

  RequestMapping是一個用來處理請求地址映射的註解,可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作爲父路徑。

3、@Resource和@Autowired

  @Resource和@Autowired都是做bean的注入時使用,其實@Resource並不是Spring的註解,它的包是javax.annotation.Resource,需要導入,但是Spring支持該註解的注入。

4、@PathVariable

  用於將請求URL中的模板變量映射到功能處理方法的參數上,即取出uri模板中的變量作爲參數。

5、@CookieValue

  作用:用來獲取Cookie中的值;

6、@RequestParam

  @RequestParam用於將請求參數區數據映射到功能處理方法的參數上

7、@SessionAttributes

  @SessionAttributes即將值放到session作用域中,寫在class上面。  

  @SessionAttributes 除了可以通過屬性名指定需要放到會話中的屬性外(value 屬性值),

還可以通過模型屬性的對象類型指定哪些模型屬性需要放到會話中(types 屬性值)

8、@ModelAttribute

  代表的是:該Controller的所有方法在調用前,先執行此@ModelAttribute方法,可用於註解和方法參數中,可以把這個@ModelAttribute特性,應用在BaseController當中,所有的Controller繼承BaseController,即可實現在調用Controller時,先執行@ModelAttribute方法。

9、@ResponseBody 

  作用: 該註解用於將Controller的方法返回的對象,通過適當的HttpMessageConverter轉換爲指定格式後,寫入到Response對象的body數據區。

使用時機:返回的數據不是html標籤的頁面,而是其他某種格式的數據時(如json、xml等)使用;

簡述spring事物管理?

在 Spring 中通常可以通過以下三種方式來實現對事務的管理:

  • 使用 Spring 的事務代理工廠管理事務(已過時)
  • 使用 Spring 的事務註解管理事務
  • 使用 AspectJ 的 AOP 配置管理事務

事務的四大特性:   簡稱ACID,這樣比較容易記

  • Atomic, 原子性,指的是事務不可再分。

  • Consistency, 一致性,當事務結束後,內存中的數據與磁盤中的數據保持一致。

  • Isolation, 隔離性,多個事務之間互相隔離,互不干擾

  • Durability, 持久層,只要事務提交成功,數據永不丟失

支持兩種事務操作

1.編程式事務操作

優點:全程可以細粒度地控制事務,因爲是由程序員自已控制事務的開啓、提交或回滾

缺點: 每個需要做事務控制的方法都需要手動編碼去完成。

2.申明式事務操作

優點: 無需編寫代碼,只需要進行配置,把事務當做一個切面,基於AOP的動態代理來給目標添加事務。

缺點: 只能在方法層面進行事務控制。

用一條sql語句查詢出每門功課都大於80分的name?

name           class        score

張三             數學     70

張三             語文     88

張三             英語     60

李四              數學    99

李四              語文    88

李四              英語    98

select name from (select name,min(score) from student group by name having min(score)>80) stu;

表中有A B C三列,用sql語句實現:當A列大於B列時,選擇A列,否則選擇B列,當B列大於C列時,選擇B列否則選擇C列?

select (case when A>B then A else B end),(case when B>C then B else C end) from table_nam

縱錶轉橫表

傳統的行列轉換

select 姓名,
SUM(case 課程 when  '語文' then 分數 else 0 end) as 語文,
SUM(case 課程 when  '數學' then 分數 else 0 end) as 數學,
SUM(case 課程 when  '物理' then 分數 else 0 end) as 物理
from scores group by 姓名

pivot縱錶轉橫表

select
    t2.姓名,
    t2.數學,
    t2.物理,
    t2.語文
from Scores as t1
pivot (sum(分數) for 課程 in(數學,語文,物理)) as t2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章