進入MySQL資料庫的大門(學習筆記,有你就夠了)
一、初識資料庫
1、什麼是資料庫
資料庫叫database ,簡稱DB,是長期存放在計算機內,有組織、可共享的大量資料的集合;資料庫就是存放資料的倉庫,專業的資料庫系統具有較小的資料冗餘度,較高的資料安全性,易擴充套件性。
資料庫設計原則:
mysql主要優勢:一個應用對應一個數據庫
2、資料庫分類
關係型資料庫(保證資料的一致性,能建立關係) | 非關係型資料庫(放在不同的伺服器上) |
---|---|
MySQL(中小型企業免費) | MongoDB(文件儲存) |
Oracle(大型電商網站) | Redis(鍵值儲存) |
SQL Server(政府網站,大學教育) | Memcached(鍵值儲存) |
maradb(mysql開源版本的一個分支) | Hbase(列儲存) |
db2(銀行系統) | Neo4J(圖形) |
sybase(被淘汰) |
補充:ER關係圖
實體用 | 屬性 | 關係 |
---|---|---|
方框 | 橢圓 | 菱形 |
補充:伺服器
伺服器是一臺電腦,這臺電腦安裝了伺服器軟體,這些軟體會監聽不同的埠號,根據使用者訪問的埠號提供不同的服務
3、DBMS、DBS、DBA區別
- DBMS是資料庫管理系統,是一種系統軟體,包括資料庫和用於資料庫訪問管理的介面系統,通常將DBMS直接稱為資料庫,嚴格意義上說mysql屬於DBMS
- DBS是一個實際可執行的系統,由軟體、資料庫、資料庫管理員組成
- DBA資料庫管理員
4、MySQL簡介
-
概念
是現行的開源、免費的關係型資料庫
-
特點
- 執行速度快
- 使用成本低
- 容易使用
- 可移植性強
- 適用更多使用者
-
mysql語句分類
DDL DML DQL DCL 資料定義語言 資料操縱語言 資料查詢語言 :資料控制語言,定義訪問許可權、取消訪問許可權,安全設定 create、drop、alter ,insert、update、delete select grant
5、mysql的安裝、解除安裝及啟動mysql服務
-
安裝
- 執行安裝程式、在啟動配置教程以前,一路下一步直到finish
- 第一次finish之後啟動服務配置教程
- 第一個induce mysql bin dinctory to windows path
- 第二個埠號不要去修改,字符集要選擇utf-8,預設埠號:3306
-
解除安裝
- 開啟控制控制面板刪除軟體
- 刪除mysql安裝目錄的所有檔案
- 刪除mysql資料存放的檔案,C:\ProgramData\MySQL
-
啟動mysql服務方式
- 工作管理員開啟
- 命令列輸入:service(檢視本地服務)
- dos視窗輸命令:net start mysql
-
MysqlInsranceConfig:配置嚮導
- programDate:資料檔案的儲存路徑(預設是隱藏的,在C盤下)
- mysql的安裝目錄下的my.ini檔案:相應的一些配置,可配置編碼格式等
- mysql -uroot -paaaaa123 進入mysql
- show databases顯示所有的資料庫
- select version()顯示mysql版本號
二、DDL語句建立資料庫和資料表
1、連線資料庫(在dos視窗下)
-
cmd——以管理員身份執行
-
啟動mysql資料庫服務:net start mysql
-
登入mysql:mysql -uroot -paaaaa123(或者:mysql -hlocalhost -uroot -paaaaa123)注意-p以後不能有空格
-
exit退出mysql
-
show databases;(顯示資料庫,一定要加分號)
-
use mysql
-
show tables(顯示資料庫中的表)
-
sql語句select * from user\G;顯示user使用者列表
-
修改user使用者密碼:update user set password=password’(1234’ ) where user=‘root’;,flush privileges;重新整理下
-
?尋求幫助
-
檢視mysql所支援的引擎型別、表型別:SHOW ENGINES;
-
檢視預設引擎:SHOW VARIABLES LIKE ‘storage_engine’;
-
顯示變數:show variables like’auto%’
2、資料庫操作
-
建立資料庫
CREATE DATABASE [IF NOT EXISTS ]資料庫名;
-
刪除資料庫
DROP DATABASE [IF EXISTS] 資料庫名;
-
修改資料庫字符集
alter database 資料庫名 character set 字符集
-
檢視資料庫
- 檢視所有資料庫:show databases
- 檢視資料庫定義:show create databse 資料庫名
- 檢視當前正在使用的資料庫:select database()
-
選中資料庫
use 資料庫名
3、表結構操作
-
建立表
-
create table 表名(
列名 列的型別 列的約束,
列名 列的型別 列的約束
)【表型別】【表字符集】【表註釋】
-
程式碼示例:
#建立學生表,並設定表型別、字符集 CREATE TABLE `student` ( `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '主鍵、學號', `psd` VARCHAR(20) COLLATE utf8_estonian_ci NOT NULL DEFAULT '123456' COMMENT '密碼', `name` VARCHAR(30) COLLATE utf8_estonian_ci NOT NULL DEFAULT '匿名' COMMENT '學生姓名', `sex` VARCHAR(2) COLLATE utf8_estonian_ci NOT NULL DEFAULT '男' COMMENT '性別', `birsday` DATETIME DEFAULT NULL, `email` VARCHAR(20) COLLATE utf8_estonian_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci
-
-
註釋
欄位註釋: comment'註釋的內容' 表註釋:comment='註釋的內容'
-
列的約束
primary key 主鍵約束
unique : 唯一約束
not null 非空約束
-
注意事項
-
除了最後一個列不用逗號隔開,每一列都要逗號隔開
-
表名如果變藍了表明和資料庫有衝突,這時候要加上反引號·
-
字串型別的要用單引號引起來
-
有多個屬性的時候用空格隔開就好
-
commend後面加單引號註釋內容
-
#代表整個註釋
-
設定嚴格檢查模式
SET sql_mode='strict_trane_tables';
-
-
列型別
- 數值型
- tinyint:非常小的資料
- int:標準整數
- double:雙精度浮點數
- decimal【(M,D)】:字串形式浮點數,M表示總位數,D表示保留小數位數
- 字串型
- char:固定長度
- vachar:可變長度,括號內代表的是字元的個數
- text:文字串
- 日期和時間
- datetime:日期和時間,預設是null
- timestamp:常用於顯示當前時間,預設是當前日期和時間
- Null值
- 理解為沒有值或未知值
- 不要用null進行算術運算
- 數值型
-
表的型別
常見的MyISAM,InnoDB
名稱 MyISAM InnoDB 事務處理 no yes 外來鍵約束 no yes 資料行鎖定 no yes 全文索引 yes no 表空間大小 較小 較大 -
資料表的儲存位置
都位於C:\ProgramData\MySQL目錄下
MyISAM InnoDB 只有一個frm檔案 frm、wyd、myi三個檔案 -
資料欄位屬性
- unsigned:無符號,宣告該資料不允許為負數
- zerofill:0填充,不足位數用0填充,如int(3)5則為005
- auto_increment:自動增長,常用於設定主鍵,且為整數,定義起始值和步長:
- 定義起始值:auto_increment=100(建表時在右括號右邊寫,影響的是當前表,對整個資料庫的其他表沒有影響
- 定義自增步長:set auto_increment_ncrement=5,會對所有資料庫受影響
- null和not null :預設為null,若設定為not null則必須有值
- default:設定預設值
-
刪除表
drop table 表名
-
修改表
#修改表名 ALTER TABLE 表名 RENAME AS test1; #修改表的字符集 alter table 表名 character set 字符集 #新增列 ALTER TABLE 表名 ADD 列名 列型別 屬性 ; #修改列 alter table 表名 modify 列名 列型別 屬性 ; #修改列名 alter table 表名 change 舊列名 新列名 列型別 屬性 ; #刪除列 alter table 表名 dop 列名
-
查看錶
檢視當前資料庫所有的表名 show tables 查看錶的定義結構/建立語句 show create table 表名 查看錶的結構 desc 表名
4、儲存sql檔案以及開啟sql檔案
儲存Ctrl+s
新建查詢編輯器——在同一標籤中開啟檔案(在不同標籤中開啟)
對於影象聲音視訊用text、blob儲存資料
一般沒有必要直接儲存影象,而儲存的是路徑用字串
三、DML語句對錶中資料CRUD操作
1、主鍵&外來鍵
-
主鍵咋一個表裡面可有也可以沒有,
-
一個表裡面的外來鍵既可以有一個也可以有多個,
-
建立主外來鍵關係的有主鍵的表為主表,有外來鍵的表成為子表或者從表
-
能夠保證資料的完整性和 正確性
-
對於有主外來鍵關係的表,資料插入操作要有一定順序,先放主鍵資料,再放外來鍵資料 ,先刪除子表,再刪除主表
-
主鍵和外來鍵,列名可以不同,但是資料型別一定要相同
-
主鍵和外來鍵建立聯絡第一種方法在建表的時候就聯絡,關鍵詞是constraint,外來鍵名一般以FK開頭 foreign key代表外來鍵,引用主鍵用關鍵詞reference
-
主鍵&外來鍵相關的SQL語句
建立主鍵&外來鍵 1、建立此表的同時就建立外來鍵 主鍵:PRIMARY KEY可寫在列後面,也可以欄位都寫完了在最後一行寫明PRIMARY KEY(欄位名 ) 外來鍵:CONSTRAINT FR_gradeId FOREIGN KEY (要新增主鍵的欄位) REFERENCES 引用表(引用表中的哪個欄位)(FR_gradeId欄位名) 2、建立字表完畢後,修改子表增加外來鍵 ALTER TABLE 表名 ADD CONSTRAINT 外來鍵名 FOREIGN KEY (要新增主鍵的欄位) REFERENCES 引用表(引用表中的哪個欄位); 刪除外來鍵 ALTER TABLE 表名 DROP FOREIGN KEY 外來鍵名; (刪除了之所以還能看到外來鍵在表中,是因為外來鍵會默默的建立了一個索引,要想徹底刪除還要加上一句話刪除索引 ALTER TABLE 表名 DROP INDEX 外來鍵名; 刪除外來鍵要有兩句話才能徹底刪除)
2、插入資料
-
insert into 表名(列名1,列名2) values(值1,值2)
-
insert into 表名 values(值1,值2)
-
insert into 表名(列名1,列名2) values(值1,值2),(值1,值2)
批量插入資料
-
注意點:
- 批量插入比單條插入效率更高,但是更容易出現問題
- 插入全部列名可以省略,插入部分列的話就不能省略表名後面的列名。
- 有預設值的時候在values裡面可以寫預設值也可以寫default
- 如果不寫列名的情況下即使有些列可以為空,但是不能不寫要寫null,最好都寫上列名,如果外來鍵值超過了主表的主鍵數目,會報錯
3、刪除資料
- delete from 表名 【where條件】
- truncate table 表名
- delete 和 truncate 的區別
- delete 是DML語句 一條一條刪除表中資料
- truncate是DDL 先刪除表再重建表
- 關於哪條執行效率高,具體要看錶中的資料量,如果資料比較少,delete高效,資料多,則truncate效率高
- 當使用不帶where條件的delete from刪除資料時,自增當前數值依然從原來基礎上進行,會記錄日誌,不刪除表結構,但使用truncate table刪除表中全部資料的時候,自增當前數值不從原來基礎上進行,從原來自增初始值開始。如下例子:不會記錄日誌
- 兩種不同村粗引擎,在使用delete from刪除全部資料後,自增列初始值表現的不同:同樣使用delete from清空資料,重啟資料庫服務後,對於INNODB的表,自增列從初始值從新開始(比如開始預設初始值是1,那就從1再開始),而對於MYISAM型的表,自增序列從上一個自增資料基礎上開始,原因是:INNODB的資料是儲存在內容中的,重啟資料可服務後,之前的也就都沒有了,而MYISAM是儲存在檔案中,就算重啟,資料依然存在。
4、修改資料
- update 表名 set 列名=值【where條件】
四、DQL查詢語句
1、AS為欄位取別名
AS可省略
2、Dinstinct去重複項
select distinct 欄位名 from 表名
3、通用格式
select [distinct] [*] [列名1,列名2] from 表名 where 條件
group by...
having
order by
4、基礎查詢
#查詢資料用DQL語句
#1、核心查詢(*代表查詢所有列,效率比較低)
SELECT * FROM student;
#2、查詢指定列,查詢student的學號和姓名,在mysql中列名不區分大小寫
SELECT studentno,studentname FROM student;
#3、被查出的列取別名(給列取別名as可以省略)
SELECT studentno AS 學號,studentname AS 姓名 FROM student;
SELECT studentno 學號,studentname 姓名 FROM student;
#6、給表取取別名(給表取別名as可以省略),別名不會該表原表的列名,只是為了看的
SELECT studentno 學號,studentname 姓名 FROM student AS 學生表;
SELECT studentno 學號,studentname 姓名 FROM student 學生表;
#7、as為查詢結構(如函式)取一個新的名字
SELECT CONCAT('姓名:',studentName)AS 新姓名 FROM student;
#8、檢視那些同學參加了考試(學號),去除重複項,用關鍵字distinct,預設為all代表查詢所有行
SELECT DISTINCT studentno FROM result;
注意:distinct一定寫前面
SELECT DISTINCT NAME NAME,english FROM exam;
#9、select中可以出現表示式
SELECT @@auto_increment_increment;
SELECT VERSION();
SELECT 100*3-1 AS 計算結果
SELECT studentno,studentresult+1 AS 提分後 FROM result;
#10、滿足條件的查詢(where) 考試成績95-100
SELECT studentno,StudentResult
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;
5、模糊查詢
#13、精確查詢
SELECT studentno,StudentResult
FROM result
WHERE studentno=1000;
#15、查詢除了1000號這個學生,其他學生的考試成績!=
SELECT studentno,StudentResult
FROM result
WHERE studentno !=1000;
#16、或者用not和!=一樣
SELECT studentno,StudentResult
FROM result
WHERE NOT studentno =1000;
#17、模糊查詢between and/ like/in/null
#查詢姓李的同學的學號和姓名
#like及結合使用的萬用字元,%(0到任意一個字元) _(一個字元)
#查詢所有姓李的同學
SELECT studentno,StudentName
FROM student
WHERE StudentName LIKE '李%';
#查詢姓李的,名字是三個字的
SELECT studentno,StudentName
FROM student
WHERE StudentName LIKE '李__';
#查詢所有帶有“文字的”(不管開頭和結尾)常用
SELECT studentno,StudentName
FROM student
WHERE StudentName LIKE '%文%';
轉義字元%——\%
_——\_
如何不想用\作為轉義字元,可以自定義轉義字元,使用自己定義的轉衣服:escape ‘你定義的轉義符’但是%和_是不可以自行設計的
#模糊查詢之 in
SELECT studentName,studentNo FROM student
WHERE studentNo IN(1000,1001,1002,1003);
SELECT studentName,studentNo FROM student
WHERE Address IN('北京','南京');
#模糊查詢之 null
注意:只有是顯示null的才為空,對於空白什麼都沒有的並不是空null而是字串為空,如:
#查詢家庭住址沒有寫的同學
#1、錯誤用法
SELECT studentname FROM student
WHERE Address IS NULL;
#2、用空字串
SELECT studentname FROM student
WHERE Address='';
#3、一般這種型別的查詢用這種寫法
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;
#查詢出生日期沒有填寫的同學,=null是錯誤的,和null比較要用iis null
SELECT studentno FROM student
WHERE BornDate IS NULL;
#對於不是空的要用is not null
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;
6、分組查詢
#不同課程的平均分、最高分、最低分
SELECT subjectname, AVG(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
GROUP BY r.subjectno
#分組後再篩選執行的sql語句篩選
SELECT subjectname, AVG(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
GROUP BY r.subjectno
HAVING 平均分>80
ORDER BY 平均分 DESC
LIMIT 0,4
7、連線查詢
內連線 | 左連線 | 右連線 | 自連線 | 等值連線 | 非等值連線 |
---|---|---|---|---|---|
nner join | left join | right join | \ | \ | \ |
查詢兩個表結果集中的交集 | 以左表為基準,右邊表來一一匹配,匹配不上的返回左表記錄,右表以null填充 | 以右表為基準,右邊表來一一匹配,匹配不上的返回左表記錄,左表以null填充 | 自連線的表一定要取別名(AS)子欄目父欄目問題 | 和內連一樣,只是寫法不同 | 區別於等值連線,不加where |
等值連線:
SELECT s.StudentNo,StudentName,subjectno,StudentResult
FROM student s,result r
WHERE s.StudentNo = r.StudentNo;
#自連線程式碼
CREATE TABLE IF NOT EXISTS category(
categoryId INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '當前欄目',
pId INT(10) NOT NULL COMMENT '當前欄目的父欄目',
categoryName VARCHAR(50) NOT NULL,
PRIMARY KEY (categoryId)
)
INSERT INTO category
VALUES (2,1,'美術設計'),
(3,1,'軟體開發'),
(4,3,'資料庫基礎'),
(5,2,'ps基礎'),
(7,2,'色彩搭配'),
(8,3,'PHP基礎'),
(9,3,'java基礎');
SELECT * FROM category;
SELECT categoryName '知足上進' FROM category;
#將各個欄目的父子欄目顯示出來(父欄目名稱 子欄目名稱)
SELECT a.categoryName AS '主欄目',b.categoryName AS '子欄目'
FROM category AS a,category AS b;
WHERE a.categoryId=b.pId;
-
一定要先寫連線查詢再寫where
-
多重巢狀連線:
注意:inner join ,和from以及on後面都不能用,隔開,否則會報1064錯誤
#參加了參加了考試的同學(學號、學生姓名、科目名、分數) SELECT s.StudentNo,StudentName,subjectname,StudentResult FROM student AS s INNER JOIN result AS r ON s.StudentNo = r.StudentNo INNER JOIN `subject` AS sub ON r.SubjectNo=sub.SubjectNo;
8、排序
group by having
#查詢《資料庫結構—1》的所有考試的同學(學號、學生姓名、科目名、分數)
SELECT s.StudentNo,StudentName,subjectname,StudentResult
FROM student AS s
INNER JOIN result AS r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` AS sub
ON r.SubjectNo=sub.SubjectNo
WHERE SubjectName='資料庫結構-1'
ORDER BY StudentResult DESC,studentno DESC #1、預設升序asc 2、desc為降序
#常見錯誤:ORDER BY StudentResult ,studentno DESC 這時候StudentResult升序,studentno降序,desc是就近原則
9、分頁查詢
- limit 索引,頁容量
- 當前頁碼-1)*頁容量,頁容量
#分頁查詢
##查詢《資料庫結構—1》的所有考試的同學(學號、學生姓名、科目名、分數)
#每頁顯示五條資料出來
SELECT s.StudentNo,StudentName,subjectname,StudentResult
FROM student AS s
INNER JOIN result AS r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` AS sub
ON r.SubjectNo=sub.SubjectNo
WHERE SubjectName='資料庫結構-1'
ORDER BY StudentResult DESC,studentno DESC
#limit 0,5 #從哪條記錄開始起始行0,要顯示幾行
LIMIT 5,5 #第二頁
LIMIT 10,5 #第三頁 (等於linit 5 offset 0)
10、子查詢
- 定義:子查詢就是在查詢語句中的where條件子句中,又嵌套了另外一個select查詢語句
#子查詢
#分部寫簡單sql語句,然後去巢狀
SELECT studentno ,studentname FROM student WHERE studentno IN()
SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=()#1\2\3\4
SELECT subjectno FROM `subject` WHERE SubjectName='高等數學-2' #2
SELECT studentno, studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
SELECT subjectno FROM `subject` WHERE SubjectName='高等數學-2' ))
五、mysql函式
1、數學函式
ABS() | CEILING() | FLOOR() | RAND() | RAND() |
---|---|---|---|---|
絕對值 | 大於等於我的最小的整數 | 小於等於我的最大的整數 | 返回0-1之間的隨機數 | 每次生成固定的0-1之間的隨機數(以某個數作為種子) |
SELECT ABS(-8) ‘-8的絕對值’ | SELECT CEILING(9.8)=10 | SELECT FLOOR(9.8)=9 | \ | \ |
2、字串函式
#返回字串中包含的字元數
SELECT CHAR_LENGTH ( '好好學習資料庫')
#合併字串
SELECT CONCAT('我','愛')
#替換字串,從某個位置開始,替換某個長度,替換的內容
SELECT INSERT('我愛你婺源',1,3,'很愛')
SELECT INSERT('我愛你婺源',1,3,'很愛') #如果起始位置超過字串長度,則返回原長度
#變小寫
SELECT LOWER('I LOVE YOU')
#變大寫
SELECT UPPER('i love you')
#從左邊擷取指定長度的字串
SELECT LEFT('我愛你中國',3)
##從右邊擷取指定長度的字串
SELECT RIGHT('我愛你中國',3)
#替換字串(要替換的字串,要替換的文字,替換的內容)
SELECT REPLACE('中國歡迎你,你好','你','你們')
#擷取(從哪個位置開始擷取,擷取多長)
SELECT SUBSTRING('中國歡迎你,你好',1,2)
#反轉
SELECT REVERSE('中國歡迎你')
3、日期和時間函式
#獲得當前日期
SELECT CURRENT_DATE()
SELECT CURDATE()
#獲得當前日期和時間
SELECT NOW()
SELECT LOCALTIME()
SELECT SYSDATE()
#分別獲取日期中的某個部分
SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())
4、系統資訊的函式
SELECT VERSION()
SELECT USER()
5、聚合函式
#聚合函式:返回的是一個值,不要出現多個值
#count(欄位名) 是非空值的計數
count(*)返回所有列的統計
SELECT COUNT(StudentName) FROM student
SELECT COUNT(1) FROM student
#sum()求總和
SELECT SUM(StudentResult) AS 總分 FROM result
SELECT AVG(StudentResult) AS 平均分 FROM result
SELECT MAX(StudentResult) AS 最高分 FROM【】 result
SELECT MIN(StudentResult) AS 最低分 FROM result
count(*)儘量少用
六、MySql事務
1、事務定義
事務就是將一組sql語句放在同一批次內去執行,如果一個sql語句錯誤,則該批次的所有sql語句都將取消執行,最能理解的就是銀行轉賬
注意: mysql事務只支出innoDB和BDB資料表型別