MySQL基礎命令筆記

數據類型(列類型)
DDL-數據定義語言
DML-數據操作語言
DCL-數據控制語言
DQL-數據查詢語言
source命令的備份與還原
數據庫約束
表關係
三範式
多表查詢

  • DDL(Data Definition Language):數據定義語言
     創建、刪除、修改:庫、表結構
  • DML(Data Manipulation Language):數據操作語言
     增、刪、改:表記錄
  • DCL(Data Control Language):數據控制語言
     用來定義訪問權限和安全級別
  • DQL(Data Query Language):數據查詢語言
     用來查詢記錄(數據)

show variables like ‘character%’;:查看mysql當前使用的編碼

//寫多條語句時,需要加BEGIN和END

//默認情況下, 在CMD中操作mysql遇到分號也就是;就會認爲語句結束了。
在創建存儲過程中有許多分號,因此需要先執行一個DELIMITER //語句,將//作爲語句結束的字符 delimiter是mysql分隔符,在mysql客戶端中分隔符默認是分號,如果使用delimiter設置了其他的分隔符,再重新設置回分號即可。命令 delimiter ;


數據類型(列類型)

int:整型
double:浮點型,例如double(5,2)表示最多5位,其中必須有2位小數
decimal:浮點型,在表單錢方面使用該類型,因爲不會出現精度缺失問題
char:固定長度字符串類型:char(255),數據長度不足指定長度,補足到指定長度
varchar:可變長度字符串類型;varchar(65535),數據長度不足不會補足空格
text(clob):字符串類型:mysql獨有的
blob:二進制數據存儲,字節類型
date:日期類型,格式爲:yyyy-MM-dd;
time:時間類型,格式爲:hh:mm:ss
timestamp:時間戳類型,既有時分秒,又有年月日


DDL-數據定義語言

DDL之操作數據庫:數據庫或表的結構操作([]中都是可選) > - SHOW DATABASES;:查看所有數據庫 > - USE 數據庫名稱;:進入數據庫 > - CREATE DATABASE [IF NOT EXISTS] 數據庫名稱 [CHARSET=utf8];:創建數據庫 > - DROP DATABASE [IF EXISTS] 數據庫名稱;:刪除數據庫 > - ALTER DATABASE 數據庫名稱 CHARACTER SET utf8;:修改數據庫編碼

DDL之操作表:

  • CREATE TABLE 表名 (列名 列類型,列名 列類型, …);:創建表
  • SHOW CREATE TABLE 表名;;查看指定表的創建語句
  • SHOW TABLES;:查看當前庫的所有表
  • DROP TABLE 表名;:刪除表
  • DESC 表名;:查看錶結構
  • ALTER TABLE 表名 RENAME TO 新表名;:重命名錶名
  • ALTER TABLE 表名 ADD 列名 列類型, ADD 列名 列類型,…;:添加列
  • ALTER TABLE 表名 DROP 列名:刪除列
  • ALTER TABLE 表名 MODIFY 列名 列類型;:修改列類型
  • ALTER TABLE 表名 ADD PRIMARY KEY(列名);:給表添加主鍵,刪除把add改爲drop
  • ALTER TABLE newcar CHANGE id id int(11) NOT NULL AUTO_INCREMENT;:修改mysql表的字段爲自增長
  • CREATE PROCEDURE all_stu() select * from stutbl;:創建存儲過程查詢某表所有數據
  • ALTER TABLE 表名 character set 字符集;:修改字符集

DML-數據操作語言

DML之增、刪、改數據

  • 插入數據:
    插入記錄總是插入一行,未給定值的都插入NULL
    INSERT INTO 表名(列名,列名,…) values (‘列值’,‘列值’,…);:按對應的列名插入值
    INSERT INTO 表名 values (‘列值’,‘列值’,…):按表的順序插入值
    CREATE TABLE student2 LIKE student;:創建表student2結構和student一樣
    INSERT INTO student2(name,age) SELECT name,age FROM student;:將student中的name,age字段數據插入到student2
  • 修改數據:
    UPDATE 表名 SET 列名1 = ‘列值1’ [WHERE 條件]:修改數據
    運算符:=、!=、<>,BETWEEN … AND …,NULL,IN(…)、IS NULL、NOT、OR、AND
  • 刪除數據:
    DELETE FROM 表名 [WHERE 條件]:刪除數據,不加條件數據全部被刪除
    TRUNCATE TABLE 表名;:刪除表記錄
    truncate和delete的區別:
      1. delete是將表中的數據一條一條刪除
      2. truncate是將整個表摧毀,重新創建一個新的表,新的表結構和原來表結構一模一樣

