Java面試手冊:數據庫 ②

使用數據庫的必要性

  • 無論是集合、對象、程序一旦重啓所有數據全部消失,無法做到持久化保存
  • xml 是可以保存數據的
  • 另外還可以通過IO流將數據保存到本地磁盤,但是數據缺乏結構化,無法描述複雜的業務邏輯,且讀寫比較慢。
  • java 裏面雙引號表示String 類型,單引號表示char類型,而數據庫中是char(長度不尅變)和varchar(長度可變)
關於數據庫

  • 一個項是數據庫先行(表結構的設計、關係到項目的成敗),每一個項目都有自己的數據庫,項目經理將創建好的數據庫放到一個服務器上,但開發的時候是個人考下來的,即爲了數據安全,開發人員是鏈接到自己的本地數據庫,以防數據被破壞。
  • 如何對數據庫進行管理:
    • slq語言是一個專門處理數據庫的編程語言。
  • 數據庫的組成:一個數據庫是由多張表組成的,數據庫中的數據保存在數據表中,數據白由兩部分組成
    • 表結構:列信息--->字段
    • 表數據:行信息--->值

SQL入門

數據庫的分類(SQL概念相關)

  • 數據庫分類
    • 關係型數據庫:Oracle、DB2、SQ server、MySQL、MS Access
    • 網狀、樹狀、面向對象數據庫
    • 非關係型數據庫有:MongoDB 、Rides、Memcached
  • 數據庫操作的命令類型
    • DDL:(數據庫的定義語言,創建、刪除、修改,數據庫、數據表)create/alter/drop table、index; create/drop view;
    • DML: (數據庫操作語言,操作數據庫中的數據),insert、update、delete。
    • DQL:數據查詢語言,對數據進行查詢(select)
    • DCL:(數據控制語言)創建對象,控制用戶權限,用來控制數據庫組件的存取(事務:begin,commit,rollback)
  • 表結構
    • 字段
    • 記錄
    • 主鍵
    • null值
    • 數據類型
    • 字段長度
  • 基本數據類型
    • 字符串類型(char固定長度,varchar可變長度,用多少給多少)
    • 數值類型
    • 日期和時間類型
  • 規劃
  • 完整性約束
    • 實體完整性:又稱爲行完整性,要求表中不能存在完全相同的行,而且每行都要具有一個非空且又不重複的主鍵。可以用主鍵子句或者主鍵短語來定義
  • 建表時定義主鍵
    • 添加主鍵
    • 參照完整性:又稱引用完整性,指標簡的規則,卓用於有關聯的兩張或兩張以上的表,通過使用主鍵和外鍵(或爲一鍵)之間的關係,使表中鍵值在相關表中保持一致。可用外鍵子句來定義。
  • 建表時定義外鍵
    • 添加外鍵
  • 用戶自定義完整性:指針對某一具體關係數據庫的約束條件,它反映某一具體應用所涉及的數據必須滿足的語義要求。屬性約束
    • 非空約束: alter table 表名 alter column name varchar(20) not null
    • 唯一性約束 alter table 表名 add constraint UQ_表名_列名 unique(列)
    • 檢查約束:alter table 表名 add constraint CK_表名_列名 check(age>5)
    • 默認約束:alter table 表名 add constraint DF_表名_列名 default('男') for gender
  • 刪除完整性:刪除約束,全局約束:包括基於元組的檢查之句(check)和斷言 alter table 表名 drop constraint DF表名


SQL中的函數

  • sql函數可以完成一些複雜的功能,但是一般不使用sql來完成複雜的查詢,複雜的業務全部交給java來完成。sql只是存儲功能本身是一個檢索機制,否則會浪費大量資源。
  • 語法與存儲過程很類似,功能類似,區別是函數必須有返回值。參數只能輸入參,存儲過程不一定有返回值,參數可以是入參 也可以是出參。
      create  function   函數名(參數列表)
      returns  返回值的數據類型
      routine_body
      ----------------------------------------------------------------------------------------
      //實例
      create  function  name_of_user( uid  int )
      returns   varchar(11)
      begin
      return( 
          select   name  from  user   where  id  = uid
      );
      end;
      調用函數:select  函數名(參數)
      刪除函數:drop  function  函數名

