數據庫(SQL/DDL/DML/DQL/約束)

1.SQL簡介

SQL:Structured Query Language  的縮寫(操作關係數據庫中的數據)
中文名稱:結構化查詢語言
作用:是一種定義、操作、管理關係數據庫的句法。大多數關係型數據庫都支持。
結構化查詢語言的工業標準由ANSI(美國國家標準學會,ISO的成員之一)維護。
組成:
DDL:數據定義語言
DML:數據操作語言
DCL:數據控制語言
DQL:數據查詢語言(sql最難的部分就是查詢)

數據庫管理軟件  可以幫我們隔離具體的物理數據存儲的方式,通過邏輯結構,來操作物理數據。
          即我們操作的都是  二維表,所有的數據都是以二維表的形式存在。

那麼二維表是如何組織起來的呢?
        一個數據庫管理軟件中,可以存在多個數據庫;一個數據庫類中可以有多個二維表。
        通過二維數據表,將數據庫的數據組織起來

區分兩個概念:
        數據庫管理系統:用於管理數據的軟件和工具。
        數據庫系統:上層應用,數據庫管理系統,數據,DBA(database administer)

數據庫管理軟件 工作過程 簡介,見圖:


            

常用的數據庫(軟件)

    Oracle(只做數據庫和數據服務) / DB2(IBM)/ informix(專注於數據庫中的事務處理)
    / Sybase(發明了一個power desgin,輔助軟件)/ SQLServer2000,2005 /
    MySQL(開源免費) / Access(office中) / SQLite(Android)等

 

MySQL 的安裝和配置:

    5.5版本要設置兩個目錄:服務的安裝目錄,數據的安裝目錄(Innodb)
    此目錄需要記住
    還要記住root的賬號密碼。
    見教程。

 

數據庫服務器、數據庫軟件、數據庫和表的關係:

1.所謂安裝數據庫服務器,只是在機器上裝了一個數據庫管理程序,這個管理程序可以管理多個數據庫,一般開發人員會針對每       一個應用創建一個數據庫。
    爲保存應用中實體的數據,一般會在數據庫創建多個表,以保存程序中實體的數據。  
2.一個user對象的數據,在表中可能就是一行數據記錄(bean類),一行中有多列。
    表與表之間的區別就在於:表結構的不同,即每個表所對應的數據的 屬性的  個數/屬性名/類型等不同
    DDL語言就是用來定義表的結構的(增加、刪除一列或者一行)。

 

MySQL常見數據類型:

VARCHAR、BLOB和TEXT類是變長類型。每個類型的存儲需求取決於列值的實際長度。
 

在整數類型中,我們要注意bit類型,bit類型,是指位類型,bit(M),表示數據用多少個二進制位來表示

範圍:

 

 

 

 

 

DDL語言

Data Definition Language

概述:

作用:
    用於描述數據庫中要存儲的現實世界實體的語言。即創建數據庫和表的結構  管理數據庫和表的結構。
創建/管理 :數據庫(的操作)  和  表結構(增刪改查).

常用關鍵字:
CREATE   ALTER   DROP

 

使用流程:

1.進入數據庫:cmd 打開DOS窗口,輸入mysql -uroot -p密碼

2.會跳轉到 mysql>
對數據的操作:

3.查看數據庫軟件中所有數據庫: show databases;

4.創建一個數據庫mydb1 : create database mydb1;

    創建時加入額外信息: 
                                //創建使用指定字符集的數據庫:
                                create database mydb1 character set gbk;
                               //創建一個帶有校對規則的指定字符集的數據庫:
                              create database mydb1 character set gbk collate gbk_chinese_ci;

5.查看數據庫:
            show databases ; ——查看當前服務中有哪些數據庫。
            show create database mydb2; —— 查看之前創建的數據庫的基本信息

6.修改數據庫:
對數據庫的修改:
            只能修改 字符集 和 校對集。
         alter database mydb2 character set utf8;

7.刪除數據庫:
        drop database mydb3; ——刪除之前創建的數據庫。

對錶的操作:

首先表長什麼樣子?

            ------------------------------------------------------
            Field    |  type            | Null  | Key  | Default |  Extra |
              id       | int(11)         | YES   |         |  NULL   |            |
              name |varchar(30)  | YES   |         |  NULL   |            |
            ------------------------------------------------------

