注意:MySQL在centos中安裝的是5.7版本的,編輯MySQL時會有個報錯,需要執行:
set @@global.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
1. SQL語句:每個命令執行結束加分號結束
查詢所有數據庫:show databases;
切換數據庫:use 庫命名;
創建數據庫:create database [IF NOT EXISTS] 庫名;
刪除數據庫:drop database [IF EXISTS] 庫名;
查詢數據庫創建:show 建庫語句;
指定數據庫采用的字符集:CHARACTER SET
修改數據庫的編碼集:alter database 數據庫名 CHARACTER SET 編碼集;
注意:不要修改mysql服務器的編碼集,表的編碼集默認和庫一致
2. 建表
格式:
create table [if not exists] 表名(
字段1 數據類型 字段屬性,
字段2 數據類型 字段屬性,
...
字段N 數據類型 字段屬性
)engine=引擎 default charset=編碼集;
查看當前數據庫:select database();
查看建表語句:show create table 表名;
查看表結構:desc 表名;
刪除:drop table [if exists] 表名;
3.字段屬性:
not null:沒給值數據為默認值(varchar默認值為空
AUTO_INCREMENT定義列為自增的屬性,一般用於主鍵,數值會自動加1
PRIMARY KEY關鍵字用於定義列為主鍵,您可以使用多列來定義主鍵,列間以逗號分隔
ENGINE 設置存儲引擎,CHARSET 設置編碼
default null:沒給值數據就是null
default 值:設置字段的默認值
注意:主鍵不重復的列
這里我們建立一個student表:
1 create table if not EXISTS student ( 2 id int auto_increment, 3 `name` VARCHAR(32), 4 age int, 5 sex char(1), 6 clazz VARCHAR(32)) charset utf8;
1 insert into student values (1001,'zs',18,'男','一班'); 2 insert into student values (1002,'ls',19,'女','二班'); 3 insert into student(`name`,age,sex,clazz) values ('ww',69,'男','一班'); 4 insert into student(`name`,age,sex,clazz) values ('we',21,'女','二班'); 5 insert into student(`name`,age,sex,clazz) values ('ld ',23,'男','一班'); 6 insert into student(`name`,age,sex,clazz) values ('lq',45,'女','二班'); 7 insert into student(`name`,age,sex,clazz) values ('lwq',23,'男','一班'); 8 insert into student(`name`,age,sex,clazz) values ('ld',12,'女','二班');
4.修改表:alter table
修改表名:alter(rename) table 舊表名 to 新表名;
rename table student1 TO `student`;
添加字段:alter table 表名 add 字段 字段數據類型 屬性;
1 alter table student add job varchar(32) default '沒有工作' ; 2 insert into student (job) VALUES('a'); 3 insert into student (job) VALUES('b'); 4 insert into student (job) VALUES('c'); 5 insert into student (job) VALUES('a'); 6 insert into student (job) VALUES('b');
修改字段:alter table 表名 change 舊字段 新字段 數據類型 屬性;
1 alter table student change clazz clazz varchar(255); 2 alter table student change age score double;
修改字段:alter table 表名 modify 字段 數據類型 屬性;
alter table student MODIFY varchar(356); #這里不能比之前的空間小
注意:
change:修改所有(字段名,數據類型,屬性)
modify:修改一部分(數據類型,屬性)
修改數據類型時,varchar->int元數據會變為0
5. 增刪改查:字符串全部使用''包起來
1)增:
1 格式: 2 insert into 表名(字段) values(值),(值)...(值); 3 insert into student values (1001,'zs',18,'男','一班'); 4 insert into student values (1002,'ls',19,'女','二班'); 5 insert into student(`name`,age,sex,clazz) values ('ww',69,'男','一班'); 6 insert into student(`name`,age,sex,clazz) values ('we',21,'女','二班'); 7 insert into student(`name`,age,sex,clazz) values ('ld ',23,'男','一班'); 8 insert into student(`name`,age,sex,clazz) values ('lq',45,'女','二班'); 9 insert into student(`name`,age,sex,clazz) values ('lwq',23,'男','一班'); 10 insert into student(`name`,age,sex,clazz) values ('ld',12,'女','二班');
2) 刪
1 -- 刪除delete from 表名 where 子句;
2 delete from student where job='c';
3)改
1 -- 改update 表名 set 字段1=值1,字段2=值2...字段N=值N where 子句;
2 update student set job='b'where name ='ls';
4) 查
1 -- 查select 字段 from 表名 where 子句;
2 select * from student ; #查詢全部 3 SELECT id as di,name,job,score from student where score>18; #特定查詢,並且展示特定的表 as:表示改字段名稱(原來的表不發生變化)
注意:
*表示所有字段
6. 子句:
> < <= >= = <> 大於、小於、大於(小於)等於、不等於
between ...and... 顯示在某一區間的值(含頭含尾)
in(set) 顯示在in列表中的值,例:in(100,200)只能匹配100或200
like '張_' 模糊查詢 使用% 和 _(%表示匹配所有 _匹配一個)
Is null 判斷是否為空
and 多個條件同時成立
or 多個條件任一成立
not 不成立,例:where not(expection>10000);
1 -- > < <= >= = != 大於、小於、大於(小於)等於、不等於
2 SELECT * from student WHERE id>1006; 3 SELECT * from student WHERE id!=1006; 4
5 --between ...and... 顯示在某一區間的值(含頭含尾)
6 select id,name,job from student where id BETWEEN 1002 and 1005; 7 select * from student where job BETWEEN 'a' and 'b'; 8
9 -- in(set) 顯示在in列表中的值,例:in(100,200)只能匹配100或200
10 select * from student where job in('a','b'); 11
12 -- like '張_' 模糊查詢 使用% 和 _(%表示匹配所有 _匹配一個)
13 SELECT * from student where name like 'l%'; 14 SELECT * from student where name like 'l_'; 15
16 -- Is null 判斷是否為空
17 select * from student where name is not null;
7.limit分頁
格式:
語句 limit 開始下標,長度;
1 -- limit分頁 語句 limit 開始下標,長度;注意:沒有where
2 select * from student LIMIT 1,2; 3 select * from student LIMIT 0,2; 4 select * from student LIMIT 2;
注意:
如果數據量不夠,顯示全部
8.去重
格式:
DISTINCT 字段1,字段2...字段N
1 -- 去重 DISTINCT 字段1,字段2...字段N
2 select DISTINCT name from student; 3 select count(DISTINCT name) from student;
注意:
字段不能在DISTINCT之前,只能在DISTINCT后面
DISTINCT之后有多個字段,按照所有字段進行去重
9.聚合函數:
count(字段):求多少行數據
sum(字段):求和
avg(字段):平均數
max(字段):最大值
min(字段):最小值
注意:
varchar能比較大小,不能獲取avg(沒有任何意義)
如果值為Null不參與計算
sum和avg字段的數據不是數值,結果都是0
1 -- count(字段):求多少行數據
2 select count(*) from student; 3 select count(name) from student; 4
5 -- sum(字段):求和
6 select sum(score) from student; 7 select sum(job) FROM student; 8 select name+score as sum FROM student; #score的值 9 SELECT name*score as cheng FROM student; #0
10
11 -- avg(字段):平均數
12 SELECT avg(score) FROM student; 13
14 -- max(字段):最大值
15 SELECT max(score) FROM student; 16 SELECT max(job) FROM student; #c 17
18 -- min(字段):最小值
19 SELECT min(score) FROM student;
10.拼接:
格式1:
concat(str1,str2...)
格式2:
concat_WS(separator,str1,str2,...)
1 -- 格式一:concat(str1,str2...)
2 select CONCAT(id,'-',name) as pj FROM student; 3 -- 格式二:concat_WS(str1,str2...)
4 SELECT CONCAT_WS('~',id,name,score,job)FROM student; #中間以~隔開
11.日期函數
獲取當前日期:
current_timestamp;--所有
current_timestamp();--所有
CURRENT_DATE();-- 年月日
CURRENT_DATE;-- 年月日
CURRENT_TIME();-- 時分秒
CURRENT_TIME;-- 時分秒
1 -- 獲取當前日期:
2 -- current_timestamp;--所有
3 SELECT CURRENT_TIMESTAMP from student; 4 -- current_timestamp();--所有
5 SELECT CURRENT_TIMESTAMP() from student; 6 -- CURRENT_DATE();-- 年月日
7 select CURRENT_DATE() from student; 8 -- CURRENT_DATE;-- 年月日
9 select CURRENT_DATE from student; 10 -- CURRENT_TIME();-- 時分秒
11 SELECT CURRENT_TIME() FROM student; 12 -- CURRENT_TIME;-- 時分秒
13 SELECT CURRENT_TIME FROM student;
時間轉str
格式:
date_format(date,format)
date:時間
format:格式
str轉日期
格式:
str_to_date(str,formaat)
1 SELECT * FROM date; 2 -- 時間轉str
3 -- 格式:
4 -- date_format(date,format)
5 -- date:時間
6 -- format:格式
7 select DATE_FORMAT('2021-09-01','%Y~%m~%d'); 8 -- str轉日期
9 -- 格式:
10 -- str_to_date(str,formaat)
11 SELECT STR_TO_DATE('2021-09-01','%Y-%m-%d');
日期相減
格式:
datediff(expr1,expr2);
注意:只能相減年月日,時分秒參與運算結果為null
1 -- datediff(expr1,expr2);
2 -- 注意:只能相減年月日,時分秒參與運算結果為null
3 SELECT DATEDIFF('2021-09-09','2021-09-01');
函數向日期添加指定的時間間隔
格式:
DATE_ADD(date,INTERVAL expr unit);
date:時間
INTERVAL:關鍵字
expr:間隔的數值
unit:年月日時分秒(..,...,day,..,..,..)
1 SELECT DATE_ADD('2021-09-09',INTERVAL +10 YEAR); 2 SELECT DATE_ADD('2021-09-09',INTERVAL +10 DAY);
12. 數組計算
round(x,d):四舍五入
x:值
d:保留幾位小數點
ceil(x):向上取整
floor(x):向下取整
rand():隨機數(0-1之間)
1 -- 數組計算
2 -- round(x,d):四舍五入
3 -- x:值
4 -- d:保留幾位小數點
5 SELECT ROUND(1.3,2); #2表示保留幾位小數 6
7 -- ceil(x):向上取整
8 SELECT ceil(1.2); 9
10 -- floor(x):向下取整
11 SELECT floor(1.2); 12 -- rand():隨機數(0-1之間)
13 SELECT rand();
13.排序
格式:
order by 字段1 asc|desc,字段2 asc|desc...字段n asc|desc;
1 SELECT * from student ORDER BY score,job; 2 SELECT * from student ORDER BY score desc, job desc;
注意:
默認升序asc,降序desc
如果有多個字段,按照先后順序依次排序
14. group by 分組
格式:
group by 字段1,字段2...字段n;
注意:
多個字段,按照所有字段進行分組(一起分組)
有多少組顯示多少條數據(默認情況下,沒有經過條件篩選)
每組顯示的數據為每組中默認第一條數據
gruop by 通常和聚合函數一起使用
1 select max(score) as c from student where score=c; 2 select max(score) as c from student having score=c; 3 兩個都不能運行 4
5
6 SELECT count(*),job,`name`,id as c from student GROUP BY sex where c>2; #錯誤 7 SELECT count(*) as c,job,`name`,id from student GROUP BY sex HAVING c>2; 8
9
10 -- select id,name,sex from student where job='a'; # 可以運行
11 -- select id,name,sex from student having job='a'; #不能運行(顯示了之后就沒有job)
12 -- 執行過程是 from-where-select-having
13 -- select count(*) c from student where c>1; -- 不行
14 -- select count(*) c from student having c>1;-- 行
15 select count(*) c,sex from student group by sex where sex='男'; 16 select count(*) c,sex from student group by sex having sex='男'; 17
18
19 --where having 一起使用
20 SELECT count(*)as c,name,id FROM student where sex='男' HAVING c>3; 21 where 是對表中from到的數據進行篩選; 22 having是對表中selec顯示數據進行曬選;