MySql數據庫基礎知識

SQL語句分類

  • DDL(Data Definition Language):數據定義語言,用來定義數據庫對象:庫、表、列等。
  • DML(Data Manipulation Language):數據操作語言,用來定義數據庫記錄(數據)。
  • DCL(Data Control Language):數據控制語言,用來定義訪問權限和安全級別。
  • DQL(Data Query Language):數據查詢語言,用來查詢記錄(數據)。
    ​*注意sql語句以;結尾

MySQL數據庫操作常見指令

數據庫的增刪改查

  • show dataBases;
  • use 數據庫;
  • use table ;
  • create database 數據庫名
  • drop database 數據庫名

數據庫表的增刪改查

  • create table t_name (字段 字段類型,。。。。);
  • alter table t_name add(增)/modify(改) 字段名 字段名類型
  • alter table t_name change 舊字段名 字段名類型 新字段名 字段名類型
  • alter table t_name drop 字段名
  • desc table t_name (查)
  • drop table t_name;
  • show table

數據庫表中內容的操作

  • insert into t_name values(字段值。。。。。);
  • update t_name set 字段=值,字段=值,字段=值 where 條件(無條件全改);
  • delete from t_name where 條件(無條件全刪);

having 和 where 的異同

相同的:
	都可以對查詢的內容進行條件篩選
不同的:
	where直接對磁盤的數據進行篩選
	having對分組查詢後存放在內存中的數據進行篩選
	
	where查詢得到的結果只有一行
	having查詢得到的結果又很多行,最大和分組得到的行數一致
	
	where之後的條件不能直接是聚合函數
	having之後的條件可以使聚合函數

關鍵字的順序

  • 各關鍵字書寫順序
    • select -> from -> where -> group by -> having -> order by -> limit
  • 各關鍵字的執行順序
    • from-> where-> select-> group by-> having-> order by-> limit

分頁查詢–每頁M條數據,第N頁 limit (N-1)*M,M

寫一個表達式,每頁顯示3條內容

  • 第一頁 limit 0,3
  • 第二頁 limit 3,3
  • 第三頁 limit 6,3
  • 第四頁 limit 9,3
  • 。。。
  • 第N頁 limit (N-1)*3,3

SQL語句的複合語句

select * from t_name whrer 條件1 group by 字段1having 條件

  • 先按照條件1查詢
  • 結果按字段(字段爲結果中的字段)分組並按照having中條件篩選分組(去重)

外鍵約束補充

  • 外鍵約束的注意事項
    • 1)所謂的外鍵,其實是一個表裏的一個列,該類必須引用(參考)自另外一張表中的主鍵。此時該列就稱爲外鍵。該表就稱爲從表,而另一張被參考的表稱爲主表。
    • 2)外鍵的數據類型必須和主表的主鍵的數據類型一致。列名可以不同。
    • 3)外鍵可以是null值。
    • 4)主表中的主鍵的值被刪除,會影響到外鍵

域完整性約束

  • 插入的字段值要和表結構中的字段數量、類型、順序保持一致

字段數據類型

int
bigint
char
varchar
text
mediumtext
longtext
time
date
datetime
year
float
double

主鍵約束

  • primary key

    • 一個表中只能存在一個主鍵,但可以有多個聯合主鍵
    • 被設置爲主鍵的列,本列中不能存放重複的元素
    • 可以與其他表的列關聯,形成外鍵關係
  • 設置外鍵的方法

    • 直接在建表時候指定

      • create table tb_name(id int auto_increment primary key,name varchar(20),…);
      • create table tb_name(id int auto_increment,name varchar(20),…,primary key(id));
    • 在表創建完成後通過修改的方法設置主鍵

      • 修改表中的字段約束,設置爲主鍵
        • ALTER TABLE stu MODIFY sid CHAR(6) PRIMARY KEY;
      • 通過修改的方法向表中添加主鍵
        • ALTER TABLE stu ADD PRIMARY KEY(sid)
    • 設置聯合主鍵

      • create table classmate(id int,name varchar(20),addr varchar(20),primary key(name,addr));

表和表之間關係的介紹

  • 表和表之間的關係
    • 一對一
      • 你的個人信息(教育信息、身體信息、個人品性等信息);
    • 一對多
      • 一個班級有多個學生,一個護士對應着多個病人
    • 多對多
      • 一個學生選擇了多門課,一門課可以被多個學生選。

