數據庫MYSQL

數據庫的最基本操作語法:
查看數據庫:SHOW DATABASES;
查看數據庫的字符集:SHOW CREATE DATABASE 數據庫名;
修改數據庫的字符集:ALTER DATABASE 數據庫名 CHARACTER SET UTF8/GBK;
查看現在正在使用的庫:SELECT DATABASE();
創建數據庫:CREATE DATABASE 表名;
刪除數據庫:DROP DATABSE 表名;
查看數據庫中的表:SHOW TABLES;
查看錶結構:DESC 表名;
創建一個表:

create table student
( id int ,
name varchar(20),
age int,
birthday date,
insert_time timestamp
);

查看錶的字符集:SHOW CREATE TABLE 表名;
修改表的字符集:ALTER TABLE 表名 CHARACTER SET UTF8/GBK;
修改表的名稱:ALTER TABLE 表名 RENAME TO 新表名;
在表中添加一列:ALTER TABLE 表名 ADD 列名 數據類型;
修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 數據類型;
只修改列的類型:ALTER TABLE 表名 MODIFY 列名 數據類型;
刪除列:ALTER TABLE 表名 DROP 列名;
DML
增刪改表中的數據
增添數據INSERT INTO 表名(列名1,列名2,…列名n) VALUES(值1,值2…值n);
1.列名與值需要一一對應
2.如果表名後不添加列名:INSERT INTO 表名 VALUES(值1,值2…值n);代表的是給所有的列添加元素。
3.除了int其他的數據類型需要用引號。
刪除數據 DELETE FROM 表名 WHERE 條件;
1.注意如果不加WHERE 條件就會將表中的所有數據全部刪除。不推薦使用效率低。
如果要刪除一個表的建議使用TRUNCATE TABLE 表名;這樣刪除後會從先創建一個結構一模一樣的空表。
修改數據 UPDATA 表名 SET 列1=值1,列2=值2…WHERE 條件;

例子:UPDATE student SET age=28,score=99.99 WHERE id=10;

注意如果不加條件會將表內的目前所要修改的列全部進行修改
查詢Retrieve
LIMTI:分頁查詢其實語法就是limit +我們從那個位置開始 , 要查詢幾個數據。
修改Update
update 表名 set 我們修改的數據 where 修改的是那些部分的。例name
刪除(Delete)
delete from 表名 where (id name…)
DQL
SELECT * FROM 表名 ;
將全表的數據全部查出來
SELECT 字段(id,name…)FROM 表名
WHERE 條件()
GROUP BY 分組字段
HAVING 分組之後的條件
ORDER BY 排序(比如按分數等)
LIMIT 分頁的限定
基礎查詢:

  1. 多個字段的查詢:SELECT 字段(id,name…)FROM 表名
  2. 去除重複:SELECT DISTINCT 字段(id,name…)FROM 表名 去重需要注意,只有結果集完全相同的情況下纔可以去重
  3. 計算列:
  4. SELECT NAME,MATH,ENGLIST,CHINESE,MATH+ENGLIST+CHINESE
    FROM 表名 這裏需要注意如果說我們相加過程中有一個值爲null 則所有name所對應的數值和就爲null 處理方法 我們在 爲null的科目前面加 if null(科目,0)使用0來替代進行加和。
  5. 起別名: 接上面如果取和後,在表中顯示的名字也是MATH+ENGLIST+CHINESE 我們覺得不好看 可以起個別名MATH+ENGLIST+CHINESE AS 總分

SELECT NAME,MATH,ENGLIST,CHINESE,
IFNULL(MATH,0)+ENGLIST+CHINESE
AS(AS也可以省略用空字符代替)總分

FROM 表名   這樣就起到了**別名**

條件查詢:
1 . WHERE 字句後跟條件
2 .運算符:
在這裏插入圖片描述
在這裏插入圖片描述
BETWEEN AND 可以簡化 頻繁使用 and ,IN(集合)可以簡化or
LIKE 講一下模糊查詢:
語法:SELECT *FROM 表名 WHERE 條件 例: name LIKE ‘張%’
有兩個佔位符一個是
_表示佔一個位的
%表示佔多個位

SELECT *FROM ST1 WHERE NAME LIKE “_化%”

這種是查詢中間字段的方法
如果是進行查詢字段個數的話,我們直接進行_來表示;
常用操作查詢名字中包含的即可:

SELECT *FROM ST1 WHERE NAME LIKE “%馬%”;

