MySQL日常操作

MySQL 編程語言 技術 PHP愛好者 2017-07-17

安裝 MySQL 5.5.27 x64

  1. 一直 next

  2. 勾選使用圖形化配置

  1. 選擇 儘量佔用最大內存

  2. 選擇 多功能型

  3. 選擇 最多人數

  4. 選擇 utf8 字符集

  5. 選擇 添加path

刪除

  1. 停止MySQL

  2. 添加刪除程序中卸載MySQL

  3. 到安裝目錄刪除MySQL

登陸

>mysql -u root -p

退出

> quit

修改密碼

  1. 停止服務

    1. win + r

    2. services.msc

    3. 找到 MySQL 停止服務

  2. 進入 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

  1. 刪除前面創建的mydb3數據庫

    drop database mydb3;
  2. 找到MySQL 數據庫存放位置 data,刪除對應的數據庫

RENAME

找到MySQL 數據庫存放位置 data,將數據庫改為對應的名稱

操作數據表

創建表

  • 語法

    create table 表名(
  • 常用數據類型:

     int:整型
  • 練習

  1. 創建員工表的數據字典

  2. 創建員工表的SQL 語句

MySQL日常操作

MySQL日常操作

查詢表信息

  1. 當前數據庫中的所有表

    >SHOW TABLES;
  2. 查看錶的字段信息

    >DESC employee;

MySQL日常操作

修改表

追加

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;

MySQL日常操作

DML操作(重要)

  1. 查詢表中的所有數據

    SELECT * FROM 表名;
  2. DML是對 表中的數據 進行增、刪、改的操作。不要與DDL混淆了。

    1. INSERT

    2. UPDATE

    3. DELETE

  3. 小知識:

    1. 在mysql中, 字符串類型和日期類型 都要用 單引號 括起來。例如:’tom’ ‘2015-09-04’

    2. 空值:null (不佔內存) “”(佔內存)

  4. 使用 MySQL 客戶端工具 SQLyog

插入操作:INSERT:

  1. 語法:

    INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);
  2. 注意:

  1. 列名 與 列值 的類型、個數、順序要一一對應。

  2. 可以把 列名 當做java中的 形參,把列值當做 實參。

  3. 值不要超出 列 定義的長度。

  4. 如果插入 空值,請使用 null

  5. 插入的日期和字符一樣,都使用引號括起來。

  1. 練習

    -- 創建表 emp

修改操作 UPDATE:

  1. 語法:

    UPDATE 表名 SET 列名1=列值1,列名2=列值2 。。。 [WHERE 列名=值]
  2. 練習:

    -- 將所有員工薪水修改為5000元。

刪除操作 DELETE:

  1. 語法 :

    DELETE FROM 表名 [WHERE 列名=值]
  2. 練習 :

    -- 刪除表中名稱為’zs’的記錄。
  3. DELETE 與 TRUNCATE 的區別

    1. DELETE 刪除表中的數據,表結構還在;刪除後的數據可以找回

    2. TRUNCATE 刪除是把表直接DROP掉,然後再創建一個同樣的新表。

    3. TRUNCATE 刪除的數據不能找回。執行速度比DELETE快。

RENAME TABLE命令語法:

  1. 使用命令:

    RENAME TABLE db_name.table1 TO new_db_name.table1,
  2. 找到MySQL 數據庫存放位置 data,找到對應的數據庫,找到對應的xx.frm 文件,修改名稱

DQL數據查詢語言 (重要)

  1. 數據庫執行 DQL語句 不會對數據進行改變,而是讓數據庫發送結果集給客戶端。

    查詢返回的結果集是一張虛擬表。

  2. 查詢關鍵字:SELECT

  3. 語法:

    SELECT 列名 FROM表名 [WHERE --> GROUP BY -->HAVING--> ORDER BY]
  4. 語法詳細說明:

     SELECT selection_list /*要查詢的列名稱*/

根據數據字典 創建表

學生表:stu

MySQL日常操作

-- 創建學生表

MySQL日常操作

僱員表:emp

MySQL日常操作

-- 創建僱員表

MySQL日常操作

部門表:dept

MySQL日常操作

-- 創建部門表

MySQL日常操作

基礎查詢

  1. 查詢所有列

    SELECT * FROM stu;

  2. 查詢指定列

    SELECT sid, sname, age FROM stu;

MySQL日常操作

MySQL日常操作

條件查詢(操作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;

MySQL日常操作

2.3 查詢學號為S_1001,或者姓名為liSi的記錄

SELECT * FROM stu WHERE sid=’S_1001’ OR sname=’lisi’;

MySQL日常操作

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’);

