一. SQL簡單介紹
(1)類似linux中的shell,統一標準,能夠應用于各種數據庫
(2)SQL標準:SQL-92或SQL-99
(3)SQL驗證:SQL_MODE約束
二. SQL常用分類
(1)DDL:數據定義語言
(2)DCL: 數據控制語言
(3)DML: 數據操作語言
(4)DQL: 數據查詢語言
三. 數據類型(表的核心屬性,字符集)
作用:保證數據的準確性和標準性
3.1 種類
3.1.1 數值類型
3.1.2 字符類型
char(10)與varchar(10)的區別(括號內的數字是自己規定限制的字符長度):
char(10)類型:是定長類型,不管存儲什么長度的數據,都立即分配你所指定的固定字符串長度的存儲空間,若數據小于你所指定的,無法沾滿則用空來填充
varchar(10)類型:可變長度類型,按需分配存儲空間,在你指定的長度的字符串存儲空間中只要不超過你所指定的長度,需要多少就分配多少(但每次都要計算所需要字符串長度的存儲空間)在varchar類型中,除了存儲字符串本身外,還會存儲字符長度,對于<=255個字符的會額外占用1個字節存儲長度;>255個字符的會額外占用2個字節長度存儲字符長度
注意:對于char(10)與varchar(10)的數據類型,括號中表示的是最多的字符個數
基礎字符:a(字母)----1字節 1(數字)----1字節 {(符號)----1字節
中文:張---gbk字符集---2字節 張---utf8---3字節 張---utf8mb4---4字節
3.1.3 時間類型
3.1.4 二進制類型
一般不使用,neo4j:圖片,視頻的存儲應用
3.1.5 枚舉類型
enum(‘bj’,‘sh’,‘tj’,...)
對應著編號1,2,3,...
四. 表與列的屬性
4.1 列屬性
約束作用(一般建表時添加)
(1)not null:非空約束
- 列值不能為空,也是表設計的規范,盡可能將所有的列設置為非空。若無法保證,可以設置默認值,可以設置默認值為0。
(2)unique key:唯一鍵
- 列值不能重復,手機號,身份證號,銀行卡號種類的列設定為UK
(3)primary key:主鍵約束
- 設置為主鍵的列,此列的值必須非空且唯一,主鍵在一個表中只能有一個,但是可以有多個列一起構成,一般會在表中設置自增長的id列。
(4)unsigned:無符號
- 針對數字列,非負數。一般是在int或tinyint后添加的附加屬性
其他屬性
(1)key:屬性
- 可以在某列上建立索引,來優化查詢,一般是根據需要后添加
(2)default:默認值
- 列中,沒有錄入值時,會自動使用default的值填充
(3)auto_increment:自增長
- 針對數字列,順序的自動填充數據(默認是從1開始,將來可以設定起始點和偏移量)
(4)comment:注釋信息
4.2 表屬性
存儲引擎:
InnoDB(默認的)
字符集和排序規則:
utf8
utf8mb4
五. 字符集及校對規則
5.1 字符集(charset)
- show charset;(mysql中的查看方式)
gbk:中文字符占2個字節
utf8(mb3):中文字符占3個字節
utf8mb4:中文字符占4個字節
- create database xs charset utf8mb4;
- create table t1 ()charset utf8mb4;
5.2 校對/排序規則(collation)
5.2.1 舉例
- 舉例數據:Asd, ads, ass, bca, cda, Cdd
- 不區分大小寫:ads, Asd, ass, bca, cda, Cdd
- 區分大小寫:Asd, Cdd, ads, ass, bca, cda
5.2.2 utf8mb4字符集
- show collaction(在mysql中查看方式)
(1)utf8mb4_general_ci: 通過校對默認值,不區分大小寫
(2)utf8mb4_bin:區分大小寫
六. DDL數據定義語言
6.1 庫的定義
6.1.1 標準建庫語句
- mysql> create database db charset utf8mb4;(創建)
- mysql> show create database xuexiao;(查看)
6.1.2 創建數據庫方式
- create database school;
- create schema sch;
- show charset;
- show collation;
- CREATE DATABASE test CHARSET utf8;
- create database xyz charset utf8mb4 collate utf8mb4_bin;
6.1.3 建庫規范
1.庫名不能有大寫字母
2.建庫要加字符集
3.庫名不能有數字開頭
- 庫名要和業務相關
6.1.4 刪除庫
- drop database oldboy;(生產中禁用)
6.1.5 修改庫(一般就是修改字符集)
- SHOW CREATE DATABASE school;
- ALTER DATABASE school CHARSET utf8;
6.1.6 查詢庫
- show databases;
- show create database oldboy;
6.2 表的定義
6.2.1 創建表
模板
create table stu(
列1 屬性(數據類型、約束、其他屬性) ,
列2 屬性,
列3 屬性
)
實例
USE school;
CREATE TABLE stu(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '學號',
sname VARCHAR(255) NOT NULL COMMENT '姓名',
sage TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年齡',
sgender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性別' ,
sfz CHAR(18) NOT NULL UNIQUE COMMENT '身份證',
intime TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入學時間'
) ENGINE=INNODB CHARSET=utf8 COMMENT '學生表';
建表規范
- 表名小寫
- 不能是數字開頭
- 注意字符集和存儲引擎
- 表名和業務有關
- 選擇合適的數據類型
- 每個列都要有注釋
- 每個列設置為非空,無法保證非空,用0來填充。
- 必須有主鍵,一般是一個自增長的無關列。
6.2.2 刪除表
- drop table xuesheng;(直接把整個表刪除包括表定義(表中的列)和數據)
- truncate table xuesheng;(保留表結構(表定義),清空表的區和數據)
6.2.3 修改表(添加刪除列)
添加列
(1)在xs表中添加手機號列“shouji”
- ALTER TABLE xs ADD shouji CHAR(11) NOT NULL UNIQUE KEY COMMENT '手機號';
(2)在xs表中,sex列后添加列“微信”
- ALTER TABLE xs ADD 微信 VARCHAR(64) NOT NULL UNIQUE KEY COMMENT '微信號' AFTER sex;
(3)在xs表中的第一列位置添加列“qq號”
- ALTER TABLE xs ADD qq VARCHAR(64) NOT NULL UNIQUE KEY COMMENT 'qq號' first;
刪除列
ALTER TABLE stu DROP num;
ALTER TABLE stu DROP qq;
ALTER TABLE stu DROP wechat;
修改列屬性
(1)只改屬性不改列名
- ALTER TABLE xs MODIFY ssname VARCHAR(64) NOT NULL COMMENT '姓名';
(2)列名與屬性都改
- ALTER TABLE xs CHANGE sname ssname VARCHAR(32) NOT NULL COMMENT '姓名';
6.2.4 查詢列(屬性)
use school
show tables;
desc stu;
show create table stu;
CREATE TABLE ceshi LIKE stu;
七. 數據控制語言
7.1 賦予權限
- grant all on wordpress.* to wordpress@'10.0.0.%' identified by '123';
(grant+權限+on+對象范圍+to +用戶@網段 +identified by '密碼';)
7.2 收回權限
- revoke delete on wordpress.* from dev@'10.0.0.%';
(revoke +權限+on+對象范圍+from+用戶@網段)
7.3 權限查詢
- show grants for dev@'10.0.0.%';
(show+grants+for+用戶@網段)
八. DML數據操作語言
DML語句用作表中數據行的增刪改查
8.1 insert(錄入數據)
--- 最標準的insert語句
INSERT INTO stu(id,sname,sage,sg,sfz,intime)
VALUES
(1,'zs',18,'m','123456',NOW());
SELECT * FROM stu;
--- 省事的寫法
INSERT INTO stu
VALUES
(2,'ls',18,'m','1234567',NOW());
--- 針對性的錄入數據
INSERT INTO stu(sname,sfz)
VALUES ('w5','34445788');
--- 同時錄入多行數據
INSERT INTO stu(sname,sfz)
VALUES
('w55','3444578d8'),
('m6','1212313'),
('aa','123213123123');
SELECT * FROM stu;
8.2 update(修改數據)
DESC stu;
SELECT * FROM stu;
UPDATE stu SET sname='zhao4' WHERE id=2;
(修改stu表中的sname數據行為zhao4)
注意:update語句必須要加where,不然整個數據列都會被改動。
8.3 delete(刪除數據)
- DELETE FROM stu WHERE id=3;
(也必須由where指定具體修改什么,危險操作)
8.4 全表刪除(delete與truncate的區別)
全表刪除命令
- DELETE FROM stu
- truncate table stu;
區別 - delete: DML操作, 清空整表的所有數據,是邏輯性質刪除,逐行進行刪除,速度慢.并且表所占用的空間不會立即釋放。
- truncate: DDL操作,清空整表的所有數據,按區刪除,屬于物理刪除,對與表段中的數據頁進行清空,速度快.并且表所占用空間會被立即釋放。
8.5 使用update代替delete實現偽刪除
(1)在xs表中添加一個狀態列state
- ALTER TABLE xs ADD state TINYINT NOT NULL DEFAULT 1 ;
- SELECT * FROM stu;(查看)
(2)用UPDATE 替代 DELETE - 原語句:delete from xs where id=6;
- 改寫后:update xs set state=0 where id=6;
(3)業務語句查詢調整 - 原語句:select * from xs;
- 改寫后:SELECT * FROM xs WHERE state=1;
九. DQL數據查詢語言
9.1 select 子句應用(單表)
9.1.1 select 子句執行邏輯
- select 列1 from 表 where 條件 group by 條件 having 條件 order by 條件 limit 條件(順序不可亂)
9.1.2 select單獨使用(mysql獨家)
-- select @@xxx 查看系統參數
1. SELECT @@port; #顯示連接端口
2. SELECT @@basedir; #顯示軟件安裝目錄
3. SELECT @@datadir; #顯示數據存放目錄
4. SELECT @@socket; #顯示socket文件
5. SELECT @@server_id; #顯示服務id
6. SELECT @@innodb_flush_log_at_trx_commit; #顯示innodb_log_buffer向innodb_log_file的刷寫策略
7. SHOW VARIABLES LIKE '%trx%' #模糊查詢參數方式
9.1.3 select +函數()
1. select now(); #顯示當前時間
2. select database(); #顯示當前處于哪個庫
3. select user(); #顯示哪個用戶登錄數據庫
4. select 16*16; #用于計算(顯示計算結果)
5. select concat("hello world") #顯示出括號內容
6. select concat(user,"@",host) from mysql.user; #顯示出mysql.user中調出的用戶與主機名(用@連接起來,語句拼接)
7. select group_concat(user,"@",host) from mysql.user; #與上訴顯示結果一樣,只不過是一行顯示(列轉行)
9.2 from子句應用(單表)
use world; #進入world庫中
show tables; #顯示庫中的所有表
desc city; #以表結構形式顯示city表的所有數據
select * from city; #查看city中所有數據(相當于cat文件)
select name,countrycode from city; #從city表中調取國家代碼與名稱信息(相當于awk文件)
9.3 where子句應用
9.3.1 等值查詢
- select * from city where countrycode='CHN';(查詢中國城市信息)
9.3.2 不等值查詢
- select * from city where population<100;(查詢人口是小于100人的城市)
- select * from city where id<10;(查詢id小于10的城市信息)
- select * from city where countrycode !='CHN';(查詢不是中國城市的信息)
9.3.3 模糊查詢
- select * from city where countrycode like 'CH%';(查詢國家代號是CH打頭的城市信息,盡量避免like前帶%的模糊查詢)
9.3.4 邏輯連接符(and)
- select * from city where countrycode='CHN' and population>5000000;(查詢中國人口超過500萬的城市)
- select * from city where population>5000000 and population<6000000;
(查詢人口數在500萬到600萬之間的城市)
9.3.5 邏輯連接符(or)
- select * from city where district='shandong' or district='hebei';(查詢山東省或河北省的信息)
9.3.6 where配合between and使用
- select * from city where population between 5000000 and 6000000;(查詢人口數在500萬到600萬之間的城市)
9.3.7 where配合in的使用
- select * from city where district in('shandong','hebei');(查詢山東省或河北省的信息)
9.4 group by分組幾句+聚合函數的應用
9.4.1 什么是分組
以查詢的某個項進行合理分組,以便更直觀的顯示
9.4.2 常用的聚合函數
COUNT()---用于計數
MAX()---最大值
MIN()---最小值
AVG()---平均數
SUM()---求和
GROUP_CONCAT()---列轉行
9.4.3 應用舉例
- select countrycode,COUNT(id) from city GROUP BY countrycode;(統計每個國家的城市個數)
- select countrycode,SUM(population) from city GROUP BY countrycode;(統計每個國家的總人口數)
- select district,COUNT(NAME),SUM(population) from city where countrycode='CHN' GROUP BY district;(統計中國各個城市的個數及人口數)
- select countrycode,GROUP_CONCAT(NAME) from city GROUP BY countrycode;(統計各個國家的城市名列表)
9.5 having子句應用(一般在group by篩選過后再篩選一遍)打印
- select district,COUNT(NAME),SUM(population) from city where countrycode='CHN' GROUP BY district HAVING SUM(population)>8000000;(統計中國每個省的城市個數,省總人口數,只顯示人口數大于800萬的省)
9.6 order by子句應用(默認增序輸出)
- select district,COUNT(NAME),SUM(population) from city where countrycode='CHN' GROUP BY district HAVING SUM(population)>8000000 ORDER BY SUM(population) DESC;(統計中國各個省的城市個數,省總人口數,只顯示人口數大于800萬的省,降序輸出)
- select * from city where countrycode='CHN' order by population DESC;(查詢中國所有城市信息,并以人口降序輸出)
9.7 limit子句應用(顯示前幾行或跳過前幾行再顯示后幾行,應用于order by之后)
9.7.1 格式顯示
LIMIT 10 OFFSET 0=LIMIT 10(顯示前10行)
LIMIT 5 OFFSET 5=LIMIT 5,5(跳過前5行,再顯示后5行)
9.7.2 例子
- select * from city where countrycode='CHN' order by population DESC limit 10 offset 0;(查詢中國所有城市信息,并以人口降序輸出,只顯示前10行)
9.8 distinct子句應用(去重復)
- select DISTINCT countrycode from city;(查詢所有國家的代號信息,有的代號一樣,這里就去重復了)
9.9 union與union all子句應用(聯合查詢)
9.9.1 舉例
---查看山東省或河北省信息
(原語句):
- select * from city where district='shandong' or district='hebei';
(union all優化):
- select * from city where district='shandong' union all select * from city where district='hebei';
---查看中國或美國的所有信息
(原語句):
- select * from city where countrycode in('CHN','USA');
(union all優化):
- select * from city where countrycode='CHN' union all select * from city where countrycode='USA';
9.9.2 說明
一般情況下,我們會將in或or的語句改寫為union all語句來提高性能(并不是所有語句越復雜性能越差,這就是個實例)
9.9.3 union與union all的區別
union帶有去重復的功能(隱含了排序功能,更耗費資源);而union all則沒有去重復功能
十. 多表連接查詢
10.1 多表連接作用
業務需要的數據來自多張表,則需要各張表的關聯項來進行選取所需
10.2 多表連接類型
- 內連接(重要)
- 外連接(一般)
- 全連接(普通)
- 笛卡爾(普通)
10.3 多表連接基本語法(內連接類型)
- 傳統連接(普通)
- 自連接(普通)
- join uing(普通)
- join on (重要)
10.4 join on語法過程(內連接)
兩表
select ---(顯示內容,看題意)
from 第一表
join 第二表
on 第一表的內容=第二表的內容(兩表的關聯列)
where 條件
group by 條件
having 條件
order by 條件
limit 條件
多表
select (顯示內容看要求)
from 第一表
join 第二表
on 第一表內容=第二表內容(第一第二表的關聯列)
join 第三表
on 第二表的內容=第三表的內容(第二第三表的關聯列)
join ----
on ----
where 條件
group by 條件
having 條件
order by 條件
limit 條件
10.5 多表連接查詢套路
- 根據要求找到關聯列
- 找到表與表的關聯列
- 列名調用時,需要添加關聯列,例如:a.id b.name
10.6 給與如下關聯,進行后續多表連接案例
1. course(課程表)與sc(成績表)關聯列為cno(課程編號)
2. course(課程表)與teacher(教師表)關聯列為tno(教師編號)
3. sc(成績表)與student(學生表)關聯列為sno(學生編號)
10.7 多表連接查詢案例
(1)查詢張三學習了幾門課程
---分析:
1. 由題意看出需要的是學生表與課程表
2. 但學生表與課程表并沒有關聯列,而成績表與課程表有關聯列,所以需要成績表進行過渡(三標連接)
3. 再分析題意,需要的是學生學習了幾門課程,而課程同樣在成績表中也能顯示,同時成績表與學生表是有關聯列的,所以直接應用學生表與成績表兩表關聯即可
---答題:
select student.sname,COUNT(sc.cno) from student join sc on student.sno=sc.sno where student.sname='zhang3';
(2)統計oldguo老師教的學生個數
select teacher.tname,COUNT(student.sno)
from teacher
join course
on teacher.tno=course.tno
join sc
on course.cno=sc.cno
join student
on sc.sno=student.sno
where teacher.tname='oldguo';
(3)統計每位老師所教的課程的平均分,并按平均分排序
select teacher.tname,AVG(sc.score)
from teacher
join course
on teacher.tno=course.tno
join sc
on course.cno=sc.cno
group by teacher.tno,teacher.tname
order by AVG(sc.score);
(4)統計zhang3學習的課程名稱
select student.sname,GROUP_CONCAT(course.cname)
from student
join sc
on student.sno=sc.sno
join course
on sc.cno=course.cno
where student.sname='zhang3';
(5)查詢oldguo所教不及格的學生
select teacher.tname,GROUP_CONCAT(student.sname)
from teacher
join course
on teacher.tno=course.tno
join sc
on course.cno=sc.cno
join student
on sc.sno=student.sno
where teacher.tname='oldguo' and sc.score<60;
(6)查詢所有老師所教的學生不及格的信息
select teacher.tname,GROUP_CONCAT(student.sname)
from teacher
join course
on teacher.tno=course.tno
join sc
on course.cno=sc.cno
join student
on sc.sno=student.sno
where sc.scroe<60
GROUP BY teacher.tname;
10.8 別名(表別名,列別名)
表別名
(1)表別名舉例(查詢所有老師所教學生不及格的信息)
select a.tname,GROUP_CONCAT(d.sname)
from teacher AS a
join course AS b
on a.tno=b.tno
join sc AS c
on b.cno=c.cno
join student AS d
on c.sno=d.sno
where c.score<60
GROUP BY a.tname;
(2)表別名說明
1. AS可以省略,直接加別名即可,但是為了區分最好加上
2. 表別名一般是在from后的表或join后的表定義的別名
3. 表別名定義后在select,where,group by,having以及order by后都可以應用
列別名
(1)列別名舉例(統計每位老師所教課程的平均分,并按平均分排序)
select a.tname AS 講師,AVG(c.score) AS 平均分
from teacher as a
join course as b
on a.tno=b.tno
join sc as c
on b.cno=c.cno
GROUP BY a.tno
ORDER BY 平均分;
(2)列別名說明
1. 列別名一般是在select后定義的別名
2. 結果集顯示會以別名的形式展示
3. 在having與order by字句中應用
十一. 外連接簡介
11.1 A left join B(左外連接)
應用方式:
...
A left join B
on A表中的所有條件列=B表中符合兩表的關聯條件的列(A.xx=B.yy)
and 條件(進行過濾所需,外連接沒有where等字句賽選條件,只有and來代替)
11.2 A right join B(右外連接)
應用方式:
...
A right join B
on A表中符合兩表的關聯條件的列=B表中所有條件列(A.xx=B.yy)
and 條件
11.3 結論
- 多表連接中,小表驅動大表
- 通過left/right join強制選定驅動表
十二. 元數據獲取
12.1 元數據包含內容
基表---數據字典信息(列結構frm),系統狀態信息,對象狀態信息,不能直接操作,只能用專門的管理命令進行修改(DDL語句,DCL語句等),視圖information_schema與show語句查詢。基表就相當于linux中的inode,存放各種屬性信息。
12.2 獲取方式
1. show database; #查看數據庫中所有庫的信息
2. show tables; #查看庫下所有表
3. show tables from ...; #查詢某個指定庫下的所有表
4. show create database world; #查看world庫的建庫語句
5. show create table world.city; #查看world庫下city表的建表語句
6. show grants for root@'localhost'; #查看用戶權限信息
7. show charset; #查看字符集
8. show collation; #查看校對規則
9. show processlist; #查看數據庫連接情況
10. show index from ... #查看某個表的索引情況
11. show status; #查看數據庫狀態信息
12. show status like '%lock%' #模糊查看數據庫某些狀態信息
13. show variables; #查看數據庫所有配置信息
14. show variables like '%lock%' #模糊查找數據庫默寫配置信息
15. show engines; #查看數據庫支持的所有的存儲引擎
16. show engines innodb status \G; #查看關于innodb引擎所有狀態信息
17. show binary logs; #列舉出所有二進制日志
18. show master status; #查看數據路的日志位置信息
19. show binlog events in ... ; #查看二進制日志事件
20. show slave status \G; #查看數據庫從庫狀態
21. show relaylog events; #查看從庫relaylog事件信息
22. desc (show colums from city) #查看表的列定義信息
12.3 視圖views:information_schema(虛擬庫)查詢
12.3.1 創建視圖test
create view test as select
country.name as co_name,country.Surface Area,city.name as ci_name,city.Population
from city join country
on city.xountrycode=country.code
where city.population<100;
12.3.2 查看視圖test
- select * from test;
12.3.3 tables視圖的作用和結構
(1)tables視圖作用
- 存儲整個數據庫的所有表的元數據查詢方式
(2)tables下重要列
1. table_schema:表所在的庫名
2. table_name:表名
3. engine:表的引擎
4. table_rows:表的行數
5. avg_row_length:表中行的平均行(字節)
6. index_length:索引的占用空間大小(字節)
12.3.4 tables視圖查詢舉例
(1)查詢world庫下所有表名
- show tables from world;
(2)查詢整個數據庫中的所有庫和對應表的信息
select table_schema,GROUP_CONCAT(table_name)
from information_schema.tables
GROUP BY table_schema;
(3)統計所有庫下表的個數
select table_schema,COUNT(table_name)
from information_schema.tables
GROUP BY table_schema;
(4) 查詢所有innodb引擎的表所在的庫
select table_schema,table_name.ENGINE
from information_schema.tables
where ENGINE='innodb';
(5)統計每張表的實際占用空間大小情況
(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)統計大小默認為字節,其中AVG_ROW_LENGTH與TABLE_ROWS可以互換位置
select table_name,AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH
from information_schema.tables;
(6)統計world庫下每張表的磁盤空間
select table_name,CONCAT((AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)/1024," KB") as size_KB
from information_schema.tables
where table_schema='world';
(7)統計每個庫(所有庫)的總的磁盤空間占用(數據庫查詢,如下命令是最準確的數據量級查詢,與
linux中的“du -sh”的區別很大,linux中的查詢結果還包含了很多日志之類的文件,并不是真正的數據量級)
select table_schema
CONCAT(SUM(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)1024," KB") AS Total_KB
from information_schema.tables
GROUP BY table_schema;
linux命令行:
mysql -uroot -p123 -e "select table_schema CONCAT(SUM(AVG_ROW_LENGTH*TABLE_ROWS+INDEX_LENGTH)1024," KB") AS Total_KB from information_schema.tables GROUP BY table_schema;"
(8)對整個數據庫下的所有表進行分庫分表備份(生成單獨備份語句)
模板語句:
mysqldump -uroot -p123 world city >/tmp/world_city.sql
分析:
實際上就是進行上述的一個批量的語句拼接過程(CONCAT)
答題:
select CONCAT("mysqldump -uroot -p123 ",table_schema," ",table_name," >/tmp",table_schema,"_",table_name,".sql")
from information_schema.tables
where table_schema NOT IN('information_schema','performance_schema','sys')
INTO OUTFILE '/tmp/bak.sh';
(9)進行模仿一下模板語句的批量操作
模板語句:
alter table world.city discard tablespace;
操作:
select CONCAT("alter table ",table_schema,".",table_name," discard tablespace")
from information_schema.tables
where table_schema='world'
INTO OUTFILE '/tmp/dis.sql';