MySQL資料庫重要知識點 Mysql資料庫重要知識點(知了堂學習心得)
Mysql資料庫重要知識點(知了堂學習心得)
Mysql資料庫知識點
1.管理資料庫語句:
使用資料庫:
use test;
新增資料庫:
create database 資料庫名;
create database test;
修改資料庫:
alter database 資料庫名;
alter database test;
刪除資料庫:
drop database 資料庫名;
drop database test;
檢視所有資料庫:
show databases;
2.管理表語句:
新增資料表:
create table 表名(
列名 資料型別 資料約束,
列名 資料型別 資料約束
);
create table student(
name varchar(20) not null,
age int(4)
)
修改資料表:
alter table 表名;
1)在表中增加新欄位
alter table student add colunm name varchar(20);
2)刪除表中的欄位
alter table student drop name;
3)修改表中欄位的型別
alter table student modify name varchar(10);
刪除資料表:
drop table 表名;
drop table student;
檢視所有表:
show tables;
3.管理資料語句:
插入資料:
insert into 表名 (列1,列2...) values (值1,值2...);
insert into student (name,age) values ('張三',20);
更新資料:
update 表名 set 列=修改值 where 條件;
update student set name='李四' where name='張三';
刪除資料:
delete from 表名 where 條件;
delete from student where name='李四';
查詢資料:
selete * from 表名 where 條件;
selete * from student where name='張三';
4.各種查詢語句:
查詢時指定別名:
1) selete id AS '編號',name AS '姓名' from student;
2) selete id '編號',name '姓名' from student;(AS可以省略)
查詢時合併列:
需求:查詢每個學生的總分
selete name AS '姓名',(servlet+mysql) AS '總成績' from student;
注意:合併列的欄位必須是數值型別的欄位
查詢時去除重複(distinct):
需求:查詢有哪些地區的學生
selete DISTINCT address from student;
另一種語法
selete DISTINCT(address) from student;
條件查詢
邏輯條件: and or
需求:查詢學生的id為1,且姓名為張三的學生
selete * from student where id=1 and name='張三';(交集)
需求:查詢學生的id為2,或姓名為張三的學生
selete * from student where id=2 or name='張三';(並集)
比較條件: > < >= <= = <> (between and--在...之間 包前包後)
需求:查詢servlet分數大於80分的學生
selete * from student where servlet>80;
需求:查詢mysql分數小於或等於85分的學生
selete * from student where mysql<=85;
需求:查詢servlet分數大於或等於80分,且小於或等於85分的學生
selete * from student where servlet>=80 AND servlet<=85;
代替上面語句的語法
selete * from student where servlet BETWEEN 80 AND 85;
需求:查詢年齡不等於30的學生
selete * from student where age<>30;
判空條件: is null, is not null, =’’, <>’’
Null:表示沒有資料
空字元:表示有資料
需求:查詢沒有性別資料的學生(資料‘男’或‘女’)
selete* from student where gender IS NULL OR gender='';
需求:查詢有性別資料的學生
selete * from student where gender IS NOT NULL AND gender<>'';
模糊條件: like
模糊替代符號:
%:替代任意個字元
_:替代一個字元
需求:查詢姓“李”的學生
SELECT * FROM student WHERE NAME LIKE '李%';
需求:查詢姓名中包含‘四’字的學生
SELECT * FROM student WHERE NAME LIKE '%四%';
需求:查詢姓‘李’,全名只有兩個字的學生
SELECT * FROM student WHERE NAME LIKE '李_';
聚合函式查詢(用於統計結果)
Max()取最大值 min()取最小值 avg()取平均值 count()統計標的記錄數量 sum()求和
需求:查詢servlet的最高分
SELECT MAX(servlet) FROM student;
需求:查詢mysql的最低分
SELECT MIN(mysql) FROM student;
需求:查詢servlet的平均分
SELECT AVG(servlet) FROM student;
需求:查詢當前有幾個學生
SELECT COUNT(*) FROM student;
需求:查詢servlet成績的總和
SELETE SUM(servlet) from student;
分頁查詢(limit)
Limit起始行數,查詢的行數
起始行數從0開始
需求:查詢第1,2條資料
SELECT * FROM student LIMIT 0,2;
分頁查詢需知道:當前頁碼,每頁顯示條數
結論分頁查詢當前頁資料:select * from student limit (當前頁碼-1)*每頁顯示條數,每頁顯示條數;
需求:學生共20條資料,每頁顯示5條,共4頁
查詢第3頁(第11到15條)的學生資料:select * from student limit 10,5;
查詢後排序(order by)
DESC:降序。數值從大到小,字母z-a
ASC:升序。數值從小到大,字母a-z
預設情況下,按照插入的順序排序
需求:按照id的升序排序
select * from student order by id asc;
需求:按照servlet成績降序排序
select * from student order by servlet desc;
多個排序條件的情況:先按照前面的條件排序,當出現重複記錄,再按照後面的條件排序
需求:按照age升序,再按照servlet成績升序排序
select * from student order by age asc,servlet asc;
分組查詢(group by)
需求:查詢每個地區有多少人
SELECT address,COUNT(*) FROM student GROUP BY address;
需求:統計男女的人數
注意:where條件必須放在group by 分組之前
SELECT gender,COUNT(*) FROM student WHERE gender IS NOT NULL AND gender<>'' GROUP BY gender;
分組後篩選(having)
需求:查詢哪些地區的人數是大於2個的地區
查詢哪些地區多少人 2)篩選人數大於2的地區
注意:having使用在group by分組之後,對分組後的條件進行篩選
SELECT address,COUNT(*) FROM student GROUP BY address HAVING COUNT(*)>2;
5.資料約束(給表新增資料約束,從而約束使用者操作表資料的行為)
1)預設值約束(default)
create table test(
name varchar(20),
gender varchar(20) default ‘男’
)
需求:當不插入gender的時候,分配一個‘男’的預設值
注意:1)當沒有插入gender欄位的時候,分配一個預設值
2)非空約束(not null)
create table test(
name varchar(20) not null,
gender varchar(20)
)
需求;name欄位一定要有值(不能不插入資料,不能是null),這是給name新增非空約束
1)非空約束,不能不插入值
Insert into test(gender) values(‘男’);
2)非空約束,不能插入null
Insert into test(name,gender) values(null,’男’);
3)唯一約束(unique)
create table test(
Id int unique,
name varchar(20)
)
需求:id的值不能出現重複。這時就要給id新增一個唯一約束
1)不能插入重複的值
2)唯一約束,可以插入多個null。所以唯一約束不能約束null
Insert into test(id,name) values(1,’張三’);
4)主鍵約束(primary key)(唯一+非空)
注意;
1)通常情況下,我們會給每張表都設定一個主鍵欄位,用來標記記錄的唯一性
2)但是不建議把業務含義欄位作為主鍵,因為隨著業務的變化,業務欄位可能出現重複
3)建議給每張表都獨立新增一個叫id的欄位,把這個id欄位設定成主鍵,用來作為記錄的唯一性
create table test(
Id int primary key,
name varchar(20)
)
1)唯一性
2)非空性
5)自增長約束(auto_increment)
create table test(
Id int primary key auto_increment,
name varchar(20)
)
自增長約束:初始值為0,每次遞增1
使用truncate table 刪除資料的時候,可以把自增長的初始值置為0
6)外來鍵約束
員工表(副表:被別的表約束的表,外來鍵設定在副表)
Create table employee(
Id int primary key auto_increment,
name varchar(20),
deptId int,
新增外來鍵約束(foreign key)
Constraint employee_dept_fk foreign key(deptId) references dept(id)
外來鍵名 外來鍵欄位
)
部門表(主表:約束別人的表)
Create table dept(
Id int primary key auto_increment,
Name varchar(20)
)
外來鍵約束在什麼情況下會起作用?
插入資料:當往副表插入了主表中不存在的資料時,外來鍵起作用
修改資料:當往副表中修改主表中不存在的資料時,外來鍵起作用
刪除資料:副表中有關聯主表資料的情況下,當刪除主表資料時,外來鍵起作用
當有了外來鍵之後,應該如何管理資料呢?
插入資料:先插入主表的資料,再插入副表資料
修改資料:先修改主表資料,再修改副表資料
刪除資料:先刪除副表資料,再刪除主表資料
7)級聯技術(cascade)
級聯:當有了外來鍵的時候,我們希望修改或刪除資料的時候,修改或刪除主表資料時,同時能夠影響副表的資料,這時就可以使用級聯
Create table employee(
Id int primary key auto_increment,
name varchar(20),
deptId int,
新增外來鍵約束(foreign key)
新增級聯修改:on update cascade
新增級聯修改:on delete cascade
Constraint employee_dept_fk foreign key(deptId) references dept(id) on update cascade on delete cascade
外來鍵名 外來鍵欄位
);
部門表(主表:約束別人的表)
Create table dept(
Id int primary key auto_increment,
Name varchar(20)
);
6.資料庫設計的三大正規化
第一正規化;要求表的每個欄位必須獨立的不可分割的單元
學生表: student name ---違反第一正規化
張三|狗娃
王涵|張小涵
查詢:現用名中包含‘張’的學生
Select * from student where name like ‘%張%’;
學生表: student name old_name ---符合第一正規化
張三 狗娃
王涵 張小涵
第二正規化:在第一正規化的基礎上,要求表的除主鍵以外的欄位都和主鍵有依賴關係
一張表只表達一個意思
員工表:employee
員工編號 員工姓名 部門名稱 訂單名稱 ---違反第二正規化
員工表:employee
員工編號 員工姓名 部門名稱 ---符合第二正規化
訂單表:
訂單編號 訂單名稱
第三正規化:在第二正規化的基礎上,要求表的除主鍵以外的欄位都只能和主鍵有直接決定的依賴關係
員工表:employee
員工編號 員工姓名 部門編號 部門名稱 ---違反第三正規化(出現數據冗餘)
1 張三 1 軟體開發部
2 李四 1 軟體開發部
員工表:employee
員工編號 員工姓名 部門編號 ---符合第三正規化
1 張三 1
2 李四 1
部門表:dept
部門編號 部門名稱
1 軟體開發部
7.多表查詢
1.交叉連線查詢(笛卡爾乘積:4*3=12,產生笛卡爾積的原因是沒有足夠的連線條件)(一般不用)
需求:查詢員工及其部門名稱
SELECT employee.name,dept.name
FROM employee,dept;
2.內連線查詢(使用最多)
多表查詢的步驟:1)確定查詢哪些表
2)確定查詢哪些欄位
3)確定連線條件(規則:條件=表數量-1)
SELECT employee.name,dept.name
FROM employee,dept
WHERE employee.deptId=dept.id;
另一種語法
SELECT e.name,d.name
FROM employee e
INNER JOIN dept d
ON e.deptId=d.id;
3.左外連線查詢(左表資料全部顯示,如果右邊不滿足,則顯示null)
需求:查詢部門及其部門的員工
SELECT d.name,e.name
FROM dept d
LEFT OUTER JOIN employee e
ON d.id=e.deptId;
4.右外連線查詢(右表資料全部顯示,如果左邊不滿足,則顯示null)
SELECT d.name,e.name
FROM employee e
RIGHT OUTER JOIN dept d
ON e.deptId=d.id;
溫馨提示:想要了解更多知識,請前往知了堂學習社群
www.zhiliaotang.com
Mysql資料庫知識點
1.管理資料庫語句:
使用資料庫:
use test;
新增資料庫:
create database 資料庫名;
create database test;
修改資料庫:
alter database 資料庫名;
alter database test;
刪除資料庫:
drop database 資料庫名;
drop database test;
檢視所有資料庫:
show databases;
2.管理表語句:
新增資料表:
create table 表名(
列名 資料型別 資料約束,
列名 資料型別 資料約束
);
create table student(
name varchar(20) not null,
age int(4)
)
修改資料表:
alter table 表名;
1)在表中增加新欄位
alter table student add colunm name varchar(20);
2)刪除表中的欄位
alter table student drop name;
3)修改表中欄位的型別
alter table student modify name varchar(10);
刪除資料表:
drop table 表名;
drop table student;
檢視所有表:
show tables;
3.管理資料語句:
插入資料:
insert into 表名 (列1,列2...) values (值1,值2...);
insert into student (name,age) values ('張三',20);
更新資料:
update 表名 set 列=修改值 where 條件;
update student set name='李四' where name='張三';
刪除資料:
delete from 表名 where 條件;
delete from student where name='李四';
查詢資料:
selete * from 表名 where 條件;
selete * from student where name='張三';
4.各種查詢語句:
查詢時指定別名:
1) selete id AS '編號',name AS '姓名' from student;
2) selete id '編號',name '姓名' from student;(AS可以省略)
查詢時合併列:
需求:查詢每個學生的總分
selete name AS '姓名',(servlet+mysql) AS '總成績' from student;
注意:合併列的欄位必須是數值型別的欄位
查詢時去除重複(distinct):
需求:查詢有哪些地區的學生
selete DISTINCT address from student;
另一種語法
selete DISTINCT(address) from student;
條件查詢
邏輯條件: and or
需求:查詢學生的id為1,且姓名為張三的學生
selete * from student where id=1 and name='張三';(交集)
需求:查詢學生的id為2,或姓名為張三的學生
selete * from student where id=2 or name='張三';(並集)
比較條件: > < >= <= = <> (between and--在...之間 包前包後)
需求:查詢servlet分數大於80分的學生
selete * from student where servlet>80;
需求:查詢mysql分數小於或等於85分的學生
selete * from student where mysql<=85;
需求:查詢servlet分數大於或等於80分,且小於或等於85分的學生
selete * from student where servlet>=80 AND servlet<=85;
代替上面語句的語法
selete * from student where servlet BETWEEN 80 AND 85;
需求:查詢年齡不等於30的學生
selete * from student where age<>30;
判空條件: is null, is not null, =’’, <>’’
Null:表示沒有資料
空字元:表示有資料
需求:查詢沒有性別資料的學生(資料‘男’或‘女’)
selete* from student where gender IS NULL OR gender='';
需求:查詢有性別資料的學生
selete * from student where gender IS NOT NULL AND gender<>'';
模糊條件: like
模糊替代符號:
%:替代任意個字元
_:替代一個字元
需求:查詢姓“李”的學生
SELECT * FROM student WHERE NAME LIKE '李%';
需求:查詢姓名中包含‘四’字的學生
SELECT * FROM student WHERE NAME LIKE '%四%';
需求:查詢姓‘李’,全名只有兩個字的學生
SELECT * FROM student WHERE NAME LIKE '李_';
聚合函式查詢(用於統計結果)
Max()取最大值 min()取最小值 avg()取平均值 count()統計標的記錄數量 sum()求和
需求:查詢servlet的最高分
SELECT MAX(servlet) FROM student;
需求:查詢mysql的最低分
SELECT MIN(mysql) FROM student;
需求:查詢servlet的平均分
SELECT AVG(servlet) FROM student;
需求:查詢當前有幾個學生
SELECT COUNT(*) FROM student;
需求:查詢servlet成績的總和
SELETE SUM(servlet) from student;
分頁查詢(limit)
Limit起始行數,查詢的行數
起始行數從0開始
需求:查詢第1,2條資料
SELECT * FROM student LIMIT 0,2;
分頁查詢需知道:當前頁碼,每頁顯示條數
結論分頁查詢當前頁資料:select * from student limit (當前頁碼-1)*每頁顯示條數,每頁顯示條數;
需求:學生共20條資料,每頁顯示5條,共4頁
查詢第3頁(第11到15條)的學生資料:select * from student limit 10,5;
查詢後排序(order by)
DESC:降序。數值從大到小,字母z-a
ASC:升序。數值從小到大,字母a-z
預設情況下,按照插入的順序排序
需求:按照id的升序排序
select * from student order by id asc;
需求:按照servlet成績降序排序
select * from student order by servlet desc;
多個排序條件的情況:先按照前面的條件排序,當出現重複記錄,再按照後面的條件排序
需求:按照age升序,再按照servlet成績升序排序
select * from student order by age asc,servlet asc;
分組查詢(group by)
需求:查詢每個地區有多少人
SELECT address,COUNT(*) FROM student GROUP BY address;
需求:統計男女的人數
注意:where條件必須放在group by 分組之前
SELECT gender,COUNT(*) FROM student WHERE gender IS NOT NULL AND gender<>'' GROUP BY gender;
分組後篩選(having)
需求:查詢哪些地區的人數是大於2個的地區
查詢哪些地區多少人 2)篩選人數大於2的地區
注意:having使用在group by分組之後,對分組後的條件進行篩選
SELECT address,COUNT(*) FROM student GROUP BY address HAVING COUNT(*)>2;
5.資料約束(給表新增資料約束,從而約束使用者操作表資料的行為)
1)預設值約束(default)
create table test(
name varchar(20),
gender varchar(20) default ‘男’
)
需求:當不插入gender的時候,分配一個‘男’的預設值
注意:1)當沒有插入gender欄位的時候,分配一個預設值
2)非空約束(not null)
create table test(
name varchar(20) not null,
gender varchar(20)
)
需求;name欄位一定要有值(不能不插入資料,不能是null),這是給name新增非空約束
1)非空約束,不能不插入值
Insert into test(gender) values(‘男’);
2)非空約束,不能插入null
Insert into test(name,gender) values(null,’男’);
3)唯一約束(unique)
create table test(
Id int unique,
name varchar(20)
)
需求:id的值不能出現重複。這時就要給id新增一個唯一約束
1)不能插入重複的值
2)唯一約束,可以插入多個null。所以唯一約束不能約束null
Insert into test(id,name) values(1,’張三’);
4)主鍵約束(primary key)(唯一+非空)
注意;
1)通常情況下,我們會給每張表都設定一個主鍵欄位,用來標記記錄的唯一性
2)但是不建議把業務含義欄位作為主鍵,因為隨著業務的變化,業務欄位可能出現重複
3)建議給每張表都獨立新增一個叫id的欄位,把這個id欄位設定成主鍵,用來作為記錄的唯一性
create table test(
Id int primary key,
name varchar(20)
)
1)唯一性
2)非空性
5)自增長約束(auto_increment)
create table test(
Id int primary key auto_increment,
name varchar(20)
)
自增長約束:初始值為0,每次遞增1
使用truncate table 刪除資料的時候,可以把自增長的初始值置為0
6)外來鍵約束
員工表(副表:被別的表約束的表,外來鍵設定在副表)
Create table employee(
Id int primary key auto_increment,
name varchar(20),
deptId int,
新增外來鍵約束(foreign key)
Constraint employee_dept_fk foreign key(deptId) references dept(id)
外來鍵名 外來鍵欄位
)
部門表(主表:約束別人的表)
Create table dept(
Id int primary key auto_increment,
Name varchar(20)
)
外來鍵約束在什麼情況下會起作用?
插入資料:當往副表插入了主表中不存在的資料時,外來鍵起作用
修改資料:當往副表中修改主表中不存在的資料時,外來鍵起作用
刪除資料:副表中有關聯主表資料的情況下,當刪除主表資料時,外來鍵起作用
當有了外來鍵之後,應該如何管理資料呢?
插入資料:先插入主表的資料,再插入副表資料
修改資料:先修改主表資料,再修改副表資料
刪除資料:先刪除副表資料,再刪除主表資料
7)級聯技術(cascade)
級聯:當有了外來鍵的時候,我們希望修改或刪除資料的時候,修改或刪除主表資料時,同時能夠影響副表的資料,這時就可以使用級聯
Create table employee(
Id int primary key auto_increment,
name varchar(20),
deptId int,
新增外來鍵約束(foreign key)
新增級聯修改:on update cascade
新增級聯修改:on delete cascade
Constraint employee_dept_fk foreign key(deptId) references dept(id) on update cascade on delete cascade
外來鍵名 外來鍵欄位
);
部門表(主表:約束別人的表)
Create table dept(
Id int primary key auto_increment,
Name varchar(20)
);
6.資料庫設計的三大正規化
第一正規化;要求表的每個欄位必須獨立的不可分割的單元
學生表: student name ---違反第一正規化
張三|狗娃
王涵|張小涵
查詢:現用名中包含‘張’的學生
Select * from student where name like ‘%張%’;
學生表: student name old_name ---符合第一正規化
張三 狗娃
王涵 張小涵
第二正規化:在第一正規化的基礎上,要求表的除主鍵以外的欄位都和主鍵有依賴關係
一張表只表達一個意思
員工表:employee
員工編號 員工姓名 部門名稱 訂單名稱 ---違反第二正規化
員工表:employee
員工編號 員工姓名 部門名稱 ---符合第二正規化
訂單表:
訂單編號 訂單名稱
第三正規化:在第二正規化的基礎上,要求表的除主鍵以外的欄位都只能和主鍵有直接決定的依賴關係
員工表:employee
員工編號 員工姓名 部門編號 部門名稱 ---違反第三正規化(出現數據冗餘)
1 張三 1 軟體開發部
2 李四 1 軟體開發部
員工表:employee
員工編號 員工姓名 部門編號 ---符合第三正規化
1 張三 1
2 李四 1
部門表:dept
部門編號 部門名稱
1 軟體開發部
7.多表查詢
1.交叉連線查詢(笛卡爾乘積:4*3=12,產生笛卡爾積的原因是沒有足夠的連線條件)(一般不用)
需求:查詢員工及其部門名稱
SELECT employee.name,dept.name
FROM employee,dept;
2.內連線查詢(使用最多)
多表查詢的步驟:1)確定查詢哪些表
2)確定查詢哪些欄位
3)確定連線條件(規則:條件=表數量-1)
SELECT employee.name,dept.name
FROM employee,dept
WHERE employee.deptId=dept.id;
另一種語法
SELECT e.name,d.name
FROM employee e
INNER JOIN dept d
ON e.deptId=d.id;
3.左外連線查詢(左表資料全部顯示,如果右邊不滿足,則顯示null)
需求:查詢部門及其部門的員工
SELECT d.name,e.name
FROM dept d
LEFT OUTER JOIN employee e
ON d.id=e.deptId;
4.右外連線查詢(右表資料全部顯示,如果左邊不滿足,則顯示null)
SELECT d.name,e.name
FROM employee e
RIGHT OUTER JOIN dept d
ON e.deptId=d.id;
溫馨提示:想要了解更多知識,請前往知了堂學習社群
www.zhiliaotang.com