DCL(理解)-數據控制語言

* 一個項目創建一個用戶!一個項目對應的數據庫只有一個! * 這個用戶只能對這個數據庫有權限,其他數據庫你就操作不了了!
  1. 創建用戶
    * CREATE USER ‘用戶名’@‘IP地址’ IDENTIFIED BY ‘密碼’;
    用戶只能在指定的IP地址上登錄
    * CREATE USER ‘用戶名’@’%’ IDENTIFIED BY ‘密碼’;
    用戶可以在任意IP地址上登錄
  2. 給用戶授權
    * GRANT 權限1,…,權限n ON 數據庫.表名 TO 用戶名@IP地址;
    權限、用戶、數據庫
    給用戶分派在指定的數據庫上的指定的權限
    * GRANT ALL ON 數據庫.* TO 用戶名@IP地址
    給用戶分派指定數據庫上的所有權限
  3. 撤銷權限
    * REVOKE 權限1,…,權限n ON 數據庫.* FROM 用戶名@IP地址;
    撤銷指定用戶在指定數據庫上的指定權限
  4. 查看權限
    * SHOW GRANTS FOR 用戶名@IP地址
    查看指定用戶的權限
  5. 刪除用戶
    * DROP USER 用戶名@IP地址

DQL-數據查詢語言

----查詢不會修改數據庫表記錄!
一、 基本查詢

  1. 查詢所有列
    SELECT * FROM 表名;
    例:SELECT * FROM emp;
    –> 其中“*”表示查詢所有列
  2. 指定列查詢
    SELECT 列1[,列2,…,列n] FROM 表名;
    例:SELECT empno,sal FROM emp;
  3. 完全重複的記錄只顯示一次
    列名前加關鍵字 DISTINCT
    當查詢結果中多行記錄一模一樣時,只顯示一行
    SELECT DISTINCT * | 列1[,列2,…,列n] FROM 表名;
    例:SELECT DISTINCT sal FROM emp;
    –> 顯示emp表中的工資,如果存在相同的工資只顯示一次
  4. 列運算
    4.1 數量類型的列可以做加、減、乘、除運算
     SELECT sal*1.5 FR0M emp;
     SELECT sal+ifnull(comm,0) FROM emp;
      --> 必須是數值類型,字符型則等於0
    4.2 轉換NULL值
      > 任何類型跟NULL相加還是NULL,要想相加,則需要用函數IFNULL(列名,值);
      --> 有時需要把NULL轉換成其他值,如com+1000時,如果com列存在NULL值,那麼NULL+1000還是NULL,而我們希望把NULL當0來運算SELECT IFNULL(comm,0)+1000 FROM emp;
     --> IFNULL(comm,0):如果comm中存在NULL值,那麼當成0來運算。
    4.3 字符串類型做連續運算
     > 函數CONCAT(‘str1’, ‘str2’[列名], …,)
     例:SELECT CONCAT(‘我叫’,ename,‘我的工作是’,job) AS 介紹 FROM emp;
    4.4 給列起別名
     > SELECT 列名 AS 新列名(AS可以省略) FROM 表名;
     -->SELECT ename 姓名,job 職業 from emp;

二、條件查詢

  1. 條件查詢

    與UPDATE、DELETE語句一樣,SELECT語句也可以使用WHERE字句來控制記錄。

  2. 模糊查詢

    模糊查詢需要使用運算符:LIKE, 匹配一個任意字符, %匹配多個任意字符
    例:SELECT * FROM emp WHERE ename LIKE '張
    ’;
    –> 查詢姓張,名字只有一個字的人
    SELECT * FROM emp WHERE ename LIKE ‘張%’;
    –> 查詢姓張,名字有一個或幾個字的人
    SELECT * FROM emp WHERE ename LIKE ‘%小%’;
    –> 查詢名字裏含有小字的人

  3. 一些等價和注意的東西

    WHERE age >= 18 AND age <= 80 等價於 WHERE age BETWEEN 18 AND 80
    WHERE name=‘zhangsan’ OR name=‘lisi’ 等價於 WHERE name IN(‘zhangsan’,‘lisi’)
    WHERE age IS NULL,不能使用等號
    WHERE age IS NOT NULL

