MySQL中的SQL語言

SQL語言

SQL(Structure Query Language)分爲四種語言mysql

  • 數據查詢語言DQL
  • 數據操縱語言DML
  • 數據定義語言DDL
  • 數據控制語言DCL

DDL(數據定義語言)

DDL全稱:data defination language。主要是MYSQL的建庫,建表操做sql

  1. 建立數據庫 create database <databaseName> charset utf8;shell

  2. 顯示全部數據庫 show databases;數據庫

  3. 使用數據庫 use <databaseName>安全

  4. 建立表 create table <tableName> (field type... , field type... , ...);併發

    例:create table teacher (id int primary key auto_increment, name varchar(10));oracle

  5. 顯示全部的表 show tableside

  6. 查表所含的字段 desc <tableName>;函數

  7. 給表加字段 alter table <tableName> add 字段名 字段類型code

  8. 修改字段的類型 alter table 表名 modify 字段名 字段類型;

  9. 刪除字段 alter table 表名 drop 字段名;

  10. 修改表名 rename table 原名字 to 新名字;

  11. 查看建表的細節 show create table 表名;

  12. 修改表的字符集 alter table 表名 character set 字符集名稱

  13. 修改列/字段名 alter table 表名 change 原始列/字段名 新列/字段名 字段類型;

  14. 刪除表 drop table 表名;

DML(數據操做語言)

DML全稱:data manipulation language。主要是MYSQL的增刪改操做

  1. 插入數據 insert into 表名 (字段1,字段2) values (字段1的值,字段2的值);
  2. 更新數據/修改數據 update 表名 set 列名=列值 where 列名=列值;
  3. 刪除記錄 delete from 表名 where 列名 = 值; truncate table 表名; //刪除整個表,再從新創建一個和原表結構同樣的表

DQL(數據查詢語言)

DQL全稱:data query language。主要是MYSQL的查詢(select)操做

select的sql結構

SELECT DISTINCT
	< select_list >
FROM
	< left_table > < join_type >
JOIN 
	< right_tbale > ON < join_condition >
WHERE
	< where_condition >
GROUP BY
	< group_by_list >
HAVING
	< having_condition >
ORDER BY 
	< order_by_condition >
LIMIT
	< limit_number >

經常使用單表查詢語句

  1. 去重查詢

    -- 去重查詢。對查詢結果中< select_list >的全部(重點)字段值同樣的數據進行去重
    select DISTINCT <select_list> from <tableName>;
    -- WHERE條件查詢
    select * from <tableName> where <where_condition>;
  2. 查詢結果顯示方式

    -- 表的字段過多時,可以使用"\G"修改數據顯示方式
    select * from <tableName>;
    select * from <tableName> \G;
  3. WHERE條件查詢

    >,<,>=,<=,!=,<>,is null,is not null,and,or,between ? and ?,in,not in,like,not like...

    • between ? and ?此爲閉區間
    • like模糊查詢。'%'表示多個字符,'_'表示 一個字符
  4. ORDER BY排序

    asc升序,默認排序方式。從上到下,數據的值從小到大排序

    desc降序

    -- 示例
    select * from user order by age;
    select * from user order by age desc;
  5. GROUP BY分組

    GROUP BY語句可結合一些聚合函數來使用,< select_list >中除了聚合函數部分外的其餘查詢字段必須和< group_list >一致

    其做用和SELECT DISTINCT差很少,GROUP BY也會對查詢結果去重

    SELECT DISTINCTGROUP BY的區別

    1. 對於簡單的去重,前者效率高於後者

    2. 前者可結合聚合函數使用,後者不能結合聚合函數。例如:

      -- 查詢user表的全部名字和每一個名字同名的人數。此處使用了group by,可是distinct就作不到此效果,後者只會去重
      select name count(name) as num from user group by name;
      -- 查找不一樣年齡的人數
      SELECT age, COUNT(age) FROM emp GROUP BY age
  6. HAVING條件查詢

    仍是條件查詢。和WHERE的區別在於

    1. WHERE是對分組前的查詢結果進行過濾,HAVING的做用是能夠對分組後的查詢結果再次過濾(即便沒有使用分組也可使用HAVING)
    2. WHERE中不能使用聚合函數,HAVING中能使用聚合函數
  7. LIMIT分頁

    limit <intBegin>, <intEnd>

    • 上述區間爲左閉右開區間
    • 數據的下標從0開始計算