DQL:查詢語句
1.排序查詢
2.聚合函數
3.分組查詢
4.分頁查詢
約束:
多表之間的關係
範式
數據庫的備份和還原
1.排序查詢:
排序語法 ORDER BY 子句
order by 排序字段1 排序方式1,排序字段2,排序方式2…
單個字段排序

SELECT *FROM 表名 ORDER BY 列名

會默認進行一個 升序的排序+ ASC / DESC

ASC :升序
DESC :降序

多個字段排序
例子:

SELECT *FROM stu ORDER BY math ASC,ENGLISH ASC;

只有當我們第一排序排完之後才會進行第二排序。
2.聚合函數
注意:聚合函數計算會排除 null 的數據 如果計算個數中有null這樣我們有兩種解決方案
1.一般選擇非空的列:主鍵
2. (IF NULL 列名 ,隨便附一個值即可)
將一列數據作爲一個整體,進行縱向的計算。比如求平均數
1.count:數量表示計算個數

SELECT COUNT(列名)FROM 表名;
簡便寫法 count(*)

求得有多少行。
2.max:計算最大值

SELECT MAX(列名)FROM 表名;

3.min:計算最小值

SELECT MIN(列名) FROM 表名

4.sum:計算和

SELECT SUM(列名) FROM 表名

5.avg:計算平均值

SELECT AVG(列名) FROM 表名

我們發現聚合函數其實就是一些簡單的加減平均值 而且語法很簡單
並且我們查詢出來的數據就是一個 僅僅的單行單列。 因爲就一個答案很好理解。
3.分組查詢
語法:GROUP BY 分組的字段
注意:
1.分組之後查詢的字段: 分組字段+聚合函數
2.where 和having的區別:
1.where在分組之前進行限定如果不滿足條件則不參與分組,having是在分組之後進行限定,如果不滿足結果則不會被查詢出來。
2 . where 後不可以跟聚合函數 ,having可以進行聚合函數的判斷
SELECT sex , AVG (math)FROM stu GROUP BY sex ;

SELECT 分組信息 ,聚合函數 FROM
分組信息 ,聚合函數 可以添加多個 分組信息就添加自己用什麼分組的信息就可以了

SELECT sex ,AVG (math),COUNT(ID) FROM stu GROUP BY sex

例子:
–按照性別分類,分別查詢男,女同學的平均分,人數,要求:分數低於70的人不參與分組,分組之後,人數要大於兩個人
**

SELECT** sex ,AVG (math),COUNT(ID) person FROM stu WHERE
math>=70 GROUP BY sex HAVING person>2 ;

分頁查詢
語法:LIMIT 開始的索引,每頁查詢的條數
每頁想顯示3條記錄

SELECT *FROM 表名 LIMIT 0,3–第一頁
SELECT *FROM 表名 LIMIT 3,3–第二頁

公式比較重要,開始的索引=<當前的頁碼-1> X 每頁顯示的條數
LIMIT 是一個MYSQL的“方言”

約束

概念:對錶中的數據進行限定,保證數據的正確性,有效性和完整性。
1.約束我們是對錶的結構進行一個約束。保證表中的數據高效
2.分類

  1. 主鍵約束:primary key
  2. 非空約束: not null
  3. 唯一的約束: unique
  4. 外鍵約束:foreign key
    非空約束:not null
    1.在創建表時添加約束

CREATE TABLE stu (
id INT,
NAME VARCHAR(20) NOT NULL – name不能爲空
);

.刪除表中的一個約束

ALTER TABLE stu CHANGE NAME NAME VARCHAR(20) 也可以使用modify

刪除約束後我們就可以添加name爲null的數據
2 .創建表完後添加約束條件

ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL

這個理解上來說就是我們去修改了列

唯一的約束: unique
被unique所修飾的列不能出現重複元素
注意MYSQL 唯一約束限定的列的值可以有多個null。
創建表時添加唯一約束:

CREATE TABLE stu (id INT,phone_number VARCHAR(20)UNIQUE);

添加一下數據說明問題:

INSERT INTO stu(id,phone_number) VALUES(1,12345); INSERT INTO
stu(id,phone_number) VALUES(1,12345)第二次是不能插入的。數據不允許重複

刪除唯一約束:
不能使用我們

ALTER TABLE stu MODIFY phone_number VARCHAR(20)不能使用這樣的操作 ALTER TABLE
stu DROP INDEX phone_number 我們需要刪除它的索引

