使用數據庫的必要性
- 無論是集合、對象、程序一旦重啓所有數據全部消失,無法做到持久化保存
- 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 條件;