Java面試題2(mysql數據庫)

1.轉發(forward)和重定向(redirect)的區別?

      1).效率上

                 轉發(forward) > 重定向(redirect)

      2).顯示上地址欄

                  重定向(redirect): 顯示新的URL

                  轉發(forward): 地址欄不變

      3).數據上

                  轉發(forward): 可以共享request裏面的數據 

                  重定向(redirect): 不能

     4).請求次數

                 重定向(redirect): 兩次

                 轉發(forward):     一次

       重定向是客戶端行爲,轉發是服務器行爲

       重定向可以訪問自己的web應用以外的資源,在重定向過程中傳輸的信息會丟失.

       請求轉發是服務器內部把一個request/response的處理權移交給另一個,對客戶而言,只知道最早的請求A,而不知道B,甚至C,D. 傳輸的信息不會丟失

2.CSS選擇器類型?

      1)標籤選擇器(如: body  div  p  ul  li)

                用戶點擊按鈕之後,所有<p> 元素全都隱藏

          $(document).ready(function(){ 

              $("button").click(function{

                     $("p").hide();

               });

         });

    2)  #id選擇器

              當用戶點擊按鈕之後,有  id = "test" 屬性的元素將被隱藏

         $(document).ready(function(){

              $("button").click(function(){

                  $("#test").hide();

               });

           });

     3) .class選擇器

    用戶點擊按鈕之後帶有  class = "test" 屬性的元素隱藏

         $(document).ready(function(){

                 $("button").click(function(){

                     $(".test").hide();

               });

           });

3.  HTML和JSP的區別?

      HTML: 靜態頁面

                 不需要指定編譯工具,只需要在TXT文檔中寫上HTML標記就就行

       JSP: 動態頁面

               需要經過JDK編譯之後後把內容發給客戶端去顯示

               把JSP轉譯成一個servlet文件,然後在編譯成class文件,

               當用戶訪問JSP文件時就執行class文件.

區別:

      1.HTML能直接打開,JSP只能發佈到Tomact等服務器上才能打開

      2.HTML頁面是靜態頁面,可以直接運行,

          JSP頁面是動態頁面它運行時需要轉化爲Servlet

     3.JSP在表頭中有編碼格式和導入包等

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

 <!-- 導入spring標籤庫 -->

 <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

     4.JSP<%%>就可以寫java代碼了,而HTML沒有<%%>

4.Mysql和Oracle的區別?

       1.Oracle是大型數據庫而Mysql是小型數據庫,

          Oracle的市場佔有率達40%,Mysql只有20%左右.

          Mysql是開源的,Oracle價格非常高

      2.Oracle支持大併發,大訪問量

      3.安裝所用的空間差別很大:

        Mysql安裝完後才152M,而Oracle有3G左右,

        且使用Oracle佔用特別大的內存空間和其它機器性能

    4.Mysql和Oracle在操作上的區別:

        (1)創建表:

             Mysql有 create table if not exist 方式創建表,

             對於在程序中自動實現表創建的情況很方便

            Oracle不支持if not exist 和 drop table if exists 語句

        (2)主鍵

            Mysql一般使用自動增長類型,在創建表時,只需指定表的主鍵爲auto_increment,

            插入記錄時,不需要指定該記錄的主鍵值.Mysql將自動增長.  

            Oracle不能使用auto_increment

            Oracle的主鍵一般默認是4個字節,Mysql沒有要求

       (3)單引號的處理

              Mysql可以使用雙引號包起字符串

              Oracle只能用單引號包起字符串

     (4)Mysql和Oracle分頁處理

        Oracle分頁:

          Oracle分頁標準計算公式:  page: 當前頁碼,    pageSize: 每頁顯示個數

          select * from (select rownum rn, zhou.*from zhou) 

       where rn between (page-1)*pagePage + 1 and page*pageSize;

       Oracle分頁注意事項:

       在使用rownum時,不能對rownum進行大於0的某一數的判斷,

        因爲rownum必須從0開始遞增

     ---查詢第三條以後的記錄

        錯誤的:select rownum,id,name ,salary from zhou where rownum > 3; 

        正確的: select * from (select rownum rn,zhou.* from zhou) where rn >3;

     Mysql分頁查詢:

           select * from 表名 limit 起始行號,行數

        起始的行號從0開始,如果和order by連用,order by 在前

   ---列出總成績並且按照降序排列,只打印三行