MySQL日常操作

2.5 查詢學號不是S_1001,S_1002,S_1003的記錄

SELECT * FROM stu WHERE sid NOT IN(‘S_1001’,’S_1002’,’S_1003’);

MySQL日常操作

2.6 查詢年齡為null的記錄

SELECT * FROM stu WHERE age IS NULL;

SELECT * FROM stu WHERE age IS NOT NULL;

MySQL日常操作

2.7 查詢年齡在20到40之間的學生記錄

SELECT * FROM stu WHERE age>=20 AND age<=40;

SELECT * FROM stu WHERE age BETWEEN 20 AND 40;

MySQL日常操作

2.8 查詢性別非男的學生記錄

SELECT * FROM stu WHERE gender=’female’;

SELECT * FROM stu WHERE gender!=’male’;

SELECT * FROM stu WHERE gender<>’male’;

MySQL日常操作

2.9 查詢姓名不為null的學生記錄

SELECT * FROM stu WHERE sname IS NOT NULL;

MySQL日常操作

模糊查詢(操作stu表)

  • 當想查詢姓名中包含a字母的學生時就需要使用模糊查詢了。模糊查詢需要使用關鍵字LIKE。

  • 通配符:

    _ 任意一個字符

3.1 查詢姓名由5個字母構成的學生記錄

SELECT * FROM stu WHERE sname LIKE ‘_‘;

– 模糊查詢必須使用LIKE關鍵字。其中 “”匹配任意一個字母,5個“”表示5個任意字母。

MySQL日常操作

3.2 查詢姓名由5個字母構成,並且第5個字母為“i”的學生記錄

SELECT * FROM stu WHERE sname LIKE ‘____i’;

MySQL日常操作

3.3 查詢姓名以“z”開頭的學生記錄

SELECT * FROM stu WHERE sname LIKE ‘z%’;

– 其中“%”匹配0~n個任何字母。

MySQL日常操作

3.4 查詢姓名中第2個字母為“i”的學生記錄

SELECT * FROM stu WHERE sname LIKE ‘_i%’;

MySQL日常操作

3.5 查詢姓名中包含“a”字母的學生記錄

SELECT * FROM stu WHERE sname LIKE ‘%a%’;

MySQL日常操作

字段控制查詢(操作emp表)

4.1 去除重複記錄

去除重複記錄(兩行或兩行以上記錄中系列的上的數據都相同),例如emp表中sal字段就存在相同的記錄。當只查詢emp表的sal字段時,那麼會出現重複記錄,那麼想去除重複記錄,需要使用DISTINCT:

SELECT DISTINCT sal FROM emp;

MySQL日常操作

4.2 查看僱員的月薪與佣金之和

因為sal和comm兩列的類型都是數值類型,所以可以做加運算。如果sal或comm中有一個字段不是數值類型,那麼會出錯。

SELECT *,sal+comm FROM emp;

MySQL日常操作

comm列有很多記錄的值為NULL,因為任何東西與NULL相加結果還是NULL,所以結算結果可能會出現NULL。下面使用了把NULL轉換成數值0的函數IFNULL:

SELECT *,sal+IFNULL(comm,0) FROM emp;

MySQL日常操作

4.3 給列名添加別名

在上面查詢中出現列名為sal+IFNULL(comm,0),這很不美觀,現在我們給這一列給出一個別名,為total:

SELECT *, sal+IFNULL(comm,0) AS total FROM emp;

MySQL日常操作

給列起別名時,是可以省略AS關鍵字的:

SELECT *,sal+IFNULL(comm,0) total FROM emp;

MySQL日常操作

排序 (操作stu表)

  • order by 列名 asc(默認) desc

5.1 查詢所有學生記錄,按年齡升序排序

SELECT * FROM stu ORDER BY sage ASC;

或者(默認)

SELECT * FROM stu ORDER BY sage;

MySQL日常操作

5.2 查詢所有學生記錄,按年齡降序排序

SELECT * FROM stu ORDER BY age DESC;

MySQL日常操作

5.3 查詢所有僱員,按月薪降序排序,如果月薪相同時,按編號升序排序

SELECT * FROM emp ORDER BY sal DESC,empno ASC;

MySQL日常操作

聚合函數

  • 聚合函數是用來做縱向運算的函數:

  • COUNT():統計指定列不為NULL的記錄行數;

  • MAX():計算指定列的最大值,如果指定列是字符串類型,那麼使用字符串排序運算;

  • MIN():計算指定列的最小值,如果指定列是字符串類型,那麼使用字符串排序運算;

  • SUM():計算指定列的數值和,如果指定列類型不是數值類型,那麼計算結果為0;

  • AVG():計算指定列的平均值,如果指定列類型不是數值類型,那麼計算結果為0;