基本語法:create table

1.創建數據表:

    先創建一個數據庫
            create database sql01;
            use sql01;    進入這個數據表
            顯示當前處在哪個數據庫: select database();
        
      1.  向表中添加數據:
            create table t_employee(id int, name varchar(10),gender varchar(3), birthday date, entry_data date,
                resume text);

      2.加入到數據表中
            insert into t_employee value(97);
            select keng from t_employee; 默認的取出方法
        //取出一個a;
        select keng+0 form t_employee;

        //取出一個97;

        select oct(keng) form t_employee;取出97的八進制表示
        select hex(keng) from t_employee;取出97的十六進制表示

       
        顯示錶:
            ****顯示全表:desc t_employee;


顯示數據表中添加的所有項目的信息:

 

2.修改表結構:alter table ....

            添加一列:add
                alter table t_employee add 列名 類型;
                alter table t_employee add image blog;

            
            修改一列的長度爲60:modify
                alter table  t_employee  modify  Field列的屬性名  varchar(60)
                (只能修改列的數據類型,不能修改其列名Field)
                eg. alter table t_employee modify name int;
            
            刪除某一列:drop
                later table t_employee  drop  image;
                
            修改表名:rename
                rename table t_employee to user;(重新命名錶,爲user)
                
            查看一個數據庫中有多少張表:
                show tables;
                
            設置表的字符集:character set gbk;
                alter table user character set gbk;
                (一般直接設置set names gbk;就行了)
          
           修改列名:change
                alter table user change 列名 新列名 新數據類型;
                alter table user change name username varchar(20);
            
            設置默認值:default
                alter table 表名 modify 列名 對應的類型 default '修改的默認值';
                alter table user modify username varchar(20) default ''; //設置username的Type屬性爲空串




 

 

DML語言和DQL語言:

這兩個語言需要放在一起配合使用:

 

        作用:操作表中數據。(DQL專門進行數據查詢)
 

 

1.DML:Data Manipulation Language

作用:
            用於向數據庫表中插入、刪除、修改數據。


常用關鍵字:
        INSERT 、UPDATE 、 DELETE(insert,update,delete)


在修改表結構的時候,修改的是某一列。而表中的數據是以行爲單位的。
    DML 則是以行爲單位進行數據修改。

 

DML語句基本操作:

插入數據:insert
        可以選擇在一行中的某幾個位置插入數據,其他位置會自動補null;
        數據類型要相同,長度不能超過原本的長度。
        字符串和日期型數據應該包含在單引號中。
        可以插入null;

        語句:insert  into table(column1,column2,...)  value(value1 , value2,....)

eg.   create table employee(id int,name varchar(20),sex bit,birthday date,...);
        //創建所有屬性列,並給每個屬性列創建值,

        insert into employee(id,name,sex,birthday,...)values(1,'zs',0,'2000-01-01');  
        //如果所有數據都要初始化的話,可以簡便寫法:

        **insert into employee(id,name,sex,birthday,...)values(1,'王五',1,'1999-01-01');    
        插入時還可以:
            insert into employee values(1,'lisi',1,'1999-01-01'),(2,'zs','1999-02-03'),(...);
            (不過這樣是默認對這一行的每一個屬性列都進行插入)

        但是————會報錯,因爲編碼的問題,見後面,這裏需要設置 set names gbk; 就可以解決這個問題了;
 

修改(更新)表中數據:update
        將id 修改:(所有行/特定行)
        1.update employee set id=10; —— (沒有where指定行)則會修改 id 所在列的所有元素,都改爲10;
        2.update employee set id=10 where name='zs'; ——指定了行(where),修改其原本的id爲10;
                                        (where 某行的屬性鍵值對)
                                        類比:java中的name.equals("zs")
        3.在原有基礎上加減
            update employee set id=id+10 where name='zs';
    
 刪除表中數據:delete
        刪除的單位是:行
        delete from employee where id=1;     //刪除定位的行
        delete from employee;      //不使用where,直接刪除這個表中所有數據
        它只能刪除表中數據,不能刪除表本身,如果要刪除表,要使用drop table

    

 