select name,sum(score) from score group by name order by sum(score) desc limit 3;

     (5) 字符串的模糊查詢

         Mysql:

                select * from 表名 where 字段名 like '%條件%';

                 %C: 以C結尾.   C%: 以C開頭

         Oracle: 不能使用索引,速度不快

                     ---查詢名字中第二個字母是A的員工信息

                    select id,name from zhou where name like '_A%';

                      %:任意0到多個字符,   _:任意一個字符

5.Servlet聲明週期?

          通過調用 init( ) 方法進行初始化

          調用 service( ) 方法來處理客戶端的請求

          通過調用 destory( ) 方法終止(結束)

          Servlet是由 JVM的垃圾回收器進行垃圾回收的

6.Resful風格?

          Resful: 符合REST約束風格和原則的應用程序或設計

         Http的請求動作一般分爲四種:

              1) POST增加資源

              2)GET獲取資源

              3)PUT修改資源

              4)DELETE刪除資源

     前端的請求參數只能是GET或者POST,所以需要將POST請求轉化爲PUT/DELETE.

       通過此過濾器HiddenHttpMethodFilter進行轉換,在前端發起請求時,

    添加一個_method將,此參數的值指定爲請求類型PUT或者DELETE

    PUT/DELETE不能設置一級路徑

 

@Controller

public class SecondController {

  @RequestMapping(value="/testGET/{name}", method=RequestMethod.GET)

   public String testGET(@PathVariable("name") String name){

        System.out.println("查詢某個學生的信息");

        return "hello";

    }

   @RequestMapping(value="/testPOST",method=RequestMethod.POST)

    public String testPOST(){

        System.out.println("添加某個學生");

        return "hello";

    }

    @RequestMapping(value="/testPUT",method=RequestMethod.PUT)

    public String testPUT(){

        System.out.println("修改某個學生的信息");

        return "redirect:hello.jsp";

    }

    @RequestMapping(value="/testDELETE",method=RequestMethod.DELETE)

    public String testDELETE(){

        System.out.println("刪除某個學生的信息");

        return "redirect:hello.jsp";

    }

  }

 

//(2) hello.jsp

 <h1>hello</h1>

 

//(3)index.jsp

<h1>REST風格架構</h1>

<form action="testGET/李白" method="get">

        <input type="submit" value="get">

</form>

<br>

<form action="testPOST" method="post">

    <input type="submit" value="post">

</form>

<br>

<form action="testPUT" method="post">

    <input type="hidden" name="_method" value="put">

    <input type="submit" value="put">

</form>

<br>

<form action="testDELETE" method="post">

    <input type="hidden" name="_method" value="delete">

    <input type="submit" value="delete">

</form>

7. 存儲過程?

       數據庫系統中一組提前編譯的PL/SQL語句程序語句集,其中可以封裝一些通用操作,

       當我們需要執行這些通用操作時,可以通過制定存儲過程名和參數名來調用儲存過程

   作用:

           1.只需編譯一次,以後每次執行不需要重複編譯

           2.可以對數據一些通用複雜操作進行封裝

           3.可以反覆調用,減少工作量

    存儲過程實例:

            傳入員工id,給指定員工漲100元薪水,並且打印漲前和漲後薪水

     set serveroutput on;

     create or replace procedure raisesalary(empid IN number)

      AS

    --定義變量保存漲前和員工姓名

     pname zhou.name%type;

     psal zhou.salary%type;

     begin

   --獲取員工的漲前薪水,賦值給變量psal

   select name,salary INTO pname,psal from zhou where id = empid;

  --將指定員工薪資漲100

 update zhou SET salary = salary + 100 where id = empid;

  --打印漲前和漲後薪水

 dbms_output.put_line('id:' || empid || ',' || 'name:'  || pname || ',' || '漲前:' || psal || ',' || '漲後:' || (psal + 100) );

 end;

 /

