安裝 MySQL 5.5.27 x64
一直 next
勾選使用圖形化配置
選擇 儘量佔用最大內存
選擇 多功能型
選擇 最多人數
選擇 utf8 字符集
選擇 添加path
刪除
停止MySQL
添加刪除程序中卸載MySQL
到安裝目錄刪除MySQL
登陸
>mysql -u root -p
退出
> quit
修改密碼
停止服務
1. win + r
2. services.msc
3. 找到 MySQL 停止服務
進入 CDM
1. 在cmd下 輸入 mysqld –skip-grant-tables 啟動服務器 光標不動 (不要關閉該窗口)
2. 新打開cmd 輸入mysql -u root -p 不需要密碼
3. >use mysql;
4. >update user set password=password(‘abc’) WHERE User=’root’;
5. 關閉兩個cmd窗口 在任務管理器結束mysqld 進程
6. 在服務管理頁面 重啟mysql 服務
7. 密碼修改完成
SQL
SHOW
1. 查看當前數據庫服務器中的所有數據庫
DDL:操作數據庫、表、列等
使用的關鍵字:CREATE、 ALTER、 DROP
操作數據庫
CREATE
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS]
ALTER
ALTER DATABASE [IF NOT EXISTS] db_name
SELECT
1. 查看當前使用的數據庫
DROP
刪除前面創建的mydb3數據庫
drop database mydb3;
找到MySQL 數據庫存放位置 data,刪除對應的數據庫
RENAME
找到MySQL 數據庫存放位置 data,將數據庫改為對應的名稱
操作數據表
創建表
語法
create table 表名(
常用數據類型:
int:整型
練習
創建員工表的數據字典
創建員工表的SQL 語句
查詢表信息
當前數據庫中的所有表
>SHOW TABLES;
查看錶的字段信息
>DESC employee;
修改表
追加
ALTER TABLE table_name
修改
ALTER TABLE table_name
刪除列
ALTER TABLE table_name
修改表名
Rename TABLE 表名 to 新表名;
修改表的字符集
ALTER TABLE table_name character set utf8;
刪除表
DROP TABLE user;
練習
在上面員工表的基本上增加一個image列。
ALTER TABLE employee ADD image blob;
修改job列,使其長度為60。
ALTER TABLE employee MODIFY job varchar(60);
刪除image列。
ALTER TABLE employee DROP image;
表名改為user。
RENAME TABLE employee TO user;
修改表的字符集為gbk
ALTER TABLE user CHARACTER SET gbk;
列名name修改為username
ALTER TABLE user CHANGE name username varchar(100);
查看錶格的創建細節
SHOW CREATE TABLE user\G;
DML操作(重要)
查詢表中的所有數據
SELECT * FROM 表名;
DML是對 表中的數據 進行增、刪、改的操作。不要與DDL混淆了。
1. INSERT
2. UPDATE
3. DELETE
小知識:
1. 在mysql中, 字符串類型和日期類型 都要用 單引號 括起來。例如:’tom’ ‘2015-09-04’
2. 空值:null (不佔內存) “”(佔內存)
使用 MySQL 客戶端工具 SQLyog
插入操作:INSERT:
語法:
INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);
注意:
列名 與 列值 的類型、個數、順序要一一對應。
可以把 列名 當做java中的 形參,把列值當做 實參。
值不要超出 列 定義的長度。
如果插入 空值,請使用 null
插入的日期和字符一樣,都使用引號括起來。
練習
-- 創建表 emp
修改操作 UPDATE:
語法:
UPDATE 表名 SET 列名1=列值1,列名2=列值2 。。。 [WHERE 列名=值]
練習:
-- 將所有員工薪水修改為5000元。
刪除操作 DELETE:
語法 :
DELETE FROM 表名 [WHERE 列名=值]
練習 :
-- 刪除表中名稱為’zs’的記錄。
DELETE 與 TRUNCATE 的區別
1. DELETE 刪除表中的數據,表結構還在;刪除後的數據可以找回
2. TRUNCATE 刪除是把表直接DROP掉,然後再創建一個同樣的新表。
3. TRUNCATE 刪除的數據不能找回。執行速度比DELETE快。
RENAME TABLE命令語法:
使用命令:
RENAME TABLE db_name.table1 TO new_db_name.table1,
找到MySQL 數據庫存放位置 data,找到對應的數據庫,找到對應的xx.frm 文件,修改名稱
DQL數據查詢語言 (重要)
數據庫執行 DQL語句 不會對數據進行改變,而是讓數據庫發送結果集給客戶端。
查詢返回的結果集是一張虛擬表。
查詢關鍵字:SELECT
語法:
SELECT 列名 FROM表名 [WHERE --> GROUP BY -->HAVING--> ORDER BY]
語法詳細說明:
SELECT selection_list /*要查詢的列名稱*/
根據數據字典 創建表
學生表:stu
-- 創建學生表
僱員表:emp
-- 創建僱員表
部門表:dept
-- 創建部門表
基礎查詢
查詢所有列
SELECT * FROM stu;
查詢指定列
SELECT sid, sname, age FROM stu;
條件查詢(操作stu表)
條件查詢介紹
=、!=、<>、<、<=、>、>=;
BETWEEN…AND;
IN(set);
IS NULL; IS NOT NULL
AND;
OR;
NOT;
條件查詢就是在查詢時給出WHERE子句,在WHERE子句中可以使用如下運算符及關鍵字:
2.2 查詢性別為女,並且年齡大於等於50的記錄
SELECT * FROM stu WHERE gender=’female’ AND age>=50;
2.3 查詢學號為S_1001,或者姓名為liSi的記錄
SELECT * FROM stu WHERE sid=’S_1001’ OR sname=’lisi’;
2.4 查詢學號為S_1001,S_1002,S_1003的記錄
SELECT * FROM stu WHERE sid=’S_1001’ OR sid=’S_1002’ OR sid=’S_1003’;
SELECT * FROM stu WHERE sid IN(‘S_1001’,’S_1002’,’S_1003’);
2.5 查詢學號不是S_1001,S_1002,S_1003的記錄
SELECT * FROM stu WHERE sid NOT IN(‘S_1001’,’S_1002’,’S_1003’);
2.6 查詢年齡為null的記錄
SELECT * FROM stu WHERE age IS NULL;
SELECT * FROM stu WHERE age IS NOT NULL;
2.7 查詢年齡在20到40之間的學生記錄
SELECT * FROM stu WHERE age>=20 AND age<=40;
SELECT * FROM stu WHERE age BETWEEN 20 AND 40;
2.8 查詢性別非男的學生記錄
SELECT * FROM stu WHERE gender=’female’;
SELECT * FROM stu WHERE gender!=’male’;
SELECT * FROM stu WHERE gender<>’male’;
2.9 查詢姓名不為null的學生記錄
SELECT * FROM stu WHERE sname IS NOT NULL;
模糊查詢(操作stu表)
當想查詢姓名中包含a字母的學生時就需要使用模糊查詢了。模糊查詢需要使用關鍵字LIKE。
通配符:
_ 任意一個字符
3.1 查詢姓名由5個字母構成的學生記錄
SELECT * FROM stu WHERE sname LIKE ‘_‘;
– 模糊查詢必須使用LIKE關鍵字。其中 “”匹配任意一個字母,5個“”表示5個任意字母。
3.2 查詢姓名由5個字母構成,並且第5個字母為“i”的學生記錄
SELECT * FROM stu WHERE sname LIKE ‘____i’;
3.3 查詢姓名以“z”開頭的學生記錄
SELECT * FROM stu WHERE sname LIKE ‘z%’;
– 其中“%”匹配0~n個任何字母。
3.4 查詢姓名中第2個字母為“i”的學生記錄
SELECT * FROM stu WHERE sname LIKE ‘_i%’;
3.5 查詢姓名中包含“a”字母的學生記錄
SELECT * FROM stu WHERE sname LIKE ‘%a%’;
字段控制查詢(操作emp表)
4.1 去除重複記錄
去除重複記錄(兩行或兩行以上記錄中系列的上的數據都相同),例如emp表中sal字段就存在相同的記錄。當只查詢emp表的sal字段時,那麼會出現重複記錄,那麼想去除重複記錄,需要使用DISTINCT:
SELECT DISTINCT sal FROM emp;
4.2 查看僱員的月薪與佣金之和
因為sal和comm兩列的類型都是數值類型,所以可以做加運算。如果sal或comm中有一個字段不是數值類型,那麼會出錯。
SELECT *,sal+comm FROM emp;
comm列有很多記錄的值為NULL,因為任何東西與NULL相加結果還是NULL,所以結算結果可能會出現NULL。下面使用了把NULL轉換成數值0的函數IFNULL:
SELECT *,sal+IFNULL(comm,0) FROM emp;
4.3 給列名添加別名
在上面查詢中出現列名為sal+IFNULL(comm,0),這很不美觀,現在我們給這一列給出一個別名,為total:
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
給列起別名時,是可以省略AS關鍵字的:
SELECT *,sal+IFNULL(comm,0) total FROM emp;
排序 (操作stu表)
order by 列名 asc(默認) desc
5.1 查詢所有學生記錄,按年齡升序排序
SELECT * FROM stu ORDER BY sage ASC;
或者(默認)
SELECT * FROM stu ORDER BY sage;
5.2 查詢所有學生記錄,按年齡降序排序
SELECT * FROM stu ORDER BY age DESC;
5.3 查詢所有僱員,按月薪降序排序,如果月薪相同時,按編號升序排序
SELECT * FROM emp ORDER BY sal DESC,empno ASC;
聚合函數
聚合函數是用來做縱向運算的函數:
COUNT():統計指定列不為NULL的記錄行數;
MAX():計算指定列的最大值,如果指定列是字符串類型,那麼使用字符串排序運算;
MIN():計算指定列的最小值,如果指定列是字符串類型,那麼使用字符串排序運算;
SUM():計算指定列的數值和,如果指定列類型不是數值類型,那麼計算結果為0;
AVG():計算指定列的平均值,如果指定列類型不是數值類型,那麼計算結果為0;
COUNT()
當需要縱向統計時可以使用COUNT()。
查詢emp表中記錄數:
SELECT COUNT(*) AS cnt FROM emp;
查詢emp表中有佣金的人數:
SELECT COUNT(comm) cnt FROM emp;
注意,因為count()函數中給出的是comm列,那麼只統計comm列非NULL的行數。
查詢emp表中月薪大於2500的人數:
SELECT COUNT(*) FROM emp WHERE sal > 2500;
統計月薪與佣金之和大於2500元的人數:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;
查詢有佣金的人數,有領導的人數:
SELECT COUNT(comm), COUNT(mgr) FROM emp;
SUM和AVG
當需要縱向求和時使用sum()函數。
查詢所有僱員月薪和:
SELECT SUM(sal) FROM emp;
查詢所有僱員月薪和,以及所有僱員佣金和:
SELECT SUM(sal), SUM(comm) FROM emp;
查詢所有僱員月薪+佣金和:
SELECT SUM(sal+IFNULL(comm,0)) FROM emp;
或者
SELECT SUM(sal)+SUM(comm) FROM emp;
統計所有員工平均工資:
SELECT AVG(sal) FROM emp;
MAX和MIN
查詢最高工資和最低工資:
SELECT MAX(sal), MIN(sal) FROM emp;
分組查詢
當需要分組查詢時需要使用GROUP BY子句,例如查詢每個部門的工資和,這說明要使用部門來分組。
注:凡和聚合函數同時出現的列名,一定要寫在group by 之後
例如: 查詢男生,女生的人數
此處需要去除 gender 為 NULL 的數據
SELECT COUNT(*) FROM stu WHERE gender IS NOT NULL GROUP BY gender;
分組查詢
查詢每個部門的部門編號和每個部門的工資和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno;
查詢每個部門的部門編號以及每個部門的人數:
SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno;
查詢每個部門的部門編號以及每個部門工資大於1500的人數:
SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;
HAVING子句
查詢工資總和大於9000的部門編號以及工資和:
先查出所有部門編號和工資的和
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno;
再篩選出工資總和大於9000的
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;
查詢工資大於1500的,工資總和大於6000的部門編號以及工資和:
先求出 工資>1500 的部門編號和工資和
SELECT deptno,SUM(sal) FROM emp WHERE sal>1500 GROUP BY deptno ;
再篩選 工資綜合大於6000的部門編號
SELECT deptno,SUM(sal) FROM emp WHERE sal>1500 GROUP BY deptno HAVING SUM(sal)>6000;
注:
having與where的區別:
having是在分組後對數據進行過濾.
where是在分組前對數據進行過濾
having後面可以使用聚合函數(統計函數)
where後面不可以使用聚合函數
where 是分組前記錄的條件,如果某行記錄沒有滿足where子句的條件,那麼這行記錄不會參加分組;而 having 是分組後數據的約束。
圖解:
LIMIT
LIMIT用來限定查詢結果的起始行,以及總行數。
查詢5行記錄,起始行從0開始
SELECT * FROM emp LIMIT 0, 5;
注意: 起始行從0開始,即第一行開始!
原表:
limit 0,5 後
查詢10行記錄,起始行從3開始
SELECT * FROM emp LIMIT 3, 10;
分頁查詢
如果一頁記錄為10條,希望查看第3頁記錄應該怎麼查呢?
1. 第一頁記錄起始行為0,一共查詢10行;
2. 第二頁記錄起始行為10,一共查詢10行;
3. 第三頁記錄起始行為20,一共查詢10行;
DQL 書寫順序和執行順序
查詢語句書寫順序:
select – from- where - group by- having - order by - limit
查詢語句執行順序:
from - where - group by - having - select - order by - limit