創建表後我們添加唯一約束

ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE

在添加唯一約束前需要保證你的表中是不能有重複的對應列的值,否則是有衝突的
先去消除表中需要添加唯一約束的列中清理掉相同元素,最後再次執行命令,就完成操作了。
**主鍵約束:primary key ** +自動增長
1.注意事項:
*1.含義:非空且唯一,綜合了以上兩種約束
*2 .一張表只能有一個字段爲主鍵;一般賦值給id。
*3.主鍵就是表中記錄的唯一標識。例如身份證。
2. 在創建表時,
添加主鍵約束:

CREATE TABLE stu(id INT PRIMARY KEY,NAME VARCHAR(20))

測試即可 需要明白設麼叫做主鍵 即唯一+不爲null
INSERT INTO stu(id,NAME)VALUES(1,‘張飛’)
刪除主鍵

ALTER TABLE stu MODIFY id INT
ALTER TABLE stu DROP INDEX id
這兩種方法同樣不可以實現

ALTER TABLE stu DROP PRIMARY KEY 我們刪除主鍵

你會發現你可以添加id是相同的元素 但是我們無法去添加id爲null的情況
因爲在設置主鍵的時候會同時設定主鍵位置和 not null是否爲空的位置,僅刪除主鍵也代表只刪除一個鍵位 ,不能夠添加主鍵位爲null

創建完表後,增加主鍵

ALTER TABLE stu MODIFY id INT PRIMARY KEY 即可輕鬆完成

個人總覺想要搞定約束 ->去選擇desc 搞清楚它每一變化的表結構。
自動增長
概念:如果某一列是數值類型的,使用auto_increment 可以完成值的自動增長
在創建表的時候添加:

CREATE TABLE stu(id INT PRIMARY KEY auto_increment, – 給主鍵添加自動增長 NAME
VARCHAR(20) )

在這裏插入圖片描述
可以看到是不能爲NULL 但是我們插入:

INSERT INTO stu VALUES(NULL,‘aaa’);

不會報錯會進行自動的一個升序。結構顯示是沒有問題的,就是在你自己輸入null時,是它自動調整爲auto_increment 就不會報錯了
但此時是不可以出現重複數據。
注意:自動增長 他只會聯繫到你上一條輸入的值進行增長
刪除自動增長

ALTER TABLE stu MODIFY id INT

就可以了 主鍵這個方式是刪不掉的 會刪除掉自動增長
添加自動增長

ALTER TABLE stu MODIFY id INT AUTO_INCREMENT

外鍵約束
在這裏插入圖片描述
1.在創建表時,可以添加外鍵 foreign key 讓表與表中直接產生關係,從而保證數據的正確性。
外鍵的名稱一般是由字表_主表_fk 組成
建立關係我們回提前在字表內建立一個主表主鍵的一個信息
主表的名稱 我們需要關聯的是唯一性的列 但更多一般都是關聯主鍵
語法:

create rable 表名(

外鍵列
constraint 外鍵名稱 foreign key(外鍵列名稱)references 主表名稱(主表列的名稱)

CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id)REFERENCES department(id)
);

2.刪除外鍵
查看兩個表中已經沒有外鍵時可以通過子表中添加與父表中不相同的id就是主鍵信息,看是否成功。也可以在SQLyog 中的架構設計器中查看

ALTER TABLE 表名 DROP FOREIGN KEY emp_dept_fk (外鍵名稱)

3.創建表之後,添加外鍵

ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱
FOREIGN KEY (外鍵字段名稱) REFERENCES department(主表主鍵名稱)

我們需要瞭解到外鍵可以做些什麼 更加的安全,合理
我們的有外鍵連接到另一張表的時候,是無法直接刪除主表,並且再添加數據的過程中我們 的外鍵填入的值 必須是主鍵中有的 或者也可以爲null 否則是無法添加的

4.級聯操作
操作主表的主鍵 使子表內主表名稱內容 直接進行更改
創建表之後,添加外鍵 時候設置級聯更新。

ALTER TABLE employee ADD
CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id)REFERENCES department(id)
ON UPDATE CASCADE ;

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
級聯刪除操作:
級聯刪除也是需要我們先進行將我們的外鍵進行刪除,然後在從新建立外鍵連接的過程中進行級聯刪除操作,級聯刪除指的是在父表中刪除對應的主鍵,相對應的字表中的與父表想連接的數據全部被刪除掉。同時級聯更新與級聯刪除可以同時加載進去