三、排序

  1. 升序

    SELECT * FROM 表名 ORDER BY 列名 ASC;
    –> ASC的全寫是Ascend,可以省略

  2. 降序

    SELECT * FROM 表名 ORDER BY 列名 DESC;
    –> DESC的全寫是Descend,不可以省略

  3. 使用多列作爲排序條件

    在第一列中存在重複值時,引入第二列排序或第n列排序
    SELECT * FROM 表名 ORDER BY 字段名1 ASC,字段名2 DESC;

四、聚合函數

  1. COUNT

    SELECT COUNT(*) FROM 表名
    –> 計算表中一行中任意一列不爲NULL的記錄的行數
    SELECT COUNT(列名) FROM 表名
    –> 計算表中的列不爲NULL的記錄的行數

  2. MAX

    求列中的最大值

  3. MIN

    求列中的最小值

  4. SUM

    查詢一列的和
    例:SELECT SUM(sal) 總和 FROM emp;

  5. AVG

    查詢一列的平均數
    例:SELECT COUNT(*) 人數,SUM(sal) 工資和,MAX(sal) 最高工資,MIN(sal) 最低工資 FROM emp;

五、分組查詢
分組查詢是把記錄使用某一列進行分組,然後查詢組信息。

mysql語法順序:
select [distinct] 列名,聚合函數(*不能含有其他列)
from 表名
[join(如left join)]
[on]
[where 條件] -> 這是分組前篩選
[group by] 列名
[having 條件:一般爲聚合函數] -> 這是分組後篩選
[union]
[order by 列名或聚合函數 ASC或DESC]
[limit 子句]

mysql執行順序:
from
on
join
where
group by
having
select
distinct
union
order by

例:SELECT sal,count() FROM emp WHERE sal>10000 GROUP BY deptno HAVING count()>=2 ORDER BY deptno DESC;

having和where的區別

  • having是在分組後對數據進行過濾;where是在分組前對數據進行過濾
  • having後面可以使用聚合函數;where後面不可以使用聚合函數

六、limit子句(方言)

只能在mysql中使用
LIMIT用來限定查詢結果的起始行,以及總數行。起始行計算方法:(當前頁-1)*每頁記錄數
LIMIT offset,length(其實就是從第0行開始跳過offset條,查詢之後的length條數據)
例:SELECT * FROM emp LIMIT 0,5;
–> 其中0表示從第一行開始,顯示五條記錄


source命令的備份與還原

備份格式: `mysqldump -u用戶名 -p密碼 數據庫 > 文件的路徑` 還原格式: `SOURCE 導入文件的路徑` 注意:還原的時候需要先登錄mysql,並選中對應的數據庫

數據庫約束

約束種類有

  1. PRIMARY KEY:主鍵
  2. UNIQUE:唯一
  3. NOT NULL:非空
  4. DEFAULT:默認
  5. FOREIGN KEY:外鍵
  1. 主鍵
      特點:主鍵必須包含唯一的值,且主鍵不能爲空
      創建方式:在創建表的時候給字段添加主鍵
        格式:字段名 字段類型 PRIMARY KEY
      刪除主鍵:ALTER TABLE 表名 DROP PRIMARY KEY;
      主鍵自增:
        格式:字段名 字段類型 PRIMARY KEY AUTO_INCREMENT
      默認自增值爲1,若修改起始值則:
        格式:ALTER TABLE 表名 AUTO_INCREMENT = 起始值
      DELETE和TRUNCATE的區別擴展:
        DELETE 刪除表中的數據,但不重置AUTO_INCREMENT的值;TRUNCATE 摧毀表,重建表,AUTO_INCREMENT重置爲1
  2. 唯一
      格式:字段名 字段類型 UNIQUE
  3. 非空
      格式:字段名 字段類型 NOT NULL
  4. 默認值
      格式:字段 字段類型 DEFAULT 默認值
      一張表中某個字段設置了非空與唯一約束,該字段與主鍵的區別:1、一張表只有一個字段可以設置成主鍵。2、一張表可以有多個字段非空與唯一約束。3、主鍵可以自動增長,非空與唯一約束的字段不能自動增長
  5. 外鍵
      外鍵約束:一張從(副)表中的某個字段引用另一個主表的主鍵,其中主表用於約束別人,從表使用別人的數據,被別人約束
      新建表時增加外鍵:
      [CONSTRAINT] [外鍵約束名稱] FOREIGN KEY(外鍵字段名) REFERENCES 主表名(主鍵字段名) [ON UPDATE CASCADE] [ON DELETE CASCADE]
      修改表時增加外鍵:
      ALTER TABLE 表名 ADD CONSTRAINT 外鍵約束名稱 FOREIGN KEY(外鍵字段名) REFERENCES 主表名(主鍵字段名)
      外鍵級聯:在修改和刪除主表的主鍵時,同時更新或刪除副表的外鍵值
      ON UPDATE CASCADE – 級聯更新,主鍵發生更新時,外鍵也會更新
      ON DELETE CASCADE – 級聯刪除,主鍵發生刪除時,外鍵也會刪除