DQL語句:

    
1. select語句:
        基本select語句:
            查詢表中所有列:select * from 表名;
            (*相當於一個通配符,可以選擇某幾行屬性來輸出,select   name,id,..   from student;)
            查詢表中某些屬性列的值: select 屬性列1,屬性列2 * from 表名;
            在查詢時 過濾 表中重複數據:select distinct * from 表名;
            
            可對 列通過 表達式進行運算:
            select name,math+10 from 表名;  //對math列的所有值都加了10
            
            查詢成績的總分:
            select name,chinese+english+mash from 表名;
            但是列的名字叫:chinese+english+mash
            可以通過起別名的方式: as 別名
            select name,chinese+english+mash as score from 表名;
            
            查詢某個姓名爲李的信息:
            select * from 表名 where name like'李%';
            

在where中經常使用的操作符:

                1.like  :   模糊查詢
                      Like語句中,pattern  爲 % 代表零個或多個任意字符,_ 代表一個字符,
                        例first_name like ‘_a%’;
               
                2.between  and   :  表示數據在某一個區間範圍內(閉區間)。
                    select * from 表名 where id between 80 and 100;
                
                3.isnull:   如果表中數據有null時,那麼在向找到某個屬性值是否爲null,不能通過=null,而是isnull;
                    select * from 表名 where id isnull;
                    
                4.in(set)    表示判斷屬性值是否在集合中存在。
                    select * from 表名 where math in(55,77,100);找出具有這幾個元素的行。
                    
                5.邏輯運算符: and / or / not
                    and : 表示多個條件同時成立
                    or: 表示其中一個條件成立的;
                    not : 不成立(where not(salary > 1000))
                                (select name from student where math not in(50,70));
                                —— 表示math的成績不是50和70的學生的姓名;
    

              6.關係運算符:< > =  <= ..  不等於:<>

 

            查詢的過程:
                通過篩選滿足條件的數據,然後將這些數據放在一張臨時表中,顯示出來。
                    重命名也是在臨時表中進行重命名。
                eg. select name,math+chinese from 表名 as score where score>100;//這樣找不到socre
                那麼就要用到 order by :
                    select name,math+chinese as score from 表名 order by socre;
                基本語法:select * from table where ... order by column1 desc(ASC是默認,升序,DESC爲降序), column2 asc(desc), column3 asc(desc)...;
                (實現同一個表下的多種排序)

 

 

mysql的中文亂碼:

        查看所有地方的字符編碼:show variables like 'character%'
        確定字符編碼的地方一共有六處:client——>connection——>數據庫服務器內部(database/)——>results
        內部字符集不會出錯,則只需要關注 client、connection、results
        但是還需要注意:客戶端(console命令行)只支持GBK,編碼模式。
    ****做法:
        set names gbk;(將client/connection/result的編碼格式改爲gbk)只要這三個編碼一致,就不會出現亂碼
        查看mysql所使用的字符集:show variables like 'character';
        set character_set_result=utf8;設置某一個的字符集:中文就會出現亂碼;
        (轉換流程見下圖):

       

 

約束

概述:   

約束作用:
  (1)定義規則
  (2)確保完整性:包括數據的精確性、可靠性。以確保數據不會出錯,或者儘量減少出錯。

約束的類型:
  (1)非空約束
  (2)主鍵約束
  (3)外鍵約束(右外鍵約束)(左外鍵約束)
  (4)唯一約束
  (5)檢查約束

 

1.數據完整性約束:

    數據完整性是爲了保證插入到數據中的數據是正確的,它防止了用戶輸入的錯誤。
    
    1.實體完整性(唯一性)
        規定表中的一行記錄在表中是唯一的實體,通過表的  主鍵  來約束。
        主鍵:一個或多個  可以唯一表示  一個實體的屬性或屬性集合。(如果不能在本列中唯一,則不是主鍵)
        tid(主鍵)   name  age  (name也可能重名,所以不能作爲主鍵)  
          1              'zx'   18
          2              'lisi' 18
        
    設置主鍵約束:
        1.primary :
            primary id int primary key;
    
    主鍵有兩層含義:
        1.實體存在:
            不能給主鍵設置爲null,因爲這樣就表示這個記錄不存在,那麼就沒有意義。
            
        2.實體在表中唯一:
            如果沒有設置主鍵約束,那麼可以隨意向表中添加  重複記錄。
            如果設置了主鍵,那麼表中如果再插入同樣的記錄,則不會插入成功。
            
            

