1. 程式人生 > >MySQL資料庫重要知識點 Mysql資料庫重要知識點(知了堂學習心得)

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