對應的語法

ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk – 刪除外鍵操作
ALTER TABLE employee ADD CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id)REFERENCES
department(id) ON UPDATE CASCADE ON DELETE CASCADE ; – 建立外鍵和級聯更新刪除操作
DELETE FROM department WHERE id=2 – 刪除主表中的主鍵
SELECT *FROM employee – 顯示到字表中的數據情況

在這裏插入圖片描述
級聯如果在數據聯繫多的情況下要小心使用小心使用小心使用

數據庫的設計

1.多表之間的關係
一對一:
如人和身份證的關係
分析:一個人只有一個身份證,一個身份證也只能對應一個人
一對多(多對一):
如:部門和員工
分析:一個部門有多個員工,一個員工只能對應一個部門
多對多的關係:
如:學生和課程
分析:一個學生可以選擇很多門課程,一個課程也可以被很多學生所選擇
2.實現關係:
1.一對多(多對一):
如:部門和員工來實例分析
在這裏插入圖片描述
實現方式:在多的一方去建立外鍵,指向一的一方的主鍵。
2.多對多的關係:
如:學生和課程
在這裏插入圖片描述
實現方式:多對多關係的實現需要藉助第三張中間表。中間表至少包含兩個字段
,這兩個字段作爲第三張表的外鍵,分別指向兩長表的主鍵。同時中間表不能出現兩個一模一樣相對應的關係
我們在中間表中需要去創建一個複合主鍵
3.一對一的關係:
在這裏插入圖片描述
實現的方式:一對一的關係實現可以在任意一方添加唯一外鍵指向另一方的主鍵一般一對一的關係,我們會將數據整合在一個表中。

現在我們來完成一個旅遊的選擇說明問題:
內容:
旅遊路線分類:創建旅遊線路分類表 tab_category

– 創建旅遊線路分類表 tab_category
– cid 旅遊線路分類主鍵,自動增長
– cname 旅遊線路分類名稱非空,唯一,字符串 100
CREATE TABLE tab_category (
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(100) NOT NULL UNIQUE )

旅遊路線: 創建旅遊線路表 tab_route

– 創建旅遊線路表 tab_route
/* rid 旅遊線路主鍵,自動增長
rname 旅遊線路名稱非空,唯一,
字符串 100 price 價格 rdate 上架時間,
日期類型 cid 外鍵,
所屬分類
*/ CREATE TABLE tab_route(
rid INT PRIMARY KEY AUTO_INCREMENT,
rname VARCHAR(100) NOT NULL UNIQUE,
price DOUBLE,
rdate DATE, cid INT,
FOREIGN KEY (cid) REFERENCES tab_category(cid) – 省略寫法 在字表中先建立父表的列
然後使用外鍵去關聯父表的主鍵 )

用戶:創建用戶表 tab_user

/* 24 / 26 創建用戶表 tab_user
uid 用戶主鍵,
自增長 username 用戶名長度 100,
唯一,非空
password 密碼長度 30,非空
name 真實姓名長度 100
birthday 生日
sex 性別,定長字符串 1
telephone 手機號,
字符串 11 email 郵箱,
字符串長度 100
*/ CREATE TABLE tab_user (
uid INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100) UNIQUE NOT NULL,
PASSWORD VARCHAR(30) NOT NULL,
NAME VARCHAR(100),
birthday DATE,
sex CHAR(1) DEFAULT ‘男’,
telephone VARCHAR(11),
email VARCHAR(100)
)

存在多對多的的關係我們需要建立一張中間表:

/* 創建收藏表 tab_favorite
rid 旅遊線路 id,外鍵
date 收藏時間
uid 用戶 id,
外鍵 rid 和 uid不能重複,
設置複合主鍵,
同一個用戶不能收藏同一個線路兩次
*/ create table tab_favorite (
rid int,
date datetime,
uid int,
– 創建複合主鍵
primary key(rid,uid),
foreign key (rid) references tab_route(rid),
foreign key(uid) references tab_user(uid)
)

在這裏插入圖片描述

2.數據庫設計的範式(準則)

JDBC 編程