--調用存儲過程

begin

raisesalary(1002);

raisesalay(1003);

end;

/

8. 觸發器? 觸發器的使用場景?

  概念: (可以看成是監聽器)

         數據庫中一個用於表相關的,存儲一段PL/SQL程序,主要作用是用監聽表中DML(data manipulation language數據操縱語言)操作,

         當指定表上執行了insert  update  delete這些操作的語句時,

         就會自動觸發存儲在觸發器中的PL/SQL語句

觸發器類型

      (1)語句集觸發器(針對表)

       在指定操作語句執行之前或之後會執行一次觸發器中的PL/SQL,無論這個操作影響了多少數據(一般是insert  delete)

     (2)行級觸發器(針對行)

       觸發器語句作用的每一行記錄都會備被觸發,可以使用

     :new和  :old兩個變量來記錄這一行數據被影響之前和之後的狀態(一般是update)

     (3)創建觸發器語法

 create[or replace] trigger trigger_name(觸發器名)

               {berore | after} 

       {insert | delete | update[of column]}

         on 表名

         [for each row [where(條件)]]

                 declare

                  begin

                        PL/SQL程序

                  end;

                    /

      (4)觸發器的使用場景:

             1.複雜的安全性檢查

         ---禁止在非工作時間往數據表中插入數據(上午9點之前,下午18點之後)

               create or replace trigger trigger_securityemp

               before

               insert on myemp

              declare

              begin

                  --判斷當前時間如果不是在9點到18點之間拋出異常,禁止插入

               if extract(hour from systimestamp) + 8

               not between 9 and 18 then raise_application_error(-20001,'禁止在非工作時間插入數據');

               end if;

               end;

                 /

              insert into myemp (name, salary,obj) values ('碧瑤',6000,'銷售');

             2.數據的確定

             3.數據庫審計

             4.數據的備份和同步

9.聯查(https://www.cnblogs.com/assasion/p/7768931.html

     inner join(等值連接) :只返回兩個表中聯結字段相等的行

                 select chinese.name from chinese inner join math on chinese.name = math.name;

      left join(左聯接) :返回包括左表中的所有記錄和右表中聯結字段相等的記錄 :

               select chinese.name,chinese.job,math.obj,math.score from chinese left join math on chinese.name = math.name;

     right join(右聯接): 返回包括右表中的所有記錄和左表中聯結字段相等的記錄

     union去重:

             union不會去重,union可以連接多個查詢語句,每個表的結構必須一致

                        select name from chinese union select name from math;

10.聚合函數, 分組

      聚合函數:

            1)平均成績: as:給字段起別名

                select avg(age) as '平均成績' from student;   

            2)最大年齡

                select max(age) as '最大年齡' from student;

           3) select * from student where age = (select max(age) from student);

           4)找出比平均年齡小的

               select * from student where age < (select avg(age) from student);

           5)該字段的記錄數

               select count(sid) from student;

          6)張三的平均成績

              select avg(score) from score where name = '張三';

       分組:

             select 字段名 聚合函數 from 表名 group by 字段名[having 篩選條件]

                 注意:

                       1.前面已經執行完了,纔會執行having

                       2.select 後面出現的字段名必須是 group by 後面的字段名

      1)列出每個人的平均成績和總成績

              select name,avg(score) as '平均成績',sum(score) as '總成績' from score group by name;

     2)列出平均成績大於70的人名和成績

             select name,avg(score) as '平均成績' from score group by name having avg(acore) > 70;

     3)列出平均成績 > 70 總成績 > 180的人

            select name,avg(acore) as '平均成績', sum(score) as '總成績' from score

              group by name having avg(score) > 70 or sum(score) > 180;

    4)列出總成績並且按照升序排列     desc 降序

               select name,sum(score) from score group by name order by sum(score);

    5)列出每科的平均成績

               select obj,avg(score) as '平均成績' from score group by obj;

    6)列出總成績並且按照降序排列,並且只打印3行

              select name,sum(score) from score group by name order by sum(score) desc limit 3;

