數據庫:數據按一定的格式存放的倉庫。
端口:0-65535
一、為什么學習數據庫?
1、偽類方便查詢數據;
2、為了持久化保存數據。
二、數據庫相關概念:
1、DB(DataBase):數據庫;保存數據的容器。
2、DBMS:數據庫管理系統或者數據庫管理產品。常見的數據庫管理系統:MySQL、ORACAL、DB2、sql server
3、SQL:結構化查詢語句。
三、數據庫存儲數據的特點:
1、表是存放在庫里的;
2、數據是存放在表里的;
3、一個數據庫里面表名是惟一的;
4、數據庫里面列名稱之為字段;
5、表中數據是以行的形式存放。
四、MySQL服務的啟動和停止:
計算機(右鍵)-管理-服務-找到MySQL56-可以啟動和停止
五、MySQL服務的登錄和退出:
登錄:
MySQL -U root -p
退出:
quit或exit;
六、MySQL的語法規范和常見命令:
語法規范:
1、關鍵字大寫,表名、字段名小寫;
2、MySQL支持關鍵字小寫;
常見命令:
查詢數據庫: show databases;
指定操作數據庫: use 數據庫名;
查看數據庫中有哪些表: show tables;
查看表結構:desc表名;
查看表數據庫:select * from 表名;
七、DDL語言(數據定義語言)
庫和表的管理:
創建數據庫:create database 庫名;
刪除數據庫:drop database 庫名;
創建表:注意:要建表,需要先用 use 數據庫
創建表:create table 表名(
字段名 數據庫類型;
字段名 數據庫類型;
字段名 數據庫類型;
);
刪除表:drop table 表名;
八、MySQL修改表:
1、修改表名:rename
alter table 舊表名 rename 新表名;
2、修改字段的數據類型:MODIFY
alter table 表名 MODIFY 字段名 字段類型;
3、修改字段名:change
alter table 表名 change 舊字段名 新字段名 新數據類型;
4、添加字段:add first after
alter table 表名 add 字段名 first;
alter table 表名 add 字段名 字段類型 after 表中字段名;
eg:將字段firstname 添加到age字段之后
alter table student add firstname varchar(5) after age;
將firstname添加到第一列
alter table student add firstname varchar(5) first;
5、刪除字段:drop
alter table 表名 drop 字段名;
DML語言(數據操縱語言)
刪除語句:
刪除其中某一行數據:delelte from 表名 where name='字段名';
同時刪除多行數據:delelte from 表名 where name in ('字段名','字段名');
插入語句:
不指定字段插入:insert into 表名 values (字段數據,用逗號隔開);
eg:insert into 表名 values (1,'lsii',56,'13512345678');
指定字段插入:insert into 表名 (字段名) values (字段數據,用逗號隔開);
eg:insert into student (name,age,stuphone) values ('lsii',56,'13512345678');
同時插入多行數據:insert into 表名 values (字段數據),(字段數據)...,注意:字段數據間加括號用逗號隔開。
eg:insert into student values
(2,'wangwu',46,'13612345678'),
(3,'sadfsa',34,'13412345678');
修改語句:update 表名 set 要修改的字段=數據 where 表中要修改的行其他字段=值;
多個字段同時修改值的時候用逗號隔開,update student set id = 4,name='augus' where age=56;
三大范式:
設計表的時候的規范
https://www.cnblogs.com/auguse/articles/11935686.html
常見約束:
1、主鍵:primary key
作用:DBMS為了方便查找數據庫設計的規則。
特點:(1)一張表里主鍵唯一的;
(2)主鍵可以用來唯一的標識一行數據,主鍵不能為空。
2、聯合主鍵:表中字段不能作為唯一標識每一行數據時,選取表中兩個或多個字段作為聯合主鍵。
特點:如果去掉聯合主鍵某個字段,剩下的字段任然可以構成聯合主鍵,那么說明之前的聯合主鍵是錯誤的。
在修改表時添加主鍵:alter table 表名 add primary key(字段名);
eg: alter table user add primary key(id);
刪除主鍵:alter table 表名 drop primary key;
創建表的時候設置主鍵:
方式一:create table 表名(
-> 字段名 字段類型 primary key,
-> 字段名 字段類型,
-> );
方式二:create table 表名(
-> 字段名 字段類型,
-> 字段名 字段類型,
-> ......,
-> primary key(字段名)
-> );
創建聯合主鍵:create table 表名(
-> 字段名 字段類型,
-> 字段名 字段類型,
-> ......,
-> primary key(字段名,字段名)
-> );
主鍵自增 AUTO_INCREMENT
通過auto_increment設置主鍵自增
特點:
1、和主鍵配合使用;
2、自增字段的數據類型是整數類型;
3、自增數據初始值為1,每自增一行數據,自加1;
添加自增:create table 表名(
-> 字段名 字段類型 primary key AUTO_INCREMENT,
-> 字段名 字段類型,
-> 字段名 字段類型,
-> 字段名 字段類型,
-> );
添加自增默認值:create table 表名(
-> 字段名 字段類型 primary key AUTO_INCREMENT,
-> 字段名 字段類型,
-> 字段名 字段類型,
-> 字段名 字段類型,
-> )AUTO_INCREMENT=值;
刪除自增:alter table 表名 modify 字段名 字段類型 AUTO_INCREMENT;
修改表時添加主鍵自增:alter table 表名 change column 舊字段名 新字段名 字段類型 AUTO_INCREMENT;
修改表時指定初始值:alter table 表名 AUTO_INCREMENT=值;
MySQL5.6中文支持問題 DEFAULT CHARSET=GB2312;
查看創建表的sql語句:show create table 表名;
外鍵FOREIGN KEY() REFERENCES tb_dept1(id)
表間關系: 一對一
一對多
多對多
外鍵特點:外鍵關聯時主表要先於從表創建;
外鍵字段的值必然在主表是一一對應的;
外鍵可以為空,但是不為空的外鍵必然可以在主表中創建外鍵關系:
CREATE TABLE stu_t (
id INT (5) PRIMARY KEY AUTO_INCREMENT,
sid INT (5),
NAME VARCHAR (10),
SUBJECT VARCHAR (15),
achievement VARCHAR (11),
CONSTRAINT fk_sid
FOREIGN KEY (sid) REFERENCES stu (id)
);ENGINE=InnoDB DEFAULT CHARSET=GB2312;
刪除外鍵約束:
alter table 表名 drop FOREIGN KEY 外鍵名;
修改表時添加外鍵約束:
alter table 表名 add CONSTRAINT 外鍵名 FOREIGN KEY(sid) REFERENCES studentinfo(id)
唯一約束UNIQUE
特點:主鍵在一個表里只能有一個,但是唯一性約束可以多個;
設置了唯一性約束的字段,表中有且只能有一個空值;
創建表時設置唯一性約束:
create table 表名(
-> 字段名 字段類型 primary key,
-> 字段名 字段類型 unique,
-> 字段名 字段類型,
-> 字段名 字段類型,
-> );
修改表時添加唯一性約束:
alter table 表名 add unique(name);
起別名:
alter table 表名 add CONSTRAINT 別名 unique(字段);
刪除唯一性約束:
alter table 表名 drop index name;
默認值DEFAULT 'Beijing'
特點:
在插入數據時,如果不寫入就使用默認值,如果寫入就使用新值;
create table 表名(
-> 字段名 字段類型,
-> 字段名 字段類型,
-> 字段名 字段類型,
-> 字段名 字段類型 DEFAULT '默認值',
-> );
修改表時添加默認值:
alter table 表名 change 舊字段名 新字段名 字段類型 DEFAULT '默認值';
非空約束(NOT NULL)
特點:一張表中可以設置多個字段非空,主鍵默認非空;
創建表時設置非空:
create table 表名(
-> 字段名 字段類型 NOT NULL,
-> 字段名 字段類型,
-> 字段名 字段類型,
-> 字段名 字段類型,
-> );
修改表時添加非空:
alter table 表名 change 舊字段名 新字段名 字段類型 not null;
DQL數據查詢語句:查詢會產生一張虛擬表
語法結構:select 字段名,字段名 from 表名 where 篩選過濾條件
(注意:*代表表中所有字段,不建議使用,會影響查詢效率;)
查詢表中所有數據庫:select * from 表名;
指定字段查詢:select 字段名,字段名 from 表名;
AS起別名:eg:select name AS 姓名,address AS 地址 FROM student;
不用AS起別名:select name 姓名,address 地址 FROM student;
限制固定行數查詢:limit
注意:limit0,2 逗號前表示從哪一行開始取值,第一行是0,逗號右邊取值多少行;
select * from student limit 0,3;
distinct排除重復:
select distinct 列名 from 表名;
條件查詢:eg: select * from student where 字段名=值;
單條件查詢:= != < > <= >=
多條件查詢:and or not
select * from student where id>=2 and sex=‘女’;
select * from student where id>=2 or sex=‘女’;
范圍選擇方式一:eg:select * from 表名 where (2010-birth)>18 and (2010-brith)<28;
方式二:SELECT 列 FROM 表 WHERE 條件 BETWEEN 下限AND 上限(上下限的位置不能顛倒)
eg:select * from 表名 where 2010-birth BETWEEN 18 and 28;
方式三:SELECT 列 FROM 表 WHERE 條件 NOT BETWEEN 下限AND 上限
eg:select * from 表名 where 2010-birth NOT BETWEEN 18 and 28;
集合操作:
1、or
select * from student where 列名=值 or 列名=值 or ...;
2、in
select * from student where 列名 in (值,值);
3、not in
select * from student where 列名 not in (值,值);
模糊查詢:_:一個字符、%:任意字符,可以是零個;
select * from student where 列名 like ‘值’;
查詢空行:
select * from student where 列名 is null;
常量列:
select 列名 as 別名,列名 as 別名名,新的值 as 新別名 from student;
排序:
升序:ASC(從小到大)
select * from 表名 where 篩選條件 order by 列名 ASC;
降序:DESC(從大到小)
select * from 表名 where 篩選條件 order by 列名 DESC;
多列排序:
聚合函數:
count:計數,返回行的數目;
select count(列名) from 表名
max:最大值
select stu_id as 學號,max(grade) as 成績 from 表名 where c_name='計算機';
min:最小值
select stu_id as 學號,min(grade) as 成績 from 表名 where c_name='計算機';
sum:求和
select stu_id as 學號,sum(grade) as 成績 from 表名 where c_name='計算機';
avg:平均值
select stu_id as 學號,avg(grade) as 成績 from 表名 where c_name='計算機';
分組查詢:group by
select c_name,max(grade) from 表名 group by c_name;
多列分組:
select stu_id,c_name,avg (grade) from 表名 group by c_name,stu_id;
having:對之前分組的結構進行過濾
select c_name,avg(grade) from 表名 group by c_name having avg(grader)>80;
WHERE子句:
從數據源中去掉不符合其搜索條件的數據
GROUP BY子句:
搜集數據行到各個組中,統計函數為各個組計算統計值,每個組輸出一行結果
HAVING子句:
從分組計算結果中進行過濾,去掉不符合其組搜索條件的各組數據行
子查詢:sql里面嵌套sql;
SELECT name FROM class WHERE id = (SELECT cid FROM students WHERE name = ‘xxxx’)
in:后面可以賦多個值,用括號包裹;
SELECT * FROM student WHERE id in (SELECT stu_id FROM score WHERE c_name = ‘中文’) ;
exists子查詢:如果子查詢返回結果為真則執行父級sql,如果為假則父級sql執行結果為空;
SELECT * FROM student WHERE exists (SELECT stu_id FROM score WHERE c_name = ‘中文’) ;
any子句:取最小值與父級比較
all子句:取最大值與父級比較
union子句:合並表;
all 數據會重復
SELECT * FROM student_copy UNION all SELECT * FROM student;
不加all會去重
SELECT * FROM student_copy UNION SELECT * FROM student;
多表聯合查詢:
內連接:求兩表交集的部分;
select * from 表1 INNER JOIN 表2 ON 表1.列名=表2.列名
eg:select * from a_table INNER JOIN b_table ON a_table.a_id=b_table.b_id;
左連接:LEFT JOIN
以左表為基准,展示出左表的全部數據和右表交集部分數據;
select * from a_table LEFT JOIN b_table ON a_table.a_id=b_table.b_id;
右連接:RIGHT JOIN
以右表為基准,展示出右表的全部數據和左表交集部分數據;
select * from a_table RIGHT JOIN b_table ON a_table.a_id=b_table.b_id;
視圖:
保存查詢結果,把查詢結果當做一張虛擬的表,依賴於原始表數據和結構,如果原表數據或者結構發生改變,視圖的數據和結構也會發生相應的改變
特點:
1、效率高;2、安全性,可以指定展示其中某幾列數據,隱藏敏感信息
創建視圖:view
語法結構:
create view 視圖名 as 查詢的sql語句
創建視圖時指定字段名:
create view 視圖名 (字段名,字段名)as 查詢語句;
創建多表視圖:(查詢語句中不能使用 * )
create view 視圖名 as 聯合查詢語句
查看視圖結構:
DESC 視圖名;
查看創建視圖的語句:
show create view 視圖名;
修改視圖的語句:
alter view 視圖名 as 新查詢sql語句;
修改視圖的數據:
update 視圖名 set 字段名=新數據 where 條件
eg:UPDATE view_show_stu set sname='吊炸天' WHERE sid=103;
刪除視圖:drop view
drop view 視圖名;
存儲過程:多句sql同時執行,先編譯好存儲服務端,
特點:執行效率高、重復使用
臨時改變結束結束符合
delimiter //
創建存儲過程
CREATE PROCEDURE show_studnet()
BEGIN
SELECT * FROM student;
END//
調用存儲過程
CALL show_studnet()
查看存儲過程創建sql
SHOW CREATE PROCEDURE show_studnet
創建帶參數的存儲過程
delimiter //
CREATE PROCEDURE 存儲過程名(IN 新代字段 調用字段類型和值)
BEGIN
SELECT * FROM student WHERE 原表字段=新代字段;
END//
CALL show_studnet_un('原表中該行原數據')
eg:delimiter //
CREATE PROCEDURE show_studnet_un(IN name VARCHAR(30))
BEGIN
SELECT * FROM student WHERE sname=name;
END//
調用
CALL show_studnet_un('原表中該行原數據')
刪除存儲過程
drop PROCEDURE show_studnet_un
數據庫的備份:
備份表:
mysqldump -u root -p 數據庫名 表名>備份存儲路徑://存儲名.sql
備份指定庫:
mysqldump -uroot -p test woniutest>C:\student.sql
#備份數據庫中某個表
mysqldump -uroot -p test student>C:\student.sql
備份單個數據庫
mysqldump -u root -p 庫名>C:\student.sql
同時備份多個庫
mysqldump -u root -p --databases 庫名 庫名>C:\student.sql
#導出數據庫信息
查看secure-file-priv當前的值是
show variables like '%secure%';
如果導出失敗:
則需要添加secure_file_priv
SELECT * FROM student INTO OUTFILE 'C://Pcode/person.txt';
回復數據庫
mysql -u root -p < C:\all.sql
備份所有數據庫
mysqldump -u root -p --all-databases > C:\all.sql