經常使用關鍵字

  • on,要區別於whereon只能用於多表查詢,將不符合on中條件的數據中副表的字段全設爲null並展現。where,不符合條件的數據將不被展現

  • as,用於給字段起別名

    select name as username, password from member

    本來名爲name如今改成username

    也可省略不寫,如select name username, password from member

經常使用聚合函數

max(),min(),count()

now(),curdate(),curtime()

pi(),mod(45,7),sqrt(25),round() ...

多表查詢

多表之間的關係

  1. 一對一。人和身份證。一我的只能有一張身份證

  2. 一對多。員工和部門。一個部門有多個員工,一個員工只能有一個部門

  3. 多對多。學生和課程表。一個學生選多門課程,一個課程也能夠被多個學生選擇

多對多關係中須要藉助第三張中間表

多表查詢分類

多表查詢可分爲

內鏈接:顯示內鏈接,隱式內鏈接

外鏈接:左外連接,右外鏈接

全鏈接...

內鏈接查詢

顯式內鏈接

語法: select <select_list> from <table1Name> a, <table2Name> b on <on_condition>

隱式內鏈接

其效果和隱式內鏈接相同,只顯示符合條件的語句

語法: select <select_list> from <table1Name> inner(inner可省略) join <table2Name> on <on_condition>

外鏈接查詢

通常只用左外連接而不是用右外鏈接

左外連接

select 字段列表 from 表1 left outer(可省略) join 表2 on 條件 查詢的是左表的全部數據以及其交交集。主體在左,右表字段爲空的補null

右外鏈接

select 字段列表 from 表1 right outer(可省略) join 表2 on 條件 查詢的是右表的全部數據以及其交交集,主體在右,左表字段爲空的補null

==外鏈接除左外連接和右外鏈接外還有,天然鏈接和全鏈接==

全鏈接

mysql不支持全鏈接,oracle支持全鏈接

要想用mysql實現全鏈接,須要使用union關鍵字。

使用左外連接查詢 + 'union' + 右外鏈接查詢。

注意,這裏的左外鏈接和右外鏈接select的字段必須一致,例如查A,B表時,兩個鏈接的查詢字段應該一致select a.*, b.*

union自帶去重功能,union all不帶去重功能

多表查詢教程

經常使用的7中多表查詢

mysql不支持FULL OUTER關鍵字,但又其餘解決方案(union關鍵字)。具體方案見下文

select * from emp e left jion tmp t on e.tmp_id=t.id where e.id is null

union

select * from emp e right jion tmp t on e.tmp_id=t.id where t.id is null

子查詢

概念:查詢中嵌套查詢,稱嵌套查詢爲子查詢

子查詢的不一樣狀況:

  1. 子查詢的結果是單行單列的

    查詢員工工資小於平均工資的人 select * from emp where emp.salary < (select avg(salary) from emp);

  2. 子查詢的結果是多行單列的

    查詢'財務部'和'市場部'全部員工信息

    select id from dept where name = '財務部' or name = '市場部';

    select * from emp where dept_id = 3 or dept_id = 2;

    子查詢

    select * from emp where dept_id in (select id from dept where name = '財務部' or name = '市場部');

  3. 子查詢的結果是多行多列的

    子查詢能夠做爲一張虛擬表

    查詢員工入職日期是2011-11-11往後的員工信息和部門信息

    select * from dept t1, (select * from emp where emp.join_date > '2011-11-11') t2 where t1.id = t2.dept_id;

DCL(數據庫控制語言)

DCL全稱:data control language。主要是對數據庫事務的操做

MYSQL的事務:一個事務是由一條或者多條sql語句構成,這一條或者多條sql語句要麼所有執行成功,要麼所有執行失敗

事務的操做

開啓事務回滾提交事務