11.外鍵

              (1)作用: 可以爲兩張表後者多張表建立關聯,保證了數據之間的一致性,完整性等

                            一個表的外鍵肯定是另一張表的主鍵

                           主鍵所在的表稱之爲主表,外鍵所在的表稱之爲從表

                            一張表雖然只有一個主鍵,但可以有多個外鍵

                           目前只有mysql引擎爲innoDB時才支持外鍵(默認是innoDB)

           (2)外鍵的約束模式:

                 1.set null: 閒置模式

                         主表記錄被刪除或者更改,從表相關記錄的外鍵置爲null;

                2.cascade: 級聯操作

                        主表中刪除或者更新了某條信息,從表中與該表記錄有關的記錄也發生改變

                3.district: 嚴格模式    no action: 和district一樣

                        當從表中有外鍵數據和主表關聯,主表中該條記錄就不能刪除或者更新

                        (父表不能刪除或者更新一個被子表引用的記錄)

          (3)添加外鍵:  

                             constraint: 約束  

                             references: 參考

                            foreign key:外鍵約束

                            cascade: 主變從變   set null: 主變從爲空(null)

                   alter table st add constraint te_fy_st 

                   foreign key(tid) references te(tid) 

                   on delete set null on update set null;

        (4)刪除外鍵

                  alter table st drop foreign key te_fy_st;

12.索引

         (1)作用: 

               當某個表中某個字段經常作爲查詢條件(where 後面),並且表中有大量的數據,

              該表經常作爲查詢條件,這時就可以將該字段作爲索引,提高查詢效率,

              但是降低了增刪改的效率

        (2)索引的創建

             2.1單例索引: 基於表中某一經常查詢列來創建索引

              create [unique] index 索引名 on 表名(字段名);    unique:創建唯一索引

            2.2複合索引:

            基於多列來創建的索引,比如經常需要根據某兩列來進行order by排序時會使用到

         ---基於myemp表的deptno salary 兩列來創建複合索引

          create index idx_myemp_deptno_salary on myemp(depton,salary);

       ---在執行以下查詢時,會自動調用上面的索引

         保證order by 列的順序和創建索引時,列的順序一致,複合索引纔會起作用

         select id,name,deptno,salary from myemp order by deptno ASC, salary DESC;

       (3)索引的重建和刪除

            3.1更新索引

                 如果表的索引列上經常執行DML操作,就需要對索引執行更新重建

                    語法: atler index 索引名 REBULLD;

          3.2刪除索引

                索引表中索引類列中有不合理的索引,會導致操作性能下降

                    語法: drop index 索引名

      (4)索引的使用場景:

           1.爲經常出現在where子句中列建立索引

           2.爲經常出現在order by, distinct(關鍵字去重)後面的列建立索引

              如果是複合索引,索引後面的列順序要和這些關鍵字後面列順序一致

          3.爲經常出現做表連接的連接條件列上建立索引

          4.不要在經常DML操作的列上建立索引

          5.不要在數據量少的表上建立索引

          6.限制表的索引數目,索引不是越多越好

          7.刪除很少被使用,不合理的索引