表關係

一對多建表原則:在從表(多)創建一個字段作爲外鍵指向主表(一)的主鍵
多對多建表原則:形成中間表,兩個表爲主表(一),中間表爲從表(多),形成兩個一對多關係
一是主,多是從,哪個表有外鍵哪個是從
一對一建表原則:兩種,在實際的開發中應用不多.因爲一對一可以創建成一張表。
  1.外鍵唯一:主表的主鍵和從表的外鍵(唯一),形成主外鍵關係。
  2.外鍵是主鍵:主表的主鍵和從表的主鍵,形成主外鍵關係。


三範式

第一範式:每一列都不能再拆開

第二範式:一張表只描述一件事情、表中的每個字段都依賴於主鍵
如果不遵守第二範式,數據冗餘,相同數據無法區分。通過第二範式減少數據冗餘,通過主鍵區分相同數據。

第三範式:使用主外鍵方式關聯,而不是使用非主鍵關聯
主鍵(非業務字段) 非主鍵(業務字段)


多表查詢

多表查詢步驟:

  1. 確定表
  2. 確定關聯關係
  3. 需要查詢哪些字段
  1. 內連接:用左邊表的記錄去匹配右邊表的記錄,如果符合條件的則顯示(兩表的交集)
    隱式內連接:看不到JOIN關鍵字,條件使用WHERE指定
    SELECT 字段名 FROM 左表,右表 WHERE 條件;
    顯式內連接:使用INNER JOIN ... ON語句,可以省略INNER
    SELECT 字段名 FROM 左表 INNER JOIN 右表 ON 條件
  2. 左外連接:用左表的記錄去匹配右邊表的記錄,符合條件則顯示;否則顯示NULL(在內連接基礎上保證左表數據全部顯示)
    使用LEFT [OUTER] JOIN ... ON,OUTER可以省略
    SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 條件;
  3. 右外連接:用右表的記錄去匹配左邊表的記錄,符合條件則顯示;否則顯示NULL(在內連接基礎上保證右表數據全部顯示)
    使用RIGHT [OUTER] JOIN ... ON,OUTER可以省略
    SELECT 字段名 FROM 左表 RIGHT [OUTER] JOIN 右表 ON 條件;
  4. 子查詢
    子查詢結果如果只是要單列,肯定在WHERE後面作爲條件(多行時父查詢用IN運算符)
    SELECT 查詢條件 FROM 表 WHERE 字段=(子查詢);
    子查詢結果如果是要多列多行,肯定在FORM後面作爲條件
    SELECT 查詢條件 FROM (子查詢) 表別名 WHERE 條件

mysql拷貝數據

詳細:https://www.cnblogs.com/lyjing/p/8483742.html

複製表結構:
  CREATE TABLE 新表名 LIKE 舊錶名
複製表數據:
  CREATE TABLE 新表名 AS (SELECT * FROM 舊錶名)INSERT INTO 新表名 (SELECT * FROM 舊錶名)
真正的複製一個表(表結構和表數據):
   CREATE TABLE 新表名 LIKE 舊錶名
   CREATE TABLE 新表名 AS (SELECT * FROM 舊錶名)INSERT INTO 新表名 (SELECT * FROM 舊錶名)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章