-- 開啓事務
START TRANSACTION;

-- 提交事務。將事務的執行結果持久化,在提交以前數據都只是暫時改變而不是持久化地改變
COMMIT;

-- 回滾。當執行事務出現異常時須要回滾到開始事務以前的轉檯以保證數據安全
ROLLBACK;

事務的四大特性

原子性一致性隔離性持久性

原子性(Atomicity)

事務中全部操做是不可再分割的原子單位。事務中全部操做要麼所有執行成功,要麼所有執行失敗。

一致性(Consistency)

事務執行後,數據庫狀態與其它業務規則保持一致。如轉帳業務,不管事務執行成功與否,參與轉帳的兩個帳號餘額之和應該是不變的。

隔離性(Isolation)

隔離性是指在併發操做中,不一樣事務之間應該隔離開來,使每一個併發中的事務不會相互干擾。

下面的事務的隔離級別將詳細介紹隔離性

持久性(Durability)

一旦事務提交成功,事務中全部的數據操做都必須被持久化到數據庫中,即便提交事務後,數據庫立刻崩潰,在數據庫重啓時,也必須能保證經過某種機制恢復數據。

事務的隔離級別

事務隔離的概念

多個事務之間的隔離,是相互獨立的。可是若是多個失事務操做同一批數據,則會引起一些問題,設置不一樣的隔離級別就能解決這些問題

事務中存在的問題

  • 髒讀:一個事務讀取到另外一個事務中沒有提交的數據

  • 不可重複讀(虛讀):同一個事務中屢次執行同一個select,讀取到的數據發生了改變(被其它事務update而且提交)

    事務A作更新數據的操做。事務B在事務A執行更新操做先後查詢了兩次數據,結果兩次數據不同

    (由於事務B第一次讀到了事務A更新數據前的數據和第二次讀到了更新後的數據)

  • 幻讀:同一個事務中屢次執行同一個select,讀取到的數據行發生改變。也就是行數減小或者增長了(被其它事務delete/insert而且提交)

虛讀和幻讀的區別:不可重複讀的重點是事務執行的是修改,幻讀的重點在於事務執行的是新增或者刪除

隔離級別

  • READ-UNCOMMITED:讀未提交的事務

    可能出現的問題:髒讀,不可重複讀,幻讀

  • READ-COMMITED:讀已提交(Oracle默認級別)

    可能產生的問題:不可重複讀,幻讀(解決了髒讀)

  • REPEATABLE-READ:可重複讀(MySql默認級別)

    可能產生的問題:幻讀(解決了髒讀和不可重複讀)

  • SERIALIZABLE:串行化

    能夠解決全部問題。相似於加鎖,一個事務使用一張表時另外一個事務不能用這張表

注意:隔離級別從小到大安全性愈來愈高,可是效率愈來愈低

數據庫查詢隔離級別

SELECT @@transaction_isolation;

數據庫設置隔離級別

-- 這裏的<隔離級別的字符串>可用選項爲上述隔離界別中的四個選項(read uncommitted,read committed等四個選項)
SET GLOBAL TRANSACTION SELECT isolation LEVEL <隔離級別的字符串>;

導入導出sql文件

導出sql文件

$ mysqldump -u<username> -p <databaseName> > fileName.sql
$ mysqldump -u<username> -p -d <databaseName> > fileName.sql

前者導出表結構和數據,後者只導出表結構

導出文件後,sql文件默認存放地在/usr/lib/mysql/目錄下,根據狀況不一樣,可以使用find / -name fileName.sql命令查詢文件所在地

導入sql文件

通常sql文件中沒有建庫命令,這樣的話需自行建庫後再執行sql文件。

執行sql文件有兩種方式。1.進入mysql客戶端中執行sql文件; 2.在shell終端中執行sql文件

  • 進入mysql客戶端

    1. 建庫後,進入數據庫use databaseName

    2. 在mysql客戶端執行sql文件

      mysql> source /home/abc/abc.sql;
  • 在shell終端中執行sql文件

$ mysql -u<username> -p <databaseName> < fileName.sql
相關文章
相關標籤/搜索