2.域完整性約束:

        指數據庫表的列(即字段)必須符合某種 特定的數據類型 或 約束
        not null; //非空約束 : 字段名 數據類型 not null;
        unique; // 唯一性約束 :字段名 數據類型 unique;
        設置了某列的兩個約束 not null unique的時候,那麼相當於給此列變成主鍵;
                
        ***一個表中可以有多個unique聲明,但是隻能有一個主鍵primary key 聲明。
        

3.參照完整性約束(外鍵):

        
        在顯示生活當中,存在很多實體,實體之間存在着聯繫。
        在數據庫中通過表的實體數據的引用 在關係表中表示他們之間的關係。
        
        在一個數據庫中:
            有兩個實體表(主鍵表)(學生表,選課表),和一張關係表(選課表),可以表示不同學生的選課的信息。
            在關係表中,如果,一個學生選擇了一個不存在的課程,或者一個不存在的學生,選擇了一個存在的課程,這些都是不合理的數據。
            
       在參照完整性中,你所引入的必須是存在的實體數據。
                    課程表(sid)          |                   學生表(tid)                 |      (關係表)選課表
            classid(主鍵)   name   |   studentid(主鍵)   name   age   |    classid    studentid   score
                1            java           |            1                   'zs'      18    |       1                2              100
                2            c++           |         2                   'lisi'      20     |       1               1               80
                                                                           3(這就是一個不存在的數據項)
                也就是說在進行inter into 關係表 values(3,1,90);將無法插入,因爲3無法在對應的主鍵中找到列表項。
                但是insert into 關係表 values(1,1,100);可以插入。
                
      添加參照完整性約束的語法:
            (學生表 :create table st(sid int premary key;)
             課程表 :create table coures(tid int )
            create table cs(ssid int,ttid int,score int,
                            constraint sid_st_fk foreign key(ssid) reference st(sid); //引用了外界的sid,
                            constraint tid_course_fk foreign key(ttid) reference course(tid);
                            )
     外鍵約束的語法:
                constraint 外鍵名 foreign key(字段名1,字段名2..) reference 主表名(主鍵列1,主鍵列2,...);
                    外鍵名:定義的外鍵約束的名稱,一個表中不能有相同的外鍵名;
                    字段名:表示子表需要添加外鍵約束的字段列;
                    主表名:表示被子表外鍵所依賴的表的名稱(主鍵所在的表);
                    主鍵列:表示主表中定義的 主鍵列或列組合;
                
     什麼是外鍵?
                首先它是表中的一個字段,,它可以不是本表的主鍵,但對應另外一個表的主鍵。
                作用:外鍵用來保證數據引用的完整性
                

2.多表設計        

    主鍵可以是一個組合(所有設置了主鍵的屬性就是主屬性,主屬性不能爲null)
    
多對多關係:
    例如學生選課:
    一個學生可以選擇多門課;多門課可以被多個同學選擇
    
    現在要存儲選課學生的數據:
    tid(主鍵) | name  |  pointdis(主鍵)  |  name  |  age
        1         |  java   |      2                    |   zs       |  18
        1         |   c       |      1                   |   zs       |  18
        2         |   c       |      2                   |   lisi     |  20
    有幾個異常:
        插入異常
            有些學生還沒有選課,那麼他在選課表中沒有數據,那麼就加入不進
            
        刪除異常:
            刪除幾個選課信息之後,發現某些課程沒了
            
        更新異常:
            修改一個名字,需要修改相關的所有學生的姓名(同一個數據需要修改很多次)
            
    解決方案:將所有數據分散到不同的表當中,那麼修改相應的主鍵屬性就可以達到目的了。
    (消除數據的冗餘)            
    將 多對多的關係:
        放入多張表中存儲:三張表中兩張實體表,一張關係表
    

一對多的關係:
    例如:一個學生和所在的省份
            一個省可以包含多個學生,一個學生只能選擇一個省份
    
    兩種存法:
        1.也是三張表,省份一張表,學生一張表,關係一張表
        2.兩張表:一張存省份(多的實體),一張存學生(一的實體),並有一個外界引用 prevince_id
        
一對一的關係:
    一表即可。
    

多表設計的規範:
    範式等。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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