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的意義、用法完全一樣