聯合查詢–union,union all

  • 把多種表中查詢得到的數據上下拼接起來

  • 必須保證列的數量是一致的

  • 跟列的名字沒有關係

  • union查詢得到的結果默認會去除完全重複的記錄,表頭爲Union第一個表

  • union all可以保留重複的數據

  • select * from stu03 
    union 
    SELECT * from STU01;
    --查詢的表頭爲stu03 的內容
    

連接查詢-內連接,外連接(左,右外連接,全連接)

  • 將查詢得到的結果左右拼接起來

  • 默認的方式會採用笛卡爾積的形式顯示,無效數據很多

  • 我們可以採用where限制條件的方式,顯示指定的結果

  • 還可以使用查詢部分字段的方式,去除重複數據

    -- 連接查詢
    select * from stu01,stu02;
    -- 產生了很多沒有用處的結果,可以使用where對查詢條件加以限制
    select * from stu01,stu02 where stu01.name = stu02.name;
    -- 可以查詢部分字段,去除重複結果
    select stu01.*,stu02.addr,stu02.intro from stu01,stu02 where stu01.name=stu02.name;
    -- 使用別名
    select a.*,b.addr,b.intro from stu01 as a,stu02 as b where a.name=b.name;
    

    內連接查詢 (select * from A join B on 條件)-交集

  • 查詢兩張表中的交集

  • 格式

    • select * from A join B on A.name=B.name;
    -- 內連接查詢
    select * from stu01 join stu02 on stu01.name=stu02.name;
    select * from stu01,stu02 where stu01.name=stu02.name;
    

左外連接查詢 (select * from A left[outer] join B on 條件)

  • 查詢左側表中所有的內容 & 右側表中和左側表中指定條件相同部分的內容

  • 格式

    • select * from A left [outer] join B on A.name=B.name;
    -- 左[外]連接查詢
    select * from stu01 LEFT JOIN stu02 on stu01.name=stu02.name;
    select * from stu01 LEFT OUTER JOIN stu02 on stu01.name=stu02.name;
    

右外連接查詢 (select * from A right[outer] join B on 條件)

  • 查詢右側表中所有的內容 & 左側表中和右側表中條件形同的部分內容

  • 格式

    • select * from A right [outer] join B on A.name=B.name;
    -- 右[外]連接查詢
    select * from stu01 RIGHT JOIN stu02 on stu01.name=stu02.name;
    select * from stu01 RIGHT OUTER JOIN stu02 on stu01.name=stu02.name;
    

全連接查詢=左外連接 +union +右外連接 =全集

  • 查詢A、B表中所有的內容,把這些內容聯合起來,相同條件部分的內容在同一行顯示
  • MySQL中沒有提供全連接查詢的方式
  • 我們可以把左連接和右連接查詢得到的結果使用union聯合
  • A 和B的位置裝換的全連接內容一樣
select * from stu01 LEFT JOIN stu02 on stu01.name=stu02.name
union
select * from stu01 RIGHT JOIN stu02 on stu01.name=stu02.name;

子查詢

標量子查詢

  • 把一個單個的查詢結果當做條件

  • 標量子查詢

    • 產生滿足字段和後面標結果的記錄

    • 查詢高於平均年齡的好漢的信息

      • select * from shuihu where age>(select avg(age) from shuihu);

行子查詢

  • 產生一(多)行多列的記錄
  • 查詢出與zhangsan的薪水和部門完全相同的員工的信息
  • select * from mpe where sal=(select sal from mpe where ename=‘SCOTT’) and job=(select job from mpe where ename=‘SCOTT’);
  • select * from mpe where (sal,job) in (select sal,job from mpe where ename=‘SCOTT’);

列子查詢

  • 產生一列的記錄

  • 查詢出是主管的員工的信息

  • select * from mpe where mpr in (select empno from mpe where ename=“SCOTT”);

表子查詢

  • 從產生一張虛擬表查詢結果

  • 查詢出工資最高的前3名員工的信息

    • select * from (select * from mpe order by sal desc as t) as a limit 3;
    • select * from emp order by sal desc limit 3;
  • 注意: 表子查詢需要給子查詢出的虛擬表起一個別名

ANY和ALL

any

  • any,任意一個,只要有一個滿足條件即可

  • 查詢工資高於任一個經理的分析師的信息

    • select * from emp where sal>ANY(select sal from emp where job=“MANAGER”) AND job=“ANALYST”;

all

  • 所有的,滿足全部條件纔可以
  • 查詢工資高於所有經理的員工信息
    • SELECT * FROM EMP where sal>all(select sal from emp where job=“MANAGER”);

some

  • 和any的意義、用法完全一樣
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章