COUNT()

當需要縱向統計時可以使用COUNT()。

查詢emp表中記錄數:

SELECT COUNT(*) AS cnt FROM emp;

MySQL日常操作

查詢emp表中有佣金的人數:

SELECT COUNT(comm) cnt FROM emp;

注意,因為count()函數中給出的是comm列,那麼只統計comm列非NULL的行數。

MySQL日常操作

查詢emp表中月薪大於2500的人數:

SELECT COUNT(*) FROM emp WHERE sal > 2500;

MySQL日常操作

統計月薪與佣金之和大於2500元的人數:

SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;

MySQL日常操作

查詢有佣金的人數,有領導的人數:

SELECT COUNT(comm), COUNT(mgr) FROM emp;

MySQL日常操作

SUM和AVG

當需要縱向求和時使用sum()函數。

查詢所有僱員月薪和:

SELECT SUM(sal) FROM emp;

MySQL日常操作

查詢所有僱員月薪和,以及所有僱員佣金和:

SELECT SUM(sal), SUM(comm) FROM emp;

MySQL日常操作

查詢所有僱員月薪+佣金和:

SELECT SUM(sal+IFNULL(comm,0)) FROM emp;

或者

SELECT SUM(sal)+SUM(comm) FROM emp;

MySQL日常操作

統計所有員工平均工資:

SELECT AVG(sal) FROM emp;

MySQL日常操作

MAX和MIN

查詢最高工資和最低工資:

SELECT MAX(sal), MIN(sal) FROM emp;

MySQL日常操作

分組查詢

  • 當需要分組查詢時需要使用GROUP BY子句,例如查詢每個部門的工資和,這說明要使用部門來分組。

注:凡和聚合函數同時出現的列名,一定要寫在group by 之後

MySQL日常操作

  • 例如: 查詢男生,女生的人數

MySQL日常操作

此處需要去除 gender 為 NULL 的數據

MySQL日常操作

SELECT COUNT(*) FROM stu WHERE gender IS NOT NULL GROUP BY gender;

MySQL日常操作

分組查詢

查詢每個部門的部門編號和每個部門的工資和:

SELECT deptno, SUM(sal)

FROM emp

GROUP BY deptno;

MySQL日常操作

查詢每個部門的部門編號以及每個部門的人數:

SELECT deptno,COUNT(*)

FROM emp

GROUP BY deptno;

MySQL日常操作

查詢每個部門的部門編號以及每個部門工資大於1500的人數:

SELECT deptno,COUNT(*)

FROM emp

WHERE sal>1500

GROUP BY deptno;

MySQL日常操作

HAVING子句

查詢工資總和大於9000的部門編號以及工資和:

  • 先查出所有部門編號和工資的和

    SELECT deptno, SUM(sal)

    FROM emp

    GROUP BY deptno;

MySQL日常操作

  • 再篩選出工資總和大於9000的

    SELECT deptno, SUM(sal)

    FROM emp

    GROUP BY deptno

    HAVING SUM(sal) > 9000;

MySQL日常操作

查詢工資大於1500的,工資總和大於6000的部門編號以及工資和:

  • 先求出 工資>1500 的部門編號和工資和

    SELECT deptno,SUM(sal) FROM emp WHERE sal>1500 GROUP BY deptno ;  

MySQL日常操作

  • 再篩選 工資綜合大於6000的部門編號

    SELECT deptno,SUM(sal) FROM emp WHERE sal>1500 GROUP BY deptno HAVING SUM(sal)>6000;

MySQL日常操作

注:

having與where的區別:

  1. having是在分組後對數據進行過濾.

    where是在分組前對數據進行過濾

  2. having後面可以使用聚合函數(統計函數)

    where後面不可以使用聚合函數

  3. where 是分組前記錄的條件,如果某行記錄沒有滿足where子句的條件,那麼這行記錄不會參加分組;而 having 是分組後數據的約束。

圖解:

MySQL日常操作

LIMIT

LIMIT用來限定查詢結果的起始行,以及總行數。

查詢5行記錄,起始行從0開始

SELECT * FROM emp LIMIT 0, 5;

注意: 起始行從0開始,即第一行開始!

原表:

MySQL日常操作

limit 0,5 後

MySQL日常操作

查詢10行記錄,起始行從3開始

SELECT * FROM emp LIMIT 3, 10;

MySQL日常操作

分頁查詢

如果一頁記錄為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

相關推薦

推薦中...