一,DDL
1够掠,創(chuàng)建數(shù)據(jù)庫 CREATE DATABASE 數(shù)據(jù)庫名稱;
2忠聚,刪除數(shù)據(jù)庫 DROP DATABASE 數(shù)據(jù)庫名稱;
3,查看數(shù)據(jù)庫 SHOW DATABASES;
4,使用(進(jìn)入)數(shù)據(jù)庫 USE 數(shù)據(jù)庫名稱柳弄;
5舶胀,查看數(shù)據(jù)庫中有多少張表 SHOW TABLES;
(注意:寫的順序,先使用數(shù)據(jù)庫碧注,再去查看有多少張表嚣伐。)
6,查看表的字段信息 DESC 表名萍丐;
7轩端,添加一列 ALTER TABLE 表名 ADD ,列名 數(shù)據(jù)類型逝变;
8基茵,刪除一列 ALTER TABLE 數(shù)據(jù)庫名 DROP 表名奋构;
9,修改表名 RENAME TABLE 原始表名 TO 要修改的表名拱层;
10弥臼,查看表的創(chuàng)建細(xì)節(jié) SHOW CREATE TABLE 表名;
11根灯,修改表的字符集 ALTER TABLE 表名 CHARSET=utf8径缅;
12,修改表的列名 ALTER TABLE 數(shù)據(jù)庫名 CHANGE 原始名 新名烙肺;
13纳猪,刪除表 DROP TABLE 表名;
14桃笙,創(chuàng)建學(xué)生表 CREATE TABLE 表名(內(nèi)容)氏堤;
(注意:最后一行沒有逗號)
添加多行數(shù)據(jù)(批量插入):INSERT INTO 表名 VALUES (列值1....);
SQL插入數(shù)據(jù)
1,查詢表中的所有數(shù)據(jù)
SELETE * FROM 表名;
DML是對表中的數(shù)據(jù)進(jìn)行增搏明、刪丽猬、改操作
2,插入操作: INSERT INTO 表名 ( 列名1,列名2 ) VALUES (列值1, 列值2...);
舉例:
INSERT INTO students (id,name,age,email,score) VALUES (
2,'lisi',18,'wengwenyu@aliyun.com',null
);
3熏瞄,添加多條數(shù)據(jù)(批量插入):
VALUES后面以逗號隔開
INSERT INTO 表名(列名1,列名2....) VALUES(列值1,列值2),(列值1,列值2)....;
舉例:
INSERT INTO students (id,name,age,email,score) VALUES (
2,'wangwu',20,'wengwenyu2@aliyun.com',20
),(
3,'maliu',21,'wengwenyu3@aliyun.com',22
);
SQL更新數(shù)據(jù)以及修改數(shù)據(jù)庫密碼
1. 更新操作
UPDATE 表名 SET 列名1=列值1, 列名2=列值2... WHERE 列名=值
舉例:
1 把所有學(xué)生的分?jǐn)?shù)改為90
UPDATE students SET score=90;
2脚祟,把姓名為zs的學(xué)生分?jǐn)?shù)修改為60
UPDATE students SET score=60 WHERE name='zs';
3,把姓名為lisi的年齡修改為20和分?jǐn)?shù)修改為70
UPDATE students SET age=30,score=70 WHERE name='lisi';
4 把wangwu的年齡在原來基礎(chǔ)上+1歲
UPDATE students SET age=age+1 WHERE name='wangwu'
2, 修改數(shù)據(jù)庫密碼
mysqladmin -u root -p password 123456
3刪除操作
如果不加過濾條件就是刪除所有數(shù)據(jù)
DELETE FROM 表名 WHERE 列名=值;
舉例:
DELETE FROM students WHERE name='amliu'
4,刪除所有數(shù)據(jù)
TRUNCATE TABLE 表名;
DELETE 與 TRUNCATE的區(qū)別:
DELETE可以刪除指定數(shù)據(jù)也能刪除所有數(shù)據(jù) TRUNCATE只能刪除所有數(shù)據(jù)
**DELETE刪除表中的數(shù)據(jù),表結(jié)構(gòu)還在;刪除后數(shù)據(jù)還可以找回
**TRUNCATE刪除是把表直接DROP掉,然后再創(chuàng)建一個同樣的新表.刪除的數(shù)據(jù)不能找回.執(zhí)行速度比DELETE快
虛擬結(jié)果集
- 查詢所有列
SELECT * FROM 表名
2.查詢指定的列
SELECT 列名1,列名2 FROM 表名;
舉例:
SELECT name,age FROM students;
3,條件查詢
BETWEEN...AND; 值在什么范圍
IN(set);
IS NULL; (為空)
IS NOT NULL; (不為空)
AND; 與
OR; 或
NOT; 非
使用
- 查詢性別為男,并且年齡為20的學(xué)生記錄
添加性別字段
ALTER table students add gender varchar(2);
查詢
SELECT * FROM students WHERE gender='男' AND age=20;
2,查詢學(xué)號為1001 或者 名為 zs 的記錄
SELECT * FROM students WHERE id=1001 OR name='zs';
- 查詢學(xué)號為1001 , 1002 ,1003的記錄
SELECT * FROM students WHERE id = 1001 OR id = 1002 OR id = 1003;
SELECT * FROM students WHERE id in (1001,1002,1003);
- 查詢年齡為null的記錄
SELECT * FROM students WHERE age IS NULL;
- 查詢年齡在18-20之間的學(xué)生記錄
SELECT * FROM students WHERE age>= 18 AND age<=20;
SELECT * FROM students WHERE age BETWEEN 18 AND 20;
- 查詢性別非男的學(xué)生記錄
SELECT * FROM students WHERE gender != '男';
- 查詢姓名不為null的學(xué)生記錄
SELECT * FROM students WHERE name IS NOT NULL;
模糊查詢
_:任意一個字母
%:任意0~n個字母
使用
- 查詢姓名由5個字母構(gòu)成的學(xué)生記錄
5個字母就是5個下劃線
SELECT * FROM students WHERE name LIKE '_____';
- 查詢姓名由5個字母構(gòu)成,并且第5個字母為's'的學(xué)生記錄
SELECT * FROM students WHERE name LIKE '____s';
- 查詢姓名以'm'開頭的學(xué)生記錄
SELECT * FROM students WHERE name LIKE 'm%';
- 查詢姓名中第二個字母為'u'的學(xué)生記錄
SELECT * FROM students WHERE name LIKE '_u%';
- 查詢姓名中包含's'字母的學(xué)生記錄
SELECT * FROM students WHERE name LIKE '%s%';
字段控制查詢
去除重復(fù)記錄
查詢所有學(xué)生name信息,去除重復(fù)信息
SELECT DISTINCT name FROM students;
把查詢字段的結(jié)果進(jìn)行運(yùn)算,必須都要是數(shù)值型
SELECT *,字段1+字段2 FROM 表名;
舉例:
查出所有內(nèi)容,又添加了一個新的列為age和score的和,注意* 表示查出所有,然后逗號隔開强饮,然后age+score
SELECT *,age+score FROM students;
注意
1,列有很多記錄的值為null,因為任何東西與NULL相加的結(jié)果還是NULL,所以結(jié)算結(jié)果可能會出現(xiàn)NULL,下面使用了把NULL轉(zhuǎn)化成數(shù)值0的函數(shù)IFNULL:
SELECT *,age+IFNULL(score,0) FROM students;
2,對查詢結(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;排序
排序
關(guān)鍵字 ORDER BY
排序類型(默認(rèn)是ASC))
升序ASC 從小到大
降序DESC 從大到小
使用
SELECT * FROM employee ORDER BY salary DESC,id DESC;
聚合函數(shù)
- COUNT():統(tǒng)計指定列不為NULL的記錄行數(shù);
- MAX():計算指定列的最大值,如果指定列是字符串類型,那么使用字符串排序運(yùn)算;
- MIN():計算指定列的最小值,如果指定列是字符串類型,那么使用字符串排序運(yùn)算
- SUM():計算指定列的數(shù)值和,如果指定列類型不是數(shù)值類型,那么計算結(jié)果為0;
- AVG():計算指定列的平均值,如果指定列類型不是數(shù)值類型,那么計算結(jié)果為0;
1. COUNT 使用
1.查詢employee表中記錄數(shù):
SELECT COUNT(*) FROM employee;
2 查詢員工表中有績效的人數(shù):
SELECT COUNT(performance) FROM employee;
3 查詢員工表中月薪大于2500的人數(shù):
SELECT COUNT(*) FROM employee WHERE salary > 2500;
4 統(tǒng)計月薪與績效之和大于5000元的人數(shù):
SELECT COUNT(*) FROM employee WHERE IFNULL(salary,0)+IFNULL(performance,0)>5000;
5 查詢有績效的人數(shù)由桌,和有管理費的人數(shù):
SELECT COUNT(performance),COUNT(manage) FROM employee;
2. SUM 使用
1 查詢所有雇員月薪和
SELECT SUM(salary) FROM employee;
2 查詢所有雇員月薪和,以及所有雇員績效和
SELECT SUM(salary),SUM(performance) FROM employee;
3 查詢所有雇員月薪+績效和
SELECT SUM(salary+IFNULL(performance,0)) FROM employee;
4 統(tǒng)計所有員工平均工資
SELECT AVG(salary) FROM employee;
3. MAX和MIN
.1 查詢最高工資和最低工資
SELECT MAX(salary),MIN(salary) FROM employee;
一,分組查詢
對所有部門分組
SELECT department FROM employee GROUP BY department;
- 分組注意事項:在使用分組時,select后面直接跟著的字段一般都在出現(xiàn)在group by后
例子1: 對name和gender同時進(jìn)行分組
SELECT name,gender FROM employee GROUP BY gender,name;
例子2:
SELECT gender,GROUP_CONCAT(name) FROM employee GROUP BY gender;
去重是把相同的數(shù)據(jù)去除掉,分組是把相同的數(shù)據(jù)劃成一組,你可以對這一組數(shù)據(jù)進(jìn)行操作
二、分組查詢-使用
- GROUP BY+GROUP_CONCAT()
- GROUP_CONCAT(字段名)可以作為一個輸出字段來使用
- 表示分組之后,根據(jù)分組結(jié)果,使用group_concat()來 放置每一組的某字段的值的集合
1 使用
- 在一組里面所有男性名字和女性名字
SELECT gender,GROUP_CONCAT('name') FROM employee GROUP BY gender;
- 所有男性工資和女性工資
SELECT gender,GROUP_CONCAT(salary) FROM employee GROUP BY gender;
- 對某一個部門進(jìn)行分組,查看每個部門薪資信息都羅列出來
SELECT department,GROUP_CONCAT(salary) FROM employee GROUP BY department;
GROUP BY + 聚合函數(shù)
通過group_concat()的啟發(fā),我們既然可以統(tǒng)計出每個分組的某字段的值的集合,那么我們也可以通過集合函數(shù)來對這個'值的集合'做一些操作
1 使用
- 查看部門平均薪資
SELECT department,GROUP_CONCAT(salary),SUM(salary) FROM employee GROUP BY department;
- 查看每個部門的最高薪資
SELECT department,GROUP_CONCAT(salary),MAX(salary) FROM employee GROUP BY department;
- 查看每個部門的最低薪資
SELECT department,GROUP_CONCAT(salary),MIN(salary) FROM employee GROUP BY department邮丰;
- 查詢每個部門的部門名稱和每個部門的工資和
SELECT department,GROUP_CONCAT(salary),SUM(salary) FROM employee GROUP BY department;
- 查詢每個部門的部門名稱和每個部門的工資和
SELECT department,GROUP_CONCAT(salary),SUM(salary) FROM employee GROUP BY department;
- 查詢每個部門的部門名稱以及每個部門工資大于1500的人數(shù)
SELECT name,salary FROM employee WHERE salary>1500;
修改后:
SELECT department,GROUP_CONCAT(salary),COUNT(*) FROM employee WHERE salary>1500 GROUP BY department;
!GROUP BY + having
- 用分組查詢后指定一些條件來輸出查詢結(jié)果
- having作用和where一樣,但是having只能用于GROUP BY
1 使用
- 查詢工資總和大于9000的部門名稱
- 把所有部門進(jìn)行分組
SELECT department
FROM employee
GROUP BY department;
- 每一組有哪些薪資,以及薪資總和
SELECT department,GROUP_CONCAT(salary),SUM(salary)
FROM employee
GROUP BY department;
- 完成
SELECT department,GROUP_CONCAT(salary),SUM(salary)
FROM employee
GROUP BY department
HAVING SUM(salary)>9000;
HAVING和WHERE的區(qū)別
- HAVING是在分組后對數(shù)據(jù)進(jìn)行過濾;
- WHERE是在分組前對數(shù)據(jù)進(jìn)行過濾;
- HAVING后面可以使用分組函數(shù)(統(tǒng)計函數(shù));
- WHERE后面不可以使用分組函數(shù);
- WHERE是對分組前記錄的條件,如果某行記錄沒有滿足where子語句的條件,那么這行記錄不參與分組;而HAVING是對分組后的數(shù)據(jù)約束;
3 查詢工資大于2000的,工資總和大于6000的部門名稱以及工資和;
- 查詢工資大于2000
SELECT salary FROM employee WHERE salary>2000;
- 工資總和
SELECT department,GROUP_CONCAT(salary),SUM(salary)
FROM employee
WHERE salary > 2000
GROUP BY department
HAVING SUM(salary)>9000;
ORDER BY SUM(salary) DESC;
書寫順序
- SELECT --> FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY --> LIMIT
執(zhí)行順序
- FROM => WHERE => GROUP BY => HAVING => SELECT => ORDER BY => LIMIT