數(shù)據(jù)庫操作
- cmd命令進(jìn)入數(shù)據(jù)庫 MySQL-u root -p
- 創(chuàng)建數(shù)據(jù)庫
Create database [if not exists] database_name character set utf8|gbk
- collate 表示校隊規(guī)則 utf8_bin 區(qū)分字母的大小寫 uft-8_general_ci 表示不區(qū)分字母的大小寫
- 查看數(shù)據(jù)庫
SHOW DATABASES;
- 查看數(shù)據(jù)庫的創(chuàng)建語句
SHOW CREATE DATABASE 數(shù)據(jù)庫名字
- 修改數(shù)據(jù)庫編碼:
ALTER DATABASE DB_NAME CHARACTER SET UTF8
- 刪除數(shù)據(jù)庫:
DROP DATABASE [IF EXISTES] DB_NAME;
- 選擇進(jìn)去特定數(shù)據(jù)庫:
USE DB_NAME;
- 如何在cmd窗口進(jìn)行包含漢語的查詢和插入:
set character_set_cilent=gbk;set character_set_results=gbk;
因?yàn)閏md窗口只識別gbk編碼的漢字,所以設(shè)置之后不影響數(shù)據(jù)庫的編碼,只是方便查看而已。
數(shù)據(jù)表操作
創(chuàng)建表 :
( ID INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(40) UNIQUE,
MATH DOUBLE,
ENGLISH DOUBLE,
CHINESE DOUBLE
)[CHCARACTER SET UTF8];
- 查看當(dāng)前數(shù)據(jù)庫的所有表 :
SHOW TABLES;
- 查看建表語句:
SHOW CREATE TABLE TABLE_NAME;
- 查看表結(jié)構(gòu) :
DESC TABLE_NAME;
修改表
- 增加一列:
ALTER TABLE TABLE_NAME ADD 列名 類型
- 修改一列:
ALTER TABLE TABLE_NAME MODIFY 列名 新類型
- 修改表的字符集:
ALTER TABLE TABLE_NAME CHARACTER SET UTF8
- 修改表名:
ALTER TABLE 舊的表名 TO 新的表名
- 修改列名:
ALTER TABLE TABLE_NAME CHANGE 舊的列名 新的列名 新的類型
- 刪除表:
DROP TABLE TABLE_NAME;
操作表記錄
- INSERT
INSERT INTO TABLE_NAME [(column,[column,...])] VALUES (VALUE,[VALUE...]);
插入的數(shù)據(jù)應(yīng)與字段的數(shù)據(jù)類型相同。
數(shù)據(jù)的大小應(yīng)在列的規(guī)定范圍內(nèi),例如:不能將一個長度為80的字符串加入到長度為40的列中。
在values中列出的數(shù)據(jù)位置必須與被加入的列的排列位置相對應(yīng)。
字符和日期型數(shù)據(jù)應(yīng)包含在單引號中。
插入空值:不指定或insert into table value(null)
如果要插入所有字段可以省寫列列表,直接按表中字段順序?qū)懼盗斜?/p>
- UPDATE
UPDATE語法可以用新值更新原有表行中的各列。
SET子句指示要修改哪些列和要給予哪些值。
WHERE子句指定應(yīng)更新哪些行。如沒有WHERE子句,則更新所有的行
- DELETE
DELETE FROM TABLE_NAME [WHERE 子句]
如果不使用where子句,將刪除表中所有數(shù)據(jù)。
Delete語句不能刪除某一列的值(可使用update)
使用delete語句僅刪除記錄,不刪除表本身。如要刪除表,使用drop table語句。
同insert和update一樣,從一個表中刪除記錄將引起其它表的參照完整性問題,在修改數(shù)據(jù)庫數(shù)據(jù)時,頭腦中應(yīng)該始終不要忘記這個潛在的問題。
外鍵約束
刪除表中數(shù)據(jù)也可使用TRUNCATE TABLE 語句,它和delete有所不同,參看mysql文檔。
- QUERY
- 基本查詢:
SELECT [DISTINCT] FROM TABLE_NAME [WHERE 子句]
- 查詢學(xué)生表中的所有數(shù)據(jù) :SELECT * FROM STUDENT;
- 查詢學(xué)生表中所有學(xué)生的name和math:SELECT NAME,MATH FROM STUDENT;
- 使用別名查詢:
SELECT NAME [AS] 姓名,ENGLISH+MATH+CHINESE [AS] 總成績 FROM STUDENG;
- 使用where子句過濾查詢(操作符+ - > < % _ between and or in ):
查詢姓名為lu的學(xué)生的語文成績:SELECT CHINESE FROM STUDENT WHERE NAME='lu';
查詢總分大于200分的學(xué)生姓名:SELECT NAME FROM STUDENT WHERE CHINESE+MATH+ENGLISH>200;
查詢姓張的學(xué)生的姓名:SELECT NAME FROM STUDENT WHERE NAME LIKE '張%'|'張_';
查詢數(shù)學(xué)成績在70~90的所有學(xué)生姓名:SELECT NAME FROM STUDENT WHERE MATH BETWEEN 70 AND 90;
查詢英語成績大于80,數(shù)學(xué)成績大于90的學(xué)生: SELECT * FROM STUDENT WHERE MATH>80 AND ENGLISH>90;
查詢學(xué)生語文成績?yōu)?0、70、80的學(xué)生:SELECT * FROM STUDENG WHERE CHINESE IN (60,70,80);
- 使用ORDER BY 關(guān)鍵字對查詢結(jié)果排序(DESC 降序排列 ASC升序排列(默認(rèn)排列形式))
- 查詢學(xué)生的總成績按降序排列: SELECT NAME AS 名字,MATH+ENGLISH+CHINESE AS 總成績 FROM ATUDENG WHERE ORDER BY 總成績 DESC;
- 對姓張的學(xué)生成績排序輸出: SELECT NAME AS 名字,MATH+ENGLISH+CHINESE AS 總成績 FROM STUDENG WHERE NAME LIKE '張%' ORDER BY 總成績 DESC;
- 聚合函數(shù)-用來將查詢結(jié)果包裹起來計算(SUM(求和)、COUNT(數(shù)據(jù)個數(shù))、 AVG(平均數(shù))、MAX(最大值)、MIN(最小值))
- SUM 用來將查詢結(jié)果的列進(jìn)行求和計算:
統(tǒng)計一個班各科成績的總成績:SELECT SUM(MATH),SUM(CHINESE),SUM(ENGLISH) FROM STUDENT; - COUNT 用來統(tǒng)計查詢結(jié)果的個數(shù):
統(tǒng)計一個班數(shù)學(xué)成績大于70的人數(shù):SELECT COUNT(*) FROM STUDENT WHERE MATH>70; - AVG 用來計算查詢結(jié)果的列數(shù)據(jù)的平均值:
求出整個班數(shù)學(xué)成績平均值:SELECT AVG(MATH) FROM STUDENT; - MAX 用來計算查詢結(jié)果列數(shù)據(jù)中的最大值:
求出整個班數(shù)學(xué)成績的最大值:SELECT MAX(MATH) FROM STUDENT; - MIN 用來計算查詢結(jié)果列數(shù)據(jù)的最小值:
求出整個班數(shù)學(xué)成績的最小值:SELECT MIN(MATH) FROM STUDENT;
如果數(shù)據(jù)有null值,則會造成聚合失敗,因?yàn)閚ull值無法進(jìn)行計算,所以在查詢時需要添加判空:SELECT AVG(IFNULL(MATH,0)) FROM STUDENG;切記IFNULL 之間沒有空格。
分組查詢(字段和數(shù)據(jù)表名字不能使用sql語句的關(guān)鍵字)
create table orders(
id int primary key auto_increment,
name varchar(40) unique,
product varchar(40),
price double);
GROUP BY(分組查詢)
- 對訂單中的商品歸類后,查詢每個商品類的總價:SELECT PRODUCT,SUM(PRICE) FROM ORDERS GROUP BY PRODUCT;
- 查詢購買了幾類產(chǎn)品,每類產(chǎn)品的總價不大于20的產(chǎn)品:SELECT PRODUCT FROM ORDERS GROUP BY PRODUCT HAVING SUM(PRICE)<20;
where子句和having子句的區(qū)別:
where子句在分組之前進(jìn)行過濾having子句在分組之后進(jìn)行過濾
having子句中可以使用聚合函數(shù),where子句中不能使用
很多情況下使用where子句的地方可以使用having子句進(jìn)行替代
- 查詢單價小于20而總價大于30的商品的名稱 :
SELECT PRODUCT FROM ORDERS WHERE PRICE<20 GROUP BY PRODUCT HAVING SUM(PRICE)>30
SQL語句書寫順序:
SELECT FROM WHERE GROUP BY HAVING ORDER BY
SQL語句執(zhí)行順序
FROM WHERE SELECT GROUP BY HAVING ORDER BY
備份恢復(fù)數(shù)據(jù)庫
備份: 在cmd窗口下 mysqldump -u root -p dbName>c:/1.sql
恢復(fù): 方式1:在cmd窗口下 mysql -u root -p dbName<c:/1.sql
方式2:在mysql命令下, source c:/1.sql
要注意恢復(fù)數(shù)據(jù)只能恢復(fù)數(shù)據(jù)本身,數(shù)據(jù)庫沒法恢復(fù),需要先自己創(chuàng)建出數(shù)據(jù)后才能進(jìn)行恢復(fù).
多表設(shè)計多表查詢
- 外鍵約束:在進(jìn)行多表設(shè)計時,為了保證表與表之間的約束關(guān)系,引出了外鍵約束來進(jìn)行關(guān)聯(lián):
- 創(chuàng)建兩個表,部門表和員工表,員工表的dept_id作為關(guān)聯(lián)部門表的外鍵
create table dept(
id int primary key auto_increment,
name varchar(20)
);
insert into dept values(null,'財務(wù)部'),(null,'人事部'),(null,'銷售部'),(null,'行政部');
create table emp(
id int primary key auto_increment,
name varchar(20),
dept_id int,
foreign key(dept_id) references dept(id)
);
insert into emp values(null,'奧巴馬',1),(null,'詹姆斯',2),(null,'本拉登',3),(null,'科比',3);
3.多表查詢
笛卡爾積查詢:
將兩張表的記錄進(jìn)行一個相乘的操作查詢出來的結(jié)果就是笛卡爾積查詢,如果左表有n條記錄,右表有m條記錄,笛卡爾積查詢出有n*m條記錄,其中往往包含了很多錯誤的數(shù)據(jù),所以這種查詢方式并不常用
select * from dept,emp;
內(nèi)連接查詢:查詢的是左邊表和右邊表都能找到對應(yīng)記錄的記錄
select * from dept,emp where dept.id = emp.dept_id;
select * from dept inner join emp on dept.id=emp.dept_id;
外連接查詢:
左外連接查詢:在內(nèi)連接的基礎(chǔ)上增加左邊表有而右邊表沒有的記錄
select * from dept left join emp on dept.id=emp.dept_id;
右外連接查詢:在內(nèi)連接的基礎(chǔ)上增加右邊表有而左邊表沒有的記錄
select * from dept right join emp on dept.id=emp.dept_id;
全外連接查詢:在內(nèi)連接的基礎(chǔ)上增加左邊表有而右邊表沒有的記錄和右邊表有而左表表沒有的記錄
select * from dept full join emp on dept.id=emp.dept_id; -- mysql不支持全外連接
可以使用union關(guān)鍵字模擬全外連接:
select * from dept left join emp on dept.id = emp.dept_id
union
select * from dept right join emp on dept.id = emp.dept_id;