Mysql資料庫知識點 1.管理資料庫語句: 使用資料庫: use test; 添加資料庫: create database 資料庫名; create database test; 修改資料庫: alter database 資料庫名; alter database test; 刪除資料庫: dro ...
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 軟體開發部
8)多表查詢
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;