13.MySql常用的?

    DDL(數據庫定義語言)

       1.創建數據庫:

           create database if not exists 庫名 character set utf8 collate utf8_general_ci;

       2.創建表:

           create table if not exists 表名

            (字段名 字段類型 字段約束,字段名 字段類型 字段約束....) character set utf8;

       3.增加列:

                alter table 表名 add (列1,列2.....)

       4.修改列:

           4.1修改字段名及其類型:

                alter table 表名 change 舊列名 新列名 新列名類型

           4.2修改字段類型

                alter table 表名 modify 列名 新數據類型

     5.刪除列: 

               alter table 表名 drop 列名,列名.....;

     6.修改表名

               rename table 舊錶名 to 新表名

    7.複製表結構

              create table if not exists 新表名 like 舊錶名;

  DML:數據操縱語言:

     1.增加行:

           insert into 表名(字段1,字段2....) values (值1,值2....)....

     2.刪除行:

           delete from 表名 where 字段名 in (值1,值2....);

           delete from 表名 [where 字段名 = 值1,字段名 = 值2];

   3.修改行:

           update 表名 set 字段名 = 值1, 字段名 = 值2....[where id = ?];

  DQL數據庫查詢語言:

        1.select 字段1,字段2......from 表名 [where 檢索條件];

        2.select * from 表名

        3.按照某個字段排序:

                select * from 表名 order by 字段名[asc/desc];

       4.模糊查詢: %C:以C結尾,  C%: 以C開頭

               select * from  表名 where 字段名 like '%條件%';

       5.分頁查詢:

              select * from 表名 limit 起始行號,行數;

              起始的行號從0開始,如果和order by 連用,order by在前

      6.聚合函數

                avg(字段名): 該字段的平均數

                max(字段名): 該字段的最大值

                min(字段名): 該字段的最小值

               count(字段名):該字段的記錄數

               sum(字段名): 該字段的總和

         聚合函數不能直接在where後面使用

      ---找出班級中年齡低於平均年齡的學員

       select * from student where age < (select avg(age) from student);

運算符:

      邏輯:    not(非)     or(或)      and(與)

        1.範圍查詢

               select * from 表名 where 字段名  [not]  between 值1 and 值2;

       2.在一組值中匹配

              select * from 表名 where 字段名 [not] in (值1,值2.......)

       3.將null作爲索引的條件

              select * from 表名 where name is [not] null;

14.數據庫的還原備份?

      數據庫備份步驟:

      1)新開一個終端

      2) mysqldump -u root -p12345678 數據庫名字1 > 新路徑/數據庫名字2.sql;

      3)回到之前的終端,刪除舊的數據庫: drop database 數據庫名字1;

     4)新建一個數據庫, 起名爲: 數據庫名字2;

     5)選擇數據庫:   use 數據庫名字2;

     6)解析數據:  source 新路徑/數據庫名字2.sql;

15.Mysql優化?

      (1)  in 和 not in 要慎用,否則會導致全表掃描

           select  id from zhou where number  in (1,2,3);

    修改爲: select id from zhou  where number between 1 and 3;

    (2) 應儘量避免在where子句中使用or來連接條件,

         否則會導致引擎放棄使用索引而進行全表掃描

       select id from  zhou where num = 10 or num = 20;

        修改爲: select id from zhou where num = 10 

                       union all

                     select id from zhou where num = 20;

   (3) 如果在where子句中使用參數,也會導致全表掃描

         select id from zhou num = @num;

修改爲強制查詢使用索引:  select id from zhou with(index(索引名)) where num = @num;

   (4)儘量避免在where子句中對字段進行表達式操作,將導致引擎放棄使用索引而全表掃描

             select id from zhou where num/2 = 100;

       修改爲: select id from zhou where num = 100 * 2;

  (5)任何時候都不要使用select * from zhou,用具體的字段代替 * ,不要返回不需要的字段

  (6)如果使用到臨時表,在存儲過程的最後務必將所有的臨時顯示刪除.

            先 truncate table 然後 drop table 

           這樣可以避免系統表的較長時間鎖定

 

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