? ? ? ?
目錄
一.?數據庫(DataBase)
? ? ?1.定義:
? ? ?2. 常見的數據庫產品:
? ? ?3.?MySQL數據庫
? ? ? ? (1). 介紹 :
? ? ? ? (2). cmd命令行方式連接 MySQL
? ? ? ? (3).?MySQL的常用命令
二. MySQL數據庫 環境安裝及配置
三.?SQL
? ? ? 1.定義 :?
? ? ??2. DDL
? ? ?(1)數據庫
? ? ?(2)數據表
? ? ? ?1. 字段(列)和記錄(行)
? ? ? ?2. 表特征
? ? ? ?3. 數據類型
? ? ?? 4. 創建 刪除 修改 表數據
? ??? ?5. 約束和其他
? ? 3.DML
? ??4. DQL
(1). 基礎查詢
(2). 函數處理
? ? ? ??1.單行函數:
a. 字符函數?
b. 邏輯處理
c.??數學函數
d. 日期函數
2.分組函數:
(3). 條件查詢
(4). 查詢合并
(5). 查詢排序
(6). 數量限制
? ? ? ?在程序開發時,為了解決數據存儲問題,我們使用專業的數據存儲軟件(數據庫軟件)進行存儲,
數據庫軟件專門提供了一種編程語言 來管理數據庫中的數據? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
一.?數據庫(DataBase)
? ? ?1.定義:
? ? ?為了方便數據的存儲和管理,將數據按照特定的規則存儲在磁盤上,是一個存儲和管理數據的倉庫
? ? ?2. 常見的數據庫產品:
? ? ?3.?MySQL數據庫
? ? ? ? ?(1). 介紹 :
? ? ? ? ? ?MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB公司開發 , 現被 Oracle公司收購 MySQL數據庫服務器具有快速?? 可靠和易于使用的特點 且 使用標準的sql語言?, 并且支持多種操作系統,支持多種語言連接.?具有商業版(收費 受維護)與社區版(免費 不受維護)
? ? ? ? (2). cmd命令行方式連接 MySQL
? ? ? ? ? ? ?登錄:mysql [-h127.0.0.1 -P3306](本機可省略) -uroot -p密碼
? ? ? ? ? ? ?-h:主機名? ? -P:端口號? ? -u:用戶名? ? ?-p:密碼? ? ?退出:exit
? ? ? ? (3).?MySQL的常用命令
? ? ? ? ? ? ? 查看當前所有的數據庫:show databases;
? ? ? ? ? ? ? 選擇指定的庫:use 庫名
? ? ? ? ? ? ? 查看當前的所有表:show tables;
? ? ? ? ? ? ? 查看其他庫的所有表:show tables from 庫名;
? ? ? ? ? ? ? 查看mysql版本:? ??select version()
? ? ? ?
二. MySQL數據庫 環境安裝及配置
? ? ? ?1. 下載數據庫地址
https://dev.mysql.com/downloads/mysql/
? ? ? ?2. 下載到指定目錄
? ? ? ? ? ?一般下載到?development?中
? ? ? ?3. 配置環境變量
? ? ? ? ? ?復制mysql安裝包下的bin目錄地址(?D:\development\mysql-8.0.22-winx64\bin )??
? ?此電腦右擊---屬性---高級系統設置---環境變量---Path---編輯---新建---粘貼bin目錄地址---確定
4. 初始化MySQL
在管理員命令提示符中輸入
mysqld ?--initialize-insecure
5. 安裝MySQL服務
? ?cmd輸入指令:
mysqld install
6. 啟動MySQL服務
? ?cmd輸入指令:
net start mysql
7.?為root賬號設置密碼
? ?cmd輸入指令:
mysql -uroot -p
?注意 : 初次設置?默認密碼為空?, 直接回車就行?
? ?cmd輸入指令:
alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
注意 : (1) 此處設置的密碼為?root , 可以自愿更改
? ? ? ? ? (2) 由于在cmd命令行中進行數據庫編寫不方便,我們可以安裝可視化的客戶端工具
? ? ? ? ? ? ? ?(以SQLyog為例,詳細的下載流程可以參考其他大佬的博客)
? ? ? ? ? (3) 如果下載時出現問題,有可能是因為電腦系統中缺少東西,需要下載下面軟件? (自行下載)
? ? ? ? ?(4)如果啟動時出現問題,可能是由于MySQL沒有啟動 按照下列方式啟動
三.?SQL
? ? ? 1.定義 :?
? ? ? ? 結構化查詢語言SQL(Structured Query Language) ,?是一種數據庫程序設計語言,用于存取數據以及查詢、更新和管理關系數據庫系統. 幾乎所有關系型數據庫都支持SQL , 簡單易學,靈活使用可以進行復雜和高級的數據庫操作
? ? ??2. DDL
? ? ??數據(結構)定義語言DDL(Data Definition Language) :?用于創建和修改數據庫表結構的語言
? ? ? 常用的語句:create , alter , drop , rename
? ? ?(1)數據庫
? ? ? ? ?創建數據庫并設置編碼格式
? ? ? ? ?CREATE DATABASE [if not exists] 數據庫名 [ CHARSET utf8]
? ? ? ? ?刪除數據庫
? ? ? ? ?DROP DATABASE 數據庫名 / [IF EXISTS數據庫名];
? ? ? ? ?修改字符集
? ? ? ? ?ALTER DATABASE 數據庫名 CHARSET gbk;
-- 創建數據庫
create database if not exists schooldb charset utf8
-- 刪除數據庫
drop database schooldb
-- 修改數據庫字符編碼
alter database schooldb charset utf8
-- 注意:MySQL數據庫名字創建后不支持修改
? ? ? ?(2)數據表
? ? ? ? ?表(table) : 構成關系型數據庫的基本元素 , 是由行和列組成 .
? ? ? ? 1. 字段(列)和記錄(行)
? ? ? ? ? ? 字段 : 是表里的一列(column),用于保存每條記錄的特定信息。
? ? ? ? ? ? 例如 : 學生表的字段包括? 學號, 姓名, 性別, 生日 , 電話 , 身高, 注冊時間等
? ? ? ? ? ? 記錄 : 是表里的一行(row)數據?
? ? ? ?2. 表特征
? ? ? ? ? 表名----表中的字段(列)----字段的數據類型和長度----約束
? ? ? ?3. 數據類型
? 4. 創建 刪除 修改 表數據
-- 創建數據表student(表名)
create table student(
num int,
name varchar(8),
gender char(1),
phone char(11),
birthday date,
height decimal(3,2),
regtime datetime
)-- 刪除數據表
drop table student-- 修改數據表名
rename table student to stu
? ?5. 約束和其他
? ? ? ?約束: 主鍵約束----唯一約束----非空約束----檢查約束----外鍵約束
? ? ? ?主鍵約束:? primary key? 一個表中只能有一個主鍵約束 , 不能為空 , 不能重復
? ? ? ?唯一約束:? unique
? ? ? ?非空約束:? not null
? ? ? ?檢查約束: 值需要滿足設置的條件
? ? ? ?外鍵約束:
? ? ? ?其他:?
? ? ? ?默認值:? default'男'
? ? ? ?字段注釋:??comment'學號'
? ? ? ?自動增長:? auto_increment? (只有整數類型可以自動增長)
-- 創建添加約束的表
create table student(
id int primary key auto_increment ,
num int comment'學號',
name varchar(8) not null,
gender char(1) default'男',
phone char(11) unique not null,
birthday date,
height decimal(3,2) check(height<2.55),
regtime datetime not null
)
? ?3.DML
? ? ? ?數據操縱語言DML(Data Manipulation Language) 常用語句: insert , delete , update
-- DML 數據操縱語言-- insert
-- 方式1: INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2…..,值n);
INSERT INTO student(num,NAME,gender,phone,birthday,height,regtime)VALUE(100,'張三',"男",'152222222','2005-03-05',1.88,NOW())
-- 方式2: INSERT INTO 表名 set 列名1=值1,..列名n=值n;
INSERT INTO student SET num=101,NAME='李四',gender='女',phone='1522222223',regtime=NOW()
-- 方式3(批量插入): INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2…..,值n),(值1,值2…..,值n);
INSERT INTO student(num,NAME,phone,regtime)VALUES(102,'jim','11111',NOW()),(103,'tom','222',NOW()),(104,'jery','3333',NOW())-- delete
DELETE FROM student WHERE id = 8
DELETE FROM student -- update
UPDATE student SET birthday='2008-8-8',height=1.89 -- 這是沒有條件的修改,沒有條件會修改表中所有數據
UPDATE student SET birthday='2008-9-8',height=1.79 WHERE id=8 -- 這是有條件的修改
4. DQL
? ? DQL(Data Query Language)數據查詢語言?, 可以從單個表中查詢數據,也可以從多個表中查詢
? ? 注意:?查詢語句是不會影響數據庫中的數據的,查詢的結果是臨時備份
? ? 基本語法結構?:???selet? 要查詢的列? from ?表名 ?where? 條件 ? 排序 ?分組 ?數量限制...
? ?(1). 基礎查詢
? ? ? ? 查詢指定列 所有列 和?? ?設置別名---as
-- 基礎查詢
SELECT num,NAME,gender FROM student
-- 條件查詢
SELECT num,NAME,gender FROM student WHERE gender = '男'
-- 查詢所有列的數據
SELECT * FROM student WHERE gender = '男'
-- as 別名
SELECT num,NAME AS na FROM student
(2). 函數處理
? ? ? 1.單行函數:
? ? ? ? ?函數會對每行查詢的數據進行處理? (注意: sql + - * /?只能用作算術運算)??
? ? ? ? a. 字符函數?
-- 字符函數-- length(列名) 返回字節長度,一個中文占3個字節,英文字符一個占一個字節
-- CHAR_LENGTH(列名) 返回字符長度
SELECT NAME,LENGTH(NAME)AS nl,CHAR_LENGTH(NAME)AS nll FROM student-- concat(....) 連接多個字符串
SELECT CONCAT(num,':',NAME)AS NAME FROM student-- UPPER(NAME)轉大寫 , LOWER(NAME)轉小寫
SELECT UPPER(NAME),LOWER(NAME) FROM student-- substring(列,開始的位置,截取長度) 注意開始的位置從1開始SELECT SUBSTRING(NAME,1,1) FROM student-- trim(列) 默認是取出前后的空格
SELECT NAME,CHAR_LENGTH(TRIM(NAME)) FROM student -- TRIM('#' FROM NAME) 去掉前后指定的子串
SELECT TRIM('#' FROM NAME)FROM student -- replace(列,old,new)
SELECT REPLACE(NAME,'i','I')FROM student
? ? ? ? b. 邏輯處理
? ? ? ? ?case when 條件 then 條件成立執行 else 條件不成立 end ?(注意:可以有多個when)
-- 邏輯處理
-- case when 條件 then 條件成立執行 else 條件不成立 end (注意:可以有多個when)
SELECT num,NAME,(CASE WHEN height>=1.80 THEN '高個子' ELSE '非高個子' END)AS heightFROM studentSELECT num,NAME,(CASE WHEN height>=1.80 THEN '高個子'WHEN height>=1.60 THEN '正常' ELSE '低個子' END)AS heightFROM student-- ifnull(列,'默認值') 檢測指定列的值是否為空,如果為空顯示默認值
SELECT num,NAME,IFNULL(birthday,'暫未錄入信息')AS birthday FROM student-- if(條件,結果1,結果2)
SELECT num,NAME,IF(height>=1.80,'高個子','非高個子')AS height FROM student
? ? ? c.??數學函數
? ? ? ? ? round(數值):四舍五入 ?返回整數
? ? ? ? ? ceil(數值):向上取整,返回>=該參數的最小整數
? ? ? ? ? floor(數值):向下取整,返回<=該參數的最大整數
? ? ? ? ? truncate(數值,保留小數的位數):截斷,小數點后截斷到幾位 ,不會進行四舍五入
? ? ? ? ? mod(被除數,除數):取余,被除數為正,則為正;被除數為負,則為負
-- 數學函數
SELECT num,NAME,ROUND(height),TRUNCATE(height,1) FROM student
? ? ?d. 日期函數
? ? ? ? now(): 返回當前系統時間(年月日時分秒)
? ? ? ??curdate(): 返回當前系統日期(年月日)
? ? ? ? date_format(日期列,格式): 將日期轉換為指定格式
? ? ? ? datediff(big,small): 返回兩個日期相差的天數
-- now():返回當前系統時間(年月日時分秒)
-- curdate():返回當前系統日期(年月日)
SELECT num,NAME,NOW(),CURDATE() FROM student-- date_format(日期列,格式):將日期轉換為指定格式
SELECT num,NAME,DATE_FORMAT(birthday,'%Y') FROM student
SELECT num,NAME FROM student WHERE DATE_FORMAT(birthday,'%Y-%m') = '2005-03'-- datediff(big,small):返回兩個日期相差的天數
SELECT num,NAME,DATEDIFF(CURDATE(),birthday) FROM student
select datediff(curdate(),'2025-03-20') from student
? 日期格式:
2.分組函數:
? ?用作統計使用,又稱為聚合函數或統計函數?.
? ?多行查詢完之后,變為一行結果 . 分組函數一般和group by語句組合使用 ,?分組統計
? ?常用函數 : sum()? ?avg()? ?max()? ?min()? ?count()
-- sum(列,只能對數值類型求和)
SELECT SUM(height) FROM student-- avg(列) 求平均值
SELECT AVG(height) FROM student-- max(列) 返回該列中最大值 min(列) 返回該列最小值
SELECT MAX(height),MIN(height) FROM student-- count(列) 統計該列總數 值如果為null,不計算
SELECT COUNT(birthday) FROM student-- 如果統計所有的數據,一般用主鍵列, *
SELECT COUNT(*) FROM student
SELECT COUNT(id) FROM student
-- 查詢出學生中身高最高的學信息
SELECT num,NAME FROM student WHERE height = (SELECT MAX(height) FROM student)-- 查詢身高大于平均身高的學生
SELECT num,NAME FROM student WHERE height > (SELECT AVG(height) FROM student)
?(3). 條件查詢
2.常用方法:?
? ? ?a. 比較 : = , !=? , > , < , >= , <=? ? ?(between and 兩者之間,包含臨界值)
? ? ?b. 邏輯運算 : and與----or或-----?not非
-- and 并且 與
SELECT * FROM student WHERE gender = '男' AND height>=1.80
-- or 或
SELECT * FROM student WHERE gender = '男' OR height>=1.80
SELECT * FROM student WHERE num=101 OR num =103 OR num = 105 SELECT * FROM student WHERE height>=1.70 AND height <=2.0
SELECT * FROM student WHERE height>1.70 AND height <2.0-- 在兩個值之間, 包含邊界值
SELECT * FROM student WHERE height BETWEEN 1.70 AND 2.0
? ? c.模糊查詢
? ? ? 模糊查詢 ?like '張%' 以張開頭,向右匹配任意位字符??
-- 模糊查詢 like '張%' 以張開頭,向右匹配任意位字符
SELECT * FROM student WHERE NAME LIKE '張%'
SELECT * FROM student WHERE NAME LIKE '%豐%'
? ? ?in 判斷某字段的值是否屬于in列表中的某一項
? ? ?not in判斷某字段的值是否不屬于in列表中的某一項
? ? ?IS NULL(為空的)
? ? ?IS NOT NULL(不為空的)
-- in 在給定的數據集中的
SELECT * FROM student WHERE num IN(101,103,105)
SELECT * FROM student WHERE num=101 OR num =103 OR num = 105 -- not in 不在給定的數據集中的
SELECT * FROM student WHERE num NOT IN(101,103,105)-- is null 為空的
SELECT * FROM student WHERE birthday IS NULL-- is not null 不為空的
SELECT * FROM student WHERE birthday IS NOT NULL
(4). 查詢合并
? ?UNION ,UNION ALL 合并多個查詢的結果,?合并時,多條sql列的數量和類型需要一致
-- union 合并時,可以去除多條語句查詢出的重復數據
SELECT num,NAME,gender FROM student UNION
SELECT num,NAME,height FROM student WHERE gender = '女'-- UNION ALL 只是簡單的合并,不能去除重復數據
SELECT num,NAME,gender FROM student UNION ALL
SELECT num,NAME,gender FROM student WHERE gender = '女'
(5). 查詢排序
? ? ? order by 列名 asc(升序) / desc(降序)
-- 排序 order by 列名 asc(升序)/desc(降序)
SELECT * FROM student WHERE num>1 ORDER BY height ASCSELECT * FROM student ORDER BY height ASCSELECT * FROM student ORDER BY regtime DESCSELECT * FROM student ORDER BY height DESC,regtime ASC
(6). 數量限制
-- 數量限制 limit 開始的位置,每次查詢的數量
SELECT * FROM student WHERE num>1 ORDER BY id ASC LIMIT 0,2 -- 第一頁SELECT * FROM student WHERE num>1 LIMIT 2,2 -- 第二頁SELECT * FROM student LIMIT 4,2 -- 第三頁-- mysql分頁公式 limit (n-1)*每頁大小,每頁大小
(7)分組查詢
? ? group by 分組的列 , 用哪個列作為分組條件, 會把該列中相同的數據分到一組處理
? ? where 是對原始表中的數據進行篩選 , 而 HAVING 是對分組后的結果進行篩選 ?
-- 分組查詢
-- 統計男女人數 統計出男生各有多少人
-- group by 分組的列 , 用哪個列作為分組條件, 會把該列中相同的數據分到一組處理SELECT gender,COUNT(*) FROM student WHERE num>1 GROUP BY gender-- 統計姓名重復的學生 只顯示重復的數據-- where 是對原始表中的數據進行篩選-- HAVING 是對分組后的結果進行篩選 SELECT NAME,COUNT(*)AS c FROM student WHERE num>1 GROUP BY NAME HAVING c>1SELECT NAME,COUNT(*)AS c FROM student WHERE num>1 GROUP BY NAME HAVING c=1