在這裏插入圖片描述
**面向對象:**將現實實物抽象爲我們的類,對現實實物的行爲抽象爲方法或接口:三大特徵:繼承,封裝,多態
封裝:基本概念,開閉原則(修改關閉,擴展開放)
繼承:單繼承,繼承父類的屬性和方法。共性:共有的屬性。個性:存在於子類中特有的
多態:運行時決定具體類型或方法,表現形式:動態綁定向上轉型,重載,重寫。
面向接口編程:
API
面向切面編程
對應動態代理,具體實現有多種
API公共的程序接口:
在Java JDBC編程中對數據庫的操作均使用JDK自帶的API統一處理,通常與特定數據庫的驅動類是完全
解耦的。所以掌握Java JDBC API (位於 java.sql 包下) 即可掌握Java數據庫編程。

  1. DriverManager類來獲取的Connection連接,是無法重複利用的,每次使用完以後釋放資源
    時,通過connection.close()都是關閉物理連接。使用Statement。
    在這裏插入圖片描述
package com.bit.util;
import java.math.BigDecimal;
import java.sql.*;
public class DBUtil {
    public static final String URL="jdbc:mysql://localhost:3306/test";
    public static final String USERNAME="root";
    public  static final String PASSWORD="123456";
    public static void main(String[] args)  {
        //加載JDBC驅動程序,調用初始化com.mysql.jdbc.Driver類將該類
        //加載到JVM方法去,並執行該類的靜態方法塊,靜態屬性
        Connection connection=null;
        Statement statement=null;
        ResultSet resultSet=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //創建數據庫連接
            connection = DriverManager.
                    getConnection(URL,USERNAME,PASSWORD);
            statement = connection.createStatement();
            String sql="select id,name,chinese,math,english from exam";
            resultSet= statement.executeQuery(sql);
            while (resultSet.next()){
                //K val 形式
                int id=resultSet.getInt("id");
                String name=resultSet.getString("name");
                BigDecimal chinese=resultSet.getBigDecimal("chinese");
                BigDecimal math=resultSet.getBigDecimal("math");
                BigDecimal english=resultSet.getBigDecimal("english");
                System.out.printf("id=%s,name=%s,chinese=%s,math=%s,english=%s"
                        ,id,name,chinese,math,english);
                System.out.println();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet!=null)
                    resultSet.close();
                if (statement!=null)
                    statement.close();
                if (connection!=null)
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
     }
    }
    }
}

  1. DataSource提供連接池的支持。連接池在初始化時將創建一定數量的數據庫連接,這些連接
    是可以複用的,每次使用完數據庫連接,釋放資源調用connection.close()都是將
    Conncetion連接對象回收。代碼使用PreparedStatement
    在這裏插入圖片描述
package com.bit.util;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.math.BigDecimal;
import java.sql.*;

public class DBUtil2 {
    public static final String URL="jdbc:mysql://localhost:3306/test";
    public static final String USERNAME="root";
    public  static final String PASSWORD="123456";
    public static void main(String[] args)  {
        //加載JDBC驅動程序,調用初始化com.mysql.jdbc.Driver類將該類
        //加載到JVM方法去,並執行該類的靜態方法塊,靜態屬性
        Connection connection=null;
        PreparedStatement statement=null;
        ResultSet resultSet=null;
        try {
            //獲取數據庫連接池,由連接池獲取連接
            DataSource ds=new MysqlDataSource();
            ((MysqlDataSource)ds).setURL(URL);
            ((MysqlDataSource)ds).setUser(USERNAME);
            ((MysqlDataSource)ds).setPassword(PASSWORD);
            connection =ds.getConnection();
            String sql="select id,name,chinese,math,english from exam where id=?";
            statement = connection.prepareStatement(sql);
            //我們使用statement.setInt()1,2表示的是第一個佔位符?,放入2,
            //語法使用過程中要在resultSet= statement.executeQuery(sql);中去掉sql
            statement.setInt(1, 2);
            resultSet= statement.executeQuery();
            while (resultSet.next()){
                //K val 形式
                int id=resultSet.getInt("id");
                String name=resultSet.getString("name");
                BigDecimal chinese=resultSet.getBigDecimal("chinese");
                BigDecimal math=resultSet.getBigDecimal("math");
                BigDecimal english=resultSet.getBigDecimal("english");
                System.out.printf("id=%s,name=%s,chinese=%s,math=%s,english=%s"
                        ,id,name,chinese,math,english);
                System.out.println();
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet!=null)
                    resultSet.close();
                if (statement!=null)
                    statement.close();
                if (connection!=null)
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
     }
    }
    }
}

在這裏插入圖片描述
PreparedStatement對象
在這裏插入圖片描述
在這裏插入圖片描述

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