數學函數

  • abs()求絕對值,會改變結果但是不會改變數據庫的數據, select abs (score) from student;
  • floor(num),向下取整;返回小於參數的最大整數: select floor(score) from student where id = 1;
  • eil(num),向上取整 :返回大於參數的最小整數 ; select ceil (score ) from student where id = 2;
  • 字符串函數:
  • insert(s1,index,length,s2):s1表示要替換的字段;index表示要替換的開始位置;length表示要替換的長度;s2表示要替換的內容,select insert(name, 1,1,"小紅") from student;
  • upper(name),lcase(name) ,將字母值變成大寫。
select  upper(name)    from  studet;
select  ucase(name)    from  student
  • lower(), lcase() 將字母變爲小寫
   select  lower(name)   from  student  ;
   select  lcase(name )   from stedent;

  • lefe (s,len) :返回s字符串的前 len個字符。select lefte (name,2) from student;

  • right (s, len) 返回s 字符串的後 len 可字符 elect right (name,2) from student;

  • substring (s, index ,len) :截取s 字符串,從index 位置開始,長度爲len。select substring (name , 2, 2) from student id = 6;
  • reverse (); 反序輸出; select reverse (name ) from student where id = 6;
  • 日期函數:java.util;中提供了data()類, 而在sql中 也提供了相應的方法。
  • curdate() current_date() 獲取當前日期
  • curtime() current_time() 獲取當前時間
  • now() 獲取當前日期+時間: select now();
  • datediff(d1,d2) d1和d2 相隔的天數,如果出現負數表示推的順序不同; select datediff("2017-5-1","2018-3-14") frome student.;
  • adddate(d,n) 返回d日期之後的n天的日期; select adddate("2018-1-1",33 ) from student ;
  • subdate(d,n) 返回d日期之前的n天日期 select subdate("2018-1-1",33 ) from student ;
  • 聚合函數(前兩個常用 )
  • count(id)根據某個字段統計出數據的條數。或者說是記錄數(當前數據庫保存了多少條數據) 統計函數。
  • sum(score) 計算某個字段值的總和
  • avg(score) 計算某個字段的總和的平均值
  • max(score)某個字段值得最大值
  • min(score ) 求某個字段值的最小值。
SQL運算符

  • 算術運算符
  • 執行運算符:加減乘除; select score + 10 from student where id = 5;
  • 比較運算符:大於 小於 等於 不等於,返回的是布魯值0/1,1表示爲true 0表示false;elect score <10 from student where id= 7;
  • 邏輯運算符:與 或 非。select score >60 & age <20 from student where id = 8;
  • 位運算符:按位與 按位或 按位取反
  • 特殊運算符
SQL執行順序

1、Form(left tab); 2、On<join condition> ; 3、<join type> join <right tab>; 4、where;5、Group by; 6、Having; 7、select;8、distinct; 9、Order by; 10、<top num>

數據庫的設計

