如何通過MySQL進行數據庫基本操作

介紹

本文博客基於數據庫MySQL8.0.23,編譯器IntelliJ IDEA 2019.3.3,在IDEA中進行數據庫連接並進行SQL基本語句操作。

1.連接數據庫

首先打開IDEA工作界面,新建工程,打開數據庫Database,點擊DaTa Source進入數據庫連接界面,
首先打開IDEA工作界面,點擊database選擇來源中MySQL
輸入用戶名及密碼,測試連接成功後就點擊OK,就可以連接好數據庫了。
測試成功
在連接好圖後可以得到下圖的效果。SQL的數據庫在右邊可一一展示,也可以選擇只展示一部分。左半部分的空白部分,是編寫數據庫程序的地方,可以把cmd命令裏的指令操作給可視化操作。
在這裏插入圖片描述




2. 進行數據庫SQL編寫的基本語句

進入數據庫後,需要掌握 基本的SQL語句進行數據庫、表的建立和操作;也需要掌握查詢的基本方式;積累一些常用的SQL函數集合。 本模塊着重介紹這方面的基本內容,包括代碼即樣例。

創建數據庫,表以及更新數據的方法

(1)【創建/使用/刪除】【數據庫/表】

在學習掌握數據庫基本命令的過程中,創建/刪除 是最爲重要的命令。利用CREATE命令來創建數據庫和表。DROP命令刪除。USE 命令使用數據庫,實現數據庫間的切換。
比如說,我們要建立一個名字叫做 WNB 的數據庫,裏頭要有一個叫做 student的表格,表格裏分爲學號,姓名,年級號,性別,出生日期,家庭地址,郵箱。


