什么是SQL
SQL是Structured Quevy Language(結(jié)構(gòu)化查詢語言)的縮寫。 ? SQL是專為數(shù)據(jù)庫而建立的操作命令集栋猖,是一種功能齊全的數(shù)據(jù)庫語言昆婿。 ? 在使用它時,只需要發(fā)出“做什么”的命令肾砂,“怎么做”是不用使用者考慮的远剩。
sql功能分類
DDL:數(shù)據(jù)定義語言(結(jié)構(gòu))Definition ? 用來定義數(shù)據(jù)庫對象:創(chuàng)建庫扣溺,表,列等瓜晤。
DML:數(shù)據(jù)操作語言(Manipulation) ? 用來操作數(shù)據(jù)庫表中的記錄
DQL:數(shù)據(jù)查詢語言(Querry) ? 用來查詢數(shù)據(jù)
DCL:數(shù)據(jù)控制語言(control) ? 用來定義訪問權(quán)限和安全級別
SQL數(shù)據(jù)類型
char 類型 char(10)"abc "
,七個是空格
int(11) 括號里面是補多少個零
MySQL中定義數(shù)據(jù)字段的類型對你數(shù)據(jù)庫的優(yōu)化是非常重要的锥余。
MySQL支持所有標準SQL數(shù)值數(shù)據(jù)類型。
MySQL支持多種類型痢掠,大致可以分為三類 ? 數(shù)值類型
字符串類型
日期和時間類型
常用數(shù)據(jù)類型
double:浮點型驱犹,例如double(5,2)表示最多5位,其中必須有2位小數(shù)足画,即最大值為999.99雄驹;
char:固定長度字符串類型; char(10) 'abc '
varchar:可變長度字符串類型淹辞;varchar(10) 'abc'
text:字符串類型;
blob:二進制類型医舆;
date:日期類型,格式為:yyyy-MM-dd象缀;
time:時間類型蔬将,格式為:hh:mm:ss
datetime:日期時間類型 yyyy-MM-dd hh:mm:ss
在mysql中,字符串類型和日期類型都要用單引號括起來央星。'Myxq' '2020-01-01'
DDL
創(chuàng)建數(shù)據(jù)庫
create database 數(shù)據(jù)庫名 character set utf8;
修改數(shù)據(jù)庫
alter database 數(shù)據(jù)庫名 charactor set gbk;
創(chuàng)建學生表
?
添加一列
ALTER TABLE 表名 ADD 列名 數(shù)據(jù)類型;
查看表的字段信息
DESC 表名;
修改一個表的字段類型
ALTER TABLE 表名 MODIFY 字段名 數(shù)據(jù)類型;
刪除一列
ALTER TABLE 表名 DROP 字段名;
修改表名
RENAME TABLE 原始表名 TO 要修改的表名;
查看表的創(chuàng)建細節(jié)
SHOW CREATE TABLE 表名;
修改表的字符集為gbk
ALTER TABLE 表名 CHARACTER SET 字符集名稱;
修改表的列名
ALTER TABLE 表名 CHANGE 原始列名 新列名 數(shù)據(jù)類型;
刪除表
DROP TABLE 表名;
DML
查詢表中的所有數(shù)據(jù)
SELECT * FROM 表名;
DML是對表中的數(shù)據(jù)進行增霞怀、刪、改的操作
插入操作
INSERT INTO 表名(列名1莉给,列名2 ...)VALUE (列值1毙石,列值2...);
注意事項 ? 列名與列值的類型、個數(shù)禁谦、順序要一一對應胁黑。 ? 值不要超出列定義的長度傅联。 ? 插入的日期和字符一樣薄风,都使用引號括起來咏闪。
批量插入 ? INSERT INTO 表名(列名1樊零,列名2 ...)VALUES (列值1赞别,列值2...)捅僵,(列值1慷妙,列值2...);
更新操作
UPDATE 表名 SET 列名1=列值1眷昆,列名2=列值2 演训。弟孟。。 WHERE 列名=值
把所有學生的分數(shù)改為90 ? update students set score=90
把姓名為zs的學生分數(shù)改為60 ? update student set score=60 where name='zs';
把姓名為李四的年齡改為20和分數(shù)改為70 ? update student set age=20,score=70 where name='ls';
把wc的年齡在原來基礎上加1歲 ? update students set age=age+1 where name='wc';
修改數(shù)據(jù)庫密碼 ? use mysql; ? update user set password=password('abc') WHERE User='root'; ? update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost'; ? flush privileges;刷新MySQL的系統(tǒng)權(quán)限相關(guān)表重要
mysqladmin -u root -p password 123456
刪除操作
DELETE FROM 表名 【W(wǎng)HERE 列名=值】 ? TRUNCATE TABLE 表名;
DELETED 與TRUNCATE的區(qū)別 ? DELETE 刪除表中的數(shù)據(jù)样悟,表結(jié)構(gòu)還在;刪除后的數(shù)據(jù)可以找回 ? TRUNCATE 刪除是把表直接DROP掉拂募,然后再創(chuàng)建一個同樣的新表庭猩。 ? 刪除的數(shù)據(jù)不能找回。執(zhí)行速度比DELETE快陈症。
DQL
查詢所有列
SELECT * FROM 表名;
結(jié)果集
數(shù)據(jù)庫執(zhí)行DQL語句不會對數(shù)據(jù)進行改變蔼水,而是讓數(shù)據(jù)庫發(fā)送結(jié)果集給客戶端。
結(jié)果集 ? 通過查詢語句查詢出來的數(shù)據(jù)以表的形式展示我們稱這個表為虛擬結(jié)果集录肯。存放在內(nèi)存中趴腋。 ? 查詢返回的結(jié)果集是一張?zhí)摂M表。
查詢指定列的數(shù)據(jù)
SELECT 列名1论咏,列表2... FROM 表名;
條件查詢
條件查詢就是在查詢時給出WHERE子句优炬,在WHERE子句中可以使用一些運算符及關(guān)鍵字:
條件查詢運行符及關(guān)鍵字 ? =(等于)、!=(不等于)厅贪、<>(不等于)蠢护、<(小于)、<=(小于等于)养涮、>(大于)糊余、>=(大于等于); ? BETWEEN…AND单寂;值在什么范圍 ? IN(set)贬芥;固定的范圍值 ? IS NULL;(為空) IS NOT NULL(不為空) ? AND宣决;與 ? OR蘸劈;或 ? NOT; 非
使用
查詢性別為男尊沸,并且年齡為20的學生記錄 ? SELECT * FROM students WHERE gender='男' AND age=20;
查詢學號為1001 或者 名為zs的記錄** ? SELECT * FROM students WHERE id ='1001' OR name='zs';
查詢學號為1001威沫,1002,1003的記錄 ? SELECT * FROM students WHERE id='1001' OR id='1002' OR 1001='1003'; ? SELECT * FROM students WHERE id IN('1001','1002','1003'); ? SELECT * FROM students WHERE id NOT IN ('1001','1002','1003');
查詢年齡為null的記錄 ? SELECT * FROM students WHERE age IS NULL;
查詢年齡在18到20之間的學生記錄 ? SELECT * FROM students WHERE age>=18 AND age<=20; ? SELECT * FROM students WHERE age BETWEEN 18 AND 20;
查詢性別非男的學生記錄 ? SELECT * FROM students WHERE gender !='男';
查詢姓名不為null的學生記錄 ? SELECT * FROM students WHERE name IS NOT NULL;
模糊查詢
根據(jù)指定的關(guān)鍵進行查詢
使用LIKE關(guān)鍵字后跟通配符
通配符
_ :任意一個字符 ? %:任意0~n個字符
使用
查詢姓名由5個字母構(gòu)成的學生記錄 ? SELECT * FROM students WHERE name LIKE '_';
模糊查詢必須使用LIKE關(guān)鍵字洼专。其中 “”匹配任意一個字母棒掠,5個“”表示5個任意字母。**
查詢姓名由5個字母構(gòu)成屁商,并且第5個字母為“s”的學生記錄 ? SELECT * FROM students WHERE name LIKE 's';
查詢姓名以“m”開頭的學生記錄 ? SELECT * FROM students WHERE name LIKE 'm%';
其中“%”匹配0~n個任何字母烟很。
查詢姓名中第2個字母為“u”的學生記錄 ? SELECT * FROM students WHERE name LIKE '_u%';
查詢姓名中包含“s”字母的學生記錄 ? SELECT * FROM stu WHERE name LIKE '%s%';
字段控制查詢
去除重復記錄
SELECT DISTINCT name FROM students;
把查詢字段的結(jié)果進行運算,必須都要是數(shù)據(jù)型
SELECT *,字段1+字段2 FROM 表名; ? 列有很多記錄的值為NULL蜡镶, ? 因為任何東西與NULL相加結(jié)果還是NULL雾袱,所以結(jié)算結(jié)果可能會出現(xiàn)NULL。
下面使用了把NULL轉(zhuǎn)換成數(shù)值0的函數(shù)IFNULL: ? SELECT *,age+IFNULL(score,0) FROM students;
對查詢結(jié)果起別名 ? 在上面查詢中出現(xiàn)列名為sx+IFNULL(yw,0)官还,這很不美觀芹橡,現(xiàn)在我們給這一列給出一個別名,為total: ? SELECT *, yw+IFNULL(sx,0) AS total FROM score; ? 省略 AS SELECT *, yw+IFNULL(sx,0) total FROM score;
排序
創(chuàng)建表
CREATE TABLE employee
( id
int(11) NOT NULL, name
varchar(50) DEFAULT NULL, gender
varchar(1) DEFAULT NULL,hire_date
date DEFAULT NULL,salary
decimal(10,0) DEFAULT NULL,performance
double(255,0) DEFAULT NULL,manage
double(255,0) DEFAULT NULL, department
varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO employee
VALUES (1001, '張三', '男', '1991-7-25', 2000, 200, 500, '營銷部'); INSERT INTO employee
VALUES (1002, '李四', '男', '2017-7-5', 4000, 500, NULL, '營銷部'); INSERT INTO employee
VALUES (1003, '王五', '女', '2018-5-1', 6000, 100, 5000, '研發(fā)部'); INSERT INTO employee
VALUES (1004, '趙六', '男', '1991-6-1', 1000, 3000, 4000, '財務部'); INSERT INTO employee
VALUES (1005, '孫七', '女', '2018-3-23', 8000, 1000, NULL, '研發(fā)部'); INSERT INTO employee
VALUES (1006, '周八', '男', '2010-9-8', 5000, 500, 1000, '人事部'); INSERT INTO employee
VALUES (1007, '吳九', '女', '2017-7-5', 8000, 601, NULL, '研發(fā)部'); INSERT INTO employee
VALUES (1008, '鄭十', '女', '2014-4-6', 4000, 1801, NULL, '人事部');
對查詢的結(jié)果進行排序
使用關(guān)鍵字ORDER BY
排序類型
升序ASC ? 從小到大 默認
降序DESC ? 從大到小
使用
對所有員工的薪水進行排序 ? SELECT *FROM employee ORDER BY age ASC;
查詢所有學生記錄望伦,按年齡降序排序 ? SELECT * FROM employee ORDER BY age DESC;
查詢所有雇員林说,按月薪降序排序煎殷,如果月薪相同時,按編號升序排序 ? SELECT * FROM employee ORDER BY salary DESC, id ASC;
聚合函數(shù)
對查詢的結(jié)果進行統(tǒng)計計算
常用聚合函數(shù)
COUNT():統(tǒng)計指定列不為NULL的記錄行數(shù)腿箩; ? MAX():計算指定列的最大值蝌数,如果指定列是字符串類型,那么使用字符串排序運算度秘; ? MIN():計算指定列的最小值,如果指定列是字符串類型饵撑,那么使用字符串排序運算剑梳; ? SUM():計算指定列的數(shù)值和,如果指定列類型不是數(shù)值類型滑潘,那么計算結(jié)果為0垢乙; ? AVG():計算指定列的平均值,如果指定列類型不是數(shù)值類型语卤,那么計算結(jié)果為0追逮;
使用
COUNT ? 查詢employee表中記錄數(shù): ? SELECT COUNT() AS total_record FROM employee;
查詢員工表中有績效的人數(shù) ? SELECT COUNT(performance) FROM employee;
查詢員工表中月薪大于2500的人數(shù): ? SELECT COUNT() FROM employee WHERE salary > 2500;
統(tǒng)計月薪與績效之和大于5000元的人數(shù): ? SELECT COUNT(*) FROM employee WHERE salary+IFNULL(performance,0) > 5000;
查詢有績效的人數(shù),和有管理費的人數(shù): ? SELECT COUNT(performance), COUNT(manage) FROM employee;
SUM和AVG ? 查詢所有雇員月薪和: ? SELECT SUM(salary) FROM employee;
查詢所有雇員月薪和粹舵,以及所有雇員績效和 ? SELECT SUM(salary), SUM(performance) FROM employee;
查詢所有雇員月薪+績效和: ? SELECT SUM(salary+IFNULL(performance,0)) FROM employee;
統(tǒng)計所有員工平均工資: ? SELECT AVG(salary) FROM employee;
MAX和MIN ? 查詢最高工資和最低工資: ? SELECT MAX(salary), MIN(salary) FROM employee;