數據庫的設計是項目成功的最主要環節,(項目的重要)數據庫中實現相關關係,主鍵 和外鍵不是必須有的,但是爲了安全儘量使用。

  • 主鍵
    • (核心)將一個字段設爲主鍵。該字段的值是每一行記錄的唯一標識。
    • 給表中某一個字段,添加主鍵屬性,字段的值就是該條的記錄唯一標識。就如同每個人的身份證號一樣唯一的標識。
    • 主鍵不能有重複值,默認情況下每張表都有主鍵,一張表只能有一個主鍵,所謂一張表有多個主鍵指的是聯合主鍵。聯合主鍵的特點:用多個字段作爲一張表的主鍵。
    • 主鍵生成原則:代理主鍵,與業務無關的字段,僅僅是用來標識一行數據: goods: name ,price,date.額外添加一個字段 id 作爲代理主鍵,但是它與業務無關,一般將該字段設置爲int 類型,int類型佔用空間小,檢索更快
    • 主鍵自增:在添加一條記錄的時後,不需要設置主鍵的值,自動生成新數據的主鍵,每次加一。
  create table student (
    id int primary  key  auto_increment,
    name  varchar(11)
  )
  • 外鍵:(由主鍵和外鍵共同組成 java和數據庫的對應關係)給表中的一個字段添加一個外鍵屬性(從表),讓它由相應的主鍵約束(主表),與其他表的主鍵構成關聯關係,主鍵約束外鍵。
    //給表中添加外鍵
      create table  student (
      id  int  primary  key  auto_increment,//主鍵設置每張表都有,並且在代碼的第一行。
      name varchar(11)
      cid  int,//在創建表的字段的時候也要創建外鍵字段
      foreign  key( cid ) references   classes( id )   //cid爲外鍵  ,id爲主鍵,外鍵受到主鍵約束。
      )
    -----------------------------------------------------------------
      //修改主鍵或外鍵
       alter  table  user add  company_id  int;  //添加一個外鍵字段。
       alter   table  user  add   foreign   key ( company_id  )  references  company( id );
    ---------------------------------------------------------------------
      // 刪除外鍵
      alter   table   orders  drop   foreign  key  orders_ibfk_1
    ----------------------------------------------------------------------
      表創建 在先,主外鍵設置在後
      //創建兩張單表,沒有任何關聯關係
      create  table   classes (
        //主鍵id
        id  int  primary  key   auto_increment,
        name  varchar(11)    
        );
        create  table  student  (
        id   int  primary   key  auto_increment,
        name  varchar(11)
        )
       //給從表添加 外鍵 cid,使用修改表關鍵字 alter
          alter  table  student  add   cid   int;
       //將cid 字段設置爲外鍵,被classes 的 id約束。
         alter  table  student   add  foreign  key( cid )  references   classes( id );
表與表的關係

  • 一對一關係:人和身份證,一對一關係 ,
  • 一對多關係:班級和學生,一個班級可以對應多個學生,數據庫通過設置主外鍵關聯關係,來維護兩張表的一對多的關係,主鍵和外鍵都是天加到字段上的屬性。
  • 多對多關係:學生和選課,商品和顧客,通過建立第三張表專門存放外加字段 ,從而實現多對多的關係,實際上是通過設置兩個一對多關係來間接表示多對多關係。
  • 刪除表:刪除表要先刪除從表,再刪除主表 ,
表操作
  • 創建表:CREATE TABLE 表名(字段名 字段類型 約束...)

數值類型

日期和時間