-- 建立數據庫,把create替換爲drop即刪除數據庫
create database if not exists WNB;
use WNB #使用數據庫/表
create table if not exists student(
    `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '學號',
    `name` VARCHAR(30) NOT NULL COMMENT '姓名',
    `gradeid` INT(1) NOT NULL COMMENT '年級號',
    `sex` VARCHAR(2) NOT NULL COMMENT '性別',
    `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
    `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
    `email` VARCHAR(50) DEFAULT NULL COMMENT '郵箱',
    PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET=utf8 
-- 建立表,INNOBE是引擎,CHARSET是字體形式,一般這種配置顯示漢字比較好

(2)【更改】【數據庫/表】

更改數據庫、表的命令中,DESC 命令,顯示出表的結構信息,可以用來檢查修改情況。此外,在進行修改時:ALTER 是最爲重要的命令。利用RENAME AS命令來修改表名。MOTIFY/CHANGE命令都可以進行字段的修改,只不過Change命令只重命名字段,而Modify可以修改約束和字段類型。drop 命令刪除操作。

-- 顯示錶結構
DESC student;
-- 修改表
ALTER table student RENAME AS student1;
-- 添加字的字段
ALTER TABLE student ADD age INT(11);
-- 修改表的字段
ALTER TABLE student MODIFY age VARCHAR(11); -- 修改約束和字段類型
ALTER TABLE student CHANGE age age1 INT(1); -- 重命名字段
-- 刪除字段
ALTER TABLE student DROP age1;
-- 刪除表
DROP TABLE IF EXISTS student;

(3)【更改】【表信息】

更改數據庫、表的信息命令時,INSERT INTO 插入命令,是最爲重要的命令。格式爲INSERT INTO 標明 (字段1,字段2……)VALUES(對應字段1,對應字段2……),比如說我們插入三個數據,如下代碼操作即可。

UPDATE命令來設置數據,往往聯立WHERE命令進行條件的判斷。

DELETE命令和TRUNCATE 命令都可以對錶中數據進行刪除操作。只不過TRUNCATE 命令會清空數據表,讓計數器歸零。

可以訓練以下的代碼內容:

-- 插入操作:需要一一對應,需要以“;”結尾
INSERT INTO `student`(`id`,`name`,`gradeid`,`sex`,`birthday`,`address`,`email`) 
VALUES (1000,'張三',3,'男','2004-8-9','宿舍樓A101','[email protected]'),
       (1001,'李四',3,'女','2005-4-9','宿舍樓C101','[email protected]'),
       (1002,'王五',3,'男','1999-12-9','宿舍樓A201','[email protected]');
-- 更新數值操作
UPDATE `student` SET `name` = '趙六' WHERE id =1001; -- where表示條件判斷
-- 清空指定信息
DELETE FROM `student` WHERE id=1000;  -- 清空指定信息,但不會影響計數器
TRUNCATE `student`  -- 清空student表,計數器會歸零,不會影響事務

注意:可用同樣的方式可以自己創建result,subject等表內容,插入自己的數值結果。

查詢操作

(1)查詢【基本知識】和【命令】

查詢命令即SELECT ,是最爲重要的命令,也是數據庫操作中最爲重要的基礎內容。格式爲SELECT [某一(些)字段/*(表示全部)] FROM [表名];對於一些重複出現的信息,用DISTINCT命令進行去重,保留一個信息。

除了WHERE命令外,LIKE命令所支持的模糊查詢,也一樣應用廣泛,需要掌握。其中“%”表示字符數不限,一個“_”只能代表一個字符, 通過一一比對字符,來判定查詢結果。

可以進行如下的訓練操作。

-- 查詢全部學生
SELECT * FROM student;
-- 查詢指定字段
SELECT `id` AS 學號,`name` AS 姓名 FROM student;
-- 查詢全部成績,distinct去重,每個學號只顯示一條
SELECT DISTINCT `id` FROM result;
-- 查看版本
SELECT VERSION();
-- 考試成績+1分顯示
SELECT `id`,`mark`+1 AS '提分後' FROM result;
-- where選擇查詢
SELECT `id`,`subid`,`mark` FROM result
WHERE id !=1000;
-- Like模糊查詢
SELECT `id`,`name` FROM student
WHERE `name` LIKE '%牛%'; -- %表示N位數,一個“_”表示一個字母

(2)【聯合查詢】

聯合查詢是聯合多張表進行數據的查詢,是查詢的重點和難點,也是實現數據庫目標功能查詢的重要手段。 聯合查詢最主要分爲聯合交叉查詢、左、右聯表查詢三種形式。

JOIN ,是聯合查詢最爲標誌性的命令,前面通過搭配INNER、LEFT、RIGHT來實現查詢的分類。格式爲:SELECT [內容] FROM [表] AS [新的名稱1] [聯合方式] JOIN [表2] AS [新的名稱2] ON [新的名稱1].[某字段]= [新的名稱2].[某字段] 對於 ON 代表的是選擇條件,顯然兩個都會有相同字段的表,才能聯合起來一起查詢,爲避免兩個表中查詢的字段混疊,需要在SELECT中確定選擇查詢的是哪一張表的信息。 左右聯表查詢的返回值即爲哪個表的值,另一個表的更改,不會引起查詢結果的變換。

可以進行如下的訓練操作。

-- 聯合查詢
-- 格式:聯立subject表和result表,課程id號是聯合的媒介,
-- 注意書寫格式,對於媒介字段需要特別標明是選自哪個表的。
SELECT id,s.subid,subname,mark
FROM `subject` AS s
INNER JOIN result AS r
ON s.subid=r.subid

-- 左右聯表
-- 注意:與聯合查詢不同之處在於命令,左Left,右Right,
-- 左聯表查詢會從左表返回所有值即使右表沒有匹配,
-- 右聯表同理,左右聯表和聯合查詢可以同時使用。
SELECT id,s.subid,subname,mark
FROM `subject` AS s
LEFT JOIN result AS r
ON s.subid=r.subid
-- 注意:由於是左聯表查詢,返回左表的值即subject,如果
-- result表裏內容發生改變,得到的結果不會出現右表的改變。

(3)【分頁和排序】

排序和分頁都位於Where命令之後,而排序位置靠前分頁位置。
排序的命令格式: order by [方式],其中方式填asc爲升序;desc降序
分頁的命令格式: limit 起始值,頁面的大小1

可以進行如下的訓練操作:比如在subject表裏,建立了一門名叫數據庫的課程。要求查詢《數據庫》課程成績排名前5的學生信息,並且要求學生該門課程的分數要大於90。 容易知道,需要聯合查詢科目、成績以及學生三張表,課程號和學號是連接三張表的紐帶。由於成績排名,並且要取出前5名,所以需要考慮排序和分頁。

-- 執行命令:
SELECT s.id,`name`,`subname`,mark
FROM `student` s
         INNER JOIN `result` r
                    ON s.id=r.id
         INNER JOIN `subject` sub
                    ON sub.subid=r.subid
WHERE subname='數據庫' AND mark>=90 -- mark是分數字段,可自己設置
ORDER BY mark DESC
LIMIT 0,5

mysql常用函數表

MySQL官網提供非常多的內置函數信息,以下整理的這些函數,對於一般的數據庫操作是十非常有用的,所以還請各位收藏保留這部分內容,最好能熟練應用,可事半功倍。

下面是一些內置函數應用練習:

--1)基本函數
-- 數學運算
SELECT ABS(-8) -- 絕對值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4)  -- 向下取整
SELECT RAND() -- 返回隨機數
SELECT SIGN(10) -- 判斷一個數的符號 0-0,負數-1,正數1
-- 字符串函數
SELECT CHAR_LENGTH('Hello world!') -- 字符串長度
SELECT CONCAT('Hello',' world','!') -- 拼接字符
SELECT INSERT('我愛美食世界',1,2,'超級熱愛') -- 查詢,
-- 從某個位置開始代替某個長度,本例子是從“我”字符開始替換,2個字節長度,
-- 即把“我愛”替換成“超級喜歡”
SELECT UPPER('wangshen') -- 大寫字母
SELECT LOWER('WANGSHEN') -- 小寫字母
SELECT INSTR('Wangshen','n') -- 返回第一次出現子串的索引
SELECT REPLACE('A說你很厲害','你','他')  -- 替換出現的指定字符串,你換成他
SELECT SUBSTR('AB說他可是特別牛逼',4,6) -- 返回指定的字符子串(源字符串,截取位置,長度)截取出來“他可是特別牛”
SELECT REVERSE('貓喫魚') -- 反轉,得到魚喫貓的結果
-- 查詢姓 王-->李的同學
SELECT DISTINCT REPLACE(`name`,'王','李') FROM student
WHERE `name` LIKE '王%'
-- 獲取時間
SELECT NOW() -- 獲取當下時間
SELECT CURDATE() -- 獲取當前日期,等同於 SELECT CURRENT_DATE(); SELECT LOCALTIME() -- 獲取本地時間;SELECT SYSDATE(); -- 獲取系統時間
SELECT DAY(NOW()) -- 獲取當下天數
--2)聚合函數
聚合函數用途非常廣泛,最常用的來說,分爲count,sum,avg,max,min五種。
用法:
SELECT COUNT(*) FROM student; -- 不會忽略NULL
SELECT COUNT(id) FROM student; -- 會忽略NULL值
SELECT COUNT(1) FROM student; -- 本質計算行數
SELECT SUM(`mark`) AS 總和 FROM result
SELECT AVG(`mark`) AS 平均分 FROM result
SELECT MAX(`mark`) AS 最高分 FROM result
SELECT MIN(`mark`) AS 最低分 FROM result
-- 獲取成績單中成績信息

補充

下面是一道練習查詢不同學生指定幾門科目的科目成績,並求總和按高低排序的代碼練習。
【題目練習】有學生表student(學號id,姓名name;至少5名學生數據),科目表subject(科目號subid,科目名subname;3門課程),成績表result1(學號id,課程號subid,成績mark),利用SQL語言,實現如下查找功能:列出學生學號,姓名,對應《A科》,《B科》,《C科》三門課程的單科成績,以及總成績、平均成績,並按照平均成績進行高低排名。
【參考代碼】

SELECT a1.id '學號', d.`name` '姓名',a1.mark 'A',a2.mark 'B',a3.mark 'C',b.sumscore '總成績',c.avgscore '平均分'
FROM
    ( SELECT r.id, r.mark FROM result1 r WHERE r.subid = 20200001 ) a1
        LEFT JOIN ( SELECT r.id, r.mark FROM result1 r WHERE r.subid = 20200002 ) a2 ON a1.id = a2.id
        LEFT JOIN ( SELECT r.id, r.mark FROM result1 r WHERE r.subid = 20200003 ) a3 ON a3.id = a2.id
        LEFT JOIN ( SELECT r.id, SUM( r.mark ) sumscore FROM result1 r GROUP BY r.id ) b ON a3.id = b.id
        LEFT JOIN ( SELECT r.id,CAST(AVG( mark ) AS DECIMAL ( 10, 2 )) avgscore FROM result1 r
                    GROUP BY r.id) c ON c.id = b.id
        LEFT JOIN ( SELECT s.id, s.name FROM student s GROUP BY s.id ) d ON c.id = d.id
ORDER BY b.sumscore DESC



  1. limit 起始值,頁面的大小[其中:第N頁 limit (n-1)* pagesieze, pagesize]。分頁的作用,是緩解數據庫壓力,瀑布流,給人更好的體驗 ↩︎

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