字符串類型

  • MySQL字符類型 數值類型 tinyint(1一個字節) smallint(2 個字節) mediumint(3個字節) int(4個字節) 一個字節包括8位(0、1)二進制數。 日期和時間 year(1個字節) 範圍:1901--2155 time(3個字節) 顯示範圍:"—838:59:59"~"838:59:59",負數是因爲可以表示時間間隔。 date(3個字節)日期範圍:“1000-01-01 ”~“9999-12-31 ” datetime(8個字節)日期的範圍:“1000-01-01 00:00:00”~“9999-12-31 23:59:59” timestamp(4個字節)時間戳:表示1970,1,1 00:00:00到現在的毫秒數(1000=1毫秒)。 可以用於導入相同的內容而不重複 字符串類型 char(M)個字節 varchar(M) 長度+1個字節--->0--65535 text 長度+1個字節 ---->0---65535 浮點型:(常用double) float (4個字節)單精度浮點型範圍小 double(8個字節)範圍大 decimal(M,D)佔M+2個字節 ,decimal(5,2) ,M是數值得最大數(精度) D小數點後數值的個數(標度) 二進制類型:(常用blob ) 保存視頻,音頻,圖片格式的數據, 保存:縮成二進制流保存到數據庫 使用:從數據庫將二進制流讀出,OutputStream還原到本地硬盤。 bit (M) M位的二進制數據M/8個字節 binary (M)M個字節 varbinary (M)長度+1個字節 tinyblob 255個字節 blob 2的16次方—1個字節 longblob 2的32次方—1個字節

  • (SQLserver)字符類型
    - character(字符串)
      - char(size)保存固定長度的字符串
      - varchar(n)可變長度的字符串,最多8000個字符
      - text可變長度的字符串,最多2GB字符數據。
    - Unicode字符串
      - nchar(n)固定長度的Unicode數據,最多4000字符。
      - nvarchar(n)可變長度Unicode數據,最多4000字符。
      - ntext 可變長度的Unicode數據,最多2GB。
    - Binary類型
      - bit允許0、1、或null
      - binary(n)固定長度的二進制,最多8000字節
      - varbinary(n) 可變長度的二進制,最多8000字節
      - image可變長度的二進制,最多2GB。
    - number類型
      - tinyint:允許0--255的所有數字
      - int:4字節
      - bagint:8字節
      - float:
      - real
      - money:十進制貨幣數字
    - date類型:
      - datetime:(從1733年1月1日--9999年12月31日,精度3.33毫秒),8 bytes 
      - date:僅存儲日期,0001年1月1日到9999年12月31日,3bytes
    - 其他數據類型 
      - uniqueldentifier 存取全局標識符(GUID)
      - xml存取XML格式化數據。最多2GB。
      - cursor存儲對用於數據庫操作的指針應用。
    - 常見的字段類型選擇
      - 字符類建議用varchar、nvarchar
      - 金額貨幣採用money
      - 自增長,採用bigint數據類型,(數據量大int裝不下,修改麻煩)
      - 時間類型,datetime類型
什麼是約束,有哪些?

  • 創建表的時候,對錶進行限定,保證之後插入表的數據完整性和準確性
  • 約束種類
    • primary 主鍵約束,非空即唯一
    • no null 非空
    • unique 唯一
    • autoincrement 主鍵自增長,當主鍵integer,可以自增長。
    • foreign key外鍵 一張表的外鍵可以關聯另外一張表的主鍵,而保證數據的完整性。
    • check 約束用來限制列中值的範圍
    • default 約束用於向列中插入默認值
創建表實例
 ```
   create table student(
   id integer primary key,主鍵
   name text not null ,文本最大長度65535,非空
   age integer unique,唯一
   gender text,
   emall text,
  check(age>0) 約束用於限制列中默認值的範圍
  );
 ```
更新表: ALTER+TABLE+表名

  • 增加列 add 給student增加一classname列. alter table student add calssname text;
  • 刪除列 drop 刪除表student的一個列(column)yy. alter table student drop column yy
  • 修改列字段類型 modify 修改表lals的Sname的數據類型,varchar--text alter table lals modify Sname text
  • 修改列名 chanage (同時可以修改字段類型) 將數表student的gender改變成sex。 alter table student change gender sex text
  • 修改表名 rename 將表名student 修改爲stu alter table student rename to stu
查詢表

  • show tables://查詢當前數據庫下面的所有表
  • desc + 表名://查詢表的詳細信息。
  • 刪除表:
  • drop table
對數據的操作(重要)
  • 新增: insert into 表名(字段列表 可以省略,如果省略則表示每個字段都需要添加) values(值列表); insert into user values(1,“張三”,“男”);//varchar類型 單雙引號均可
  • 刪除: delete from 表名; //謹慎使用,一旦執行,會清空整張表。造成開發事故。 delete from 表名 where 條件; //通過id刪除,通過name 去刪除,建議使用,加上where 條件。 delete from user where id= 1; //刪除id爲 1的數據
  • 修改: update 表名 set 字段名 = 字段值 ; //同樣謹慎使用,一旦使用將更改全部數據 update 表名 set 字段名 = 字段值 where 條件;//必須使用該表示方法 加上 where 條件。
  • 查詢: select * from 表名; select * from 表名 where 條件;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章