mysql 分组求和_MySql基础语法
SQL語句分類
DDL:數據定義語言,用來定義數據庫對象:庫、表、列等
DML:數據操作語言,用來定義數據庫記錄(數據)
DCL:數據控制語言,用來定義訪問權限和安全級別;
DQL:數據查詢語言,用來查詢記錄 select
CRUD
C(Create):創建
R(Retrieve):查詢
U(Update):修改
D(Delete):刪除
數據庫操作
查看版本:select version();
顯示當前時間:select now();
連接遠程數據庫:mysql -hip地址 -uroot -p
- -h后面寫要連接的主機ip地址
- -u后面寫連接的用戶名
- -p回車后寫密碼
修改數據庫訪問權限
use?mysql;grant?all?privileges?on?*.*?to?'root'@'%'?identified?by?'root';
創建數據庫
cerate?database?數據庫名?charset=utf8;create?database?if?not?exists?數據庫名?#?如果數據庫不存在就創建
刪除數據庫
drop?database?數據庫名;切換數據庫
use?數據庫名;查看正在使用的數據庫
select?database();查看當前所有的數據庫
show?databases;查看數據庫基本信息
show?create?database?數據庫名修改數據庫編碼
alter?database?數據庫名?character?set?編碼格式(utf8)約束
主鍵
primary key
當某一列添加了主鍵約束后,那么這一列的數據就不能重復出現。這樣每行記錄中其主鍵列的值就是這一行的唯一標識。例如學生的學號可以用來做唯一標識,而學生的姓名是不能做唯一標識的,因為學習有可能同名。
主鍵列的值不能為NULL,也不能重復!
主鍵自增長:auto_increment
非空
not null
指定非空約束的列不能沒有值,也就是說在插入記錄時,對添加了非空約束的列一定要給值;在修改記錄時,不能把非空列的值設置為NULL。
唯一
unique
還可以為字段指定唯一約束!當為字段指定唯一約束后,那么字段的值必須是唯一的。這一點與主鍵相似!例如給stu表的sname字段指定唯一約束
默認
default
外鍵
foreign key
主外鍵是構成表與表關聯的唯一途徑!
外鍵是另一張表的主鍵!例如員工表與部門表之間就存在關聯關系,其中員工表中的部門編號字段就是外鍵,是相對部門表的外鍵。
數據表操作
查看數據庫中所有表
show tables;
常見約束
含義:限制表中的數據,保證數據的一致性和準確性
| not null | 非空約束,表示字段不能為空 |
| default | 默認,用于使用默認值 |
| unique | 唯一約束,可以為空 |
| primary key | 主鍵約束,保證字段的唯一性,非空 |
| foreign key | 外鍵約束,用于限制兩個表的關系 |
| check | 檢查約束,MySQL不支持 |
約束分類
- 列級約束:支持默認,非空,主鍵,唯一,外鍵約束沒有效果
- 表級約束:支持主鍵,唯一
創建表
使用
create?table?表名(????字段名?字段類型?列級約束,
????字段名?字段類型?列級約束,
????表級約束
);
create?table?students(
????id?int?primary?key(主鍵),?--?主鍵約束
????sname?varchar(10)?not?null,?--?非空約束
????seat?int(10)?unique,?--?唯一約束
????age?int(10)?default?18,?--?默認約束
);
修改
alter table 表名 add |change| drop 列名 類型;
alter?table?students?add?birthday?datetime;刪除
drop table 表名;
查看表結構
desc 表名;
更改表名稱
rename table 原表名 to 新表名;
查看表的創建語
show create table 表名;
查詢
條件查詢
條件查詢就是在查詢時給出WHERE子句,在WHERE子句中可以使用如下運算符及關鍵字
=、!=、<>、、>=
BETWEEN…AND:是否滿足一個區間范圍
IN(set):條件的集合
IS NULL
AND:連接多個條件的查詢
OR:or ?滿足其中一個條件就可以
NOT
模糊查詢
當想查詢姓名中包含a字母的學生時就需要使用模糊查詢了。模糊查詢需要使用關鍵字LIKE。
“_”匹配任意一個字母,5個“_”表示5個任意字母與漢字。
--?查詢姓名由5個字母構成的學生記錄???_?通配字段的數據select?*?from?stu?where?sname?like?'_____';
%表示任意匹配字符
--?查詢姓名中包含“a”字母的學生記錄select?*?from?stu?where?sname?like?'%a%';
distinct去重,查詢表時出現重復時用
--?查詢表中的性別select?distinct?gender?from?stu;
給列起別名在字段后加 as 名字,可以省略as
--?查詢人數總和select?count(*)?as?'人數總和'?from?stu
排序order by
升序:asc,降序:desc
order by后面支持放單個字段,多個字段,表達式,函數,別名
order by字句一般放在查詢語句的最后面,limit除外
--?查詢所有學生記錄,按年齡升序排序SELECT?*?FROM?stu?ORDER?BY?age?desc;
--?多個字段排序
SELECT?*?FROM?stu?ORDER?BY?age?desc,id?asc;
分組函數
sum:求和
avg:求平均值
max:最大值
min:最小值
count:統計個數
sum和avg一般用于處理數值型
max和min和count支持處理任何類型
所有分組函數都忽略null值
在MYISAM引擎下使用count(*)效率最高,在INNODB引擎下count(*)和count(1)效率差不多
SELECT?SUM(age),AVG(age),MAX(age),MIN(age),COUNT(age)?from?stu;--?和distinct搭配使用,去重
SELECT?SUM(DISTINCT?age)?from?stu;
分組查詢
語法
SELECT?分組函數,列(要求出現在GROUP?BY后面)FROM?表
WHERE?篩選條件
GROUP?BY?分組的列表
ORDER?BY?字句
使用
--?查詢每個職位的最高工資SELECT?MAX(salary),?job_id
FROM?employee
GROUP?BY?job_id
--?查詢哪個部門的員工個數大于2
SELECT?COUNT(*),?department_id
FROM?employee
GROUP?BY?department_id
HAVING?COUNT(*)?>?2
where和having
共同作用: 過濾掉不符合條件的數據
區別: where在GROUP BY之前,having在GROUP BY之后
where不能與組函數一塊使用 having 可以
WHERE是對分組前記錄的條件,如果某行記錄沒有滿足WHERE子句的條件,那么這行記錄不會參加分組;而HAVING是對分組后數據的約束
--?查詢每個部門的部門編號以及每個部門的人數SELECT?deptno?'部門編號',COUNT(*)?
FROM?emp?
GROUP?BY?deptno;
--?查詢每個部門的部門編號以及每個部門員工工資大于1500的人數
SELECT?deptno?'部門編號',COUNT(*)?
FROM?emp?
WHERE?sal>1500?
GROUP?BY?deptno;
--?查詢工資總和大于9000的部門編號以及工資和
SELECT?deptno?'部門編號',SUM(sal)?'每個部門的工資和'?
FROM?emp??
GROUP?BY?deptno?
HAVING?SUM(sal)>9000?;
關聯查詢
--?查詢員工信息,要求顯示員工號,姓名,月薪,部門名稱--?兩張表關聯查詢??至少有一個條件
select?e.empno,e.ename,e.sal,d.dname?from?emp?e,dept?d?where?e.deptno?=?d.deptno;
--?查詢員工信息,要求顯示:員工號,姓名,部門名稱,月薪,薪水的級別
--?三張表查詢至少有兩個條件
select?e.empno,e.ename,e.sal,s.GRADE,d.dname
from?emp?e?,salgrade?s,dept?d
where?e.sal?BETWEEN?s.LowSAL?and?s.HISAL?and?e.deptno?=?d.deptno?ORDER?BY?s.GRADE;
連接查詢
語法
select?查詢列表from?表1?別名?連接類型
join?表2?別名
on?連接條件
where?篩選條件
group?by?分組
having?篩選條件
order?by?排序
自連接:將同一張表視為多張表
內連接:inner join on,可以和where一起用
左外連接:left join on,不可以和where一起用
右外連接:right join on,不可以和where一起用
--?查詢員工姓名和員工的老板的名稱(自連接)select?e1.empno,e1.ename,e1.mgr,?e2.ename
from?emp?e1,emp?e2?
WHERE?e1.mgr?=?e2.empno;
--?查詢員工們和部門名(內連接)
select?ename,mgr
from?emp?e
inner?join?depart?d
on?e.eid?=?d.did;
--?查詢哪個部門沒有員工(左外連接)
select?d.*,?e.eid
from?depart?d
left?join?emp?e
on?d.did?=?e.eid
where?e.eid?is?null;
子查詢
含義:出現在其他語句中的select語句,外部的查詢語句稱為外查詢或主查詢
子查詢可以出現的位置:select后面,from后面,where或having后面,exists后面
| 標量子查詢 | 結果集只有一行一列 | select,where或having后支持 |
| 列/多行子查詢 | 結果集有一列多行 | where或having后支持 |
| 行子查詢 | 結果集有一行多列 | where或having后支持 |
| 表子查詢 | 結果集有多行多列 | from,exists后支持 |
select?*?from?emp?
where?sal?=?(
????select?avg(sal)?
????from?emp?
????where?did?=?20
);
--?查詢最低工資大于50號部門最低工資的部門id和其最低工資
select?min(salary),did
from?emp
group?by?did
having?min(salary)?>?(
????select?min(salary)
????from?emp
????where?did?=?50
);
--?查詢lo_id是1400或1700的部門中所有員工姓名
select?ename
from?emp
where?did?in(
????select?distinct?did
????from?dep
????where?lo_id?in?(1400,1700)
);
--?查詢員工編號最小并且工資最高的員工信息
select?*
from?emp
where?(eid,salary)?=?(
????select?min(eid),max(salary)
????from?emp
);
--?查詢每個部門的平均工資和工資等級
select?ag_dep.*,g.grade.level
from?(
????select?avg(salary)?ag.did
????from?emp
????group?by?did
)?ag_dep
inner?join?job_grades?g
on?ag_dep.ag?between?lowest_sal?and?highest_sal;
分頁查詢
語法
select?查詢列表from?表
where?篩選條件
group?by?分組字段
having?分組后篩選
order?by?排序的字段
limit?start,end
Start 從第一行開始,默認索引為0
Rows 每次查詢的行數
--?查詢從第一個數據到第五個數據select?*?from?emp?limit?0,5;
聯合查詢
union:二個集合中,如果都有相同的,取其一
union all:二個集合中,如果都有相同的,都取
select?*?from?tb_user1?union
select?*?from?tb_user2;
增加
全列插入:insert into 表名 values(...);
缺省插入:insert into 表名(字段名,...) values(值1,...);
mysql特有的同時插入多條數據:insert into 表名 表名 values(...),(...)...;
或者:insert into 表名(列1,...) values(值1,...),(值1,...);
主鍵是自動增長,但是在全列插入時需要占位,通常使用0,插入成功后一實際數據為準
修改
updata 表名 set 列1=新值1,... where 條件;
刪除
delete from 表名 where 條件;
邏輯刪除
本質就是修改操作update (自己額外增加一個isdelete字段)
update 表名 set isdelete=1 where 條件;
update?students?set?isDelete=1?where?id=6;外鍵的級聯操作
級聯操作的類型包括
- restrict(限制):默認值,拋異常
- cascade(級聯):如果主表的記錄刪掉,則從表中相關聯的記錄都會被刪掉
- set null:將外鍵設置為空
- no action:什么都不做
最好的方法是做邏輯刪除
注釋
單行注釋
-- 注釋內容 或者 # 注釋內容(MySQL專用)
多行注釋
/* 注釋 */
函數
字符串函數
length:獲取字符串字節個數
SELECT?LENGTH('JTXYH');concat:拼接字符串
SELECT?CONCAT('jtx','yh')?姓名?from?stu;upper,lower:轉換大小寫
SELECT?UPPER('jtxyh');??--?變大寫SELECT?LOWER('JTXYH');??--?變小寫
substr,substring:截取字符串
--?索引是從1開始算,截取到結尾SELECT?SUBSTR('jtxyh',4);
--?輸出:yh
--?從1索引截取3個字符
SELECT?SUBSTR('jtxyh',1,3);
--?輸出?jtx
instr:返回子字符串所在的第一個索引,找不到返回0
SELECT?INSTR('jtxyh','yh');--?輸出:4
trim:去除前后空格或指定字符串
SELECT?TRIM('??jtxyh??');--?輸出:jtxyh
SELECT?TRIM('a'?FROM?'aajtxyhaa');
--?輸出:jtxyh
replace:替換字符串
SELECT?REPLACE('yhjtxyh','yh','YH');--?輸出:YHjtxYH
lpad,rpad:用指定的字符填充左/右側到指定長度
SELECT?LPAD('jtxyh',6,'A');--?輸出:Ajtxyh
SELECT?LPAD('jtxyh',6,'A');
--?輸出:jtxyhA
數值類函數
round:四舍五入
SELECT?ROUND(1.45);--?輸出:1
SELECT?ROUND(1.4567,2);
--?保留兩位小數,輸出:1.46 ?
ceil,floor:向上\下取整,返回大于\小于等于該參數的最小\大整數
SELECT?CELL(1.2);--?輸出:2
SELECT?FLOOR(1.2);
--?輸出:1
truncate:截斷
SELECT?TRUNCATE(1.456788,1);--?輸出:1.4
mod:取余,使用a-a/b*b計算
SELECT?MOD(10,3);?#?等同于10%3--?輸出:1
時間和日期函數
now:返回當前系統日期加時間
SELECT?NOW();curdate:返回當前系統日期,不包含時間curtime:返回當前系統時間,不包含日期
SELECT?CURDATE();SELECT?CURTIME();
str_to_date:將字符轉換為日期
SELECT?STR_TO_DATE('1999-2-2','%Y-%c-%d');--?輸出:1999-02-02
data_format:將日期轉換為字符
SELECT?DATE_FORMAT(now(),'%Y年%m月%d日');流程控制函數
if:判斷效果,類似if...else
SELECT?IF(10>5,'大','小');--?輸出:大
事務
基本知識
概念:如果一個包含多個步驟的業務邏輯,被事務管理,那么這些操作要么同時成功,要么同時失敗。
操作步驟:
UPDATE?TEST?SET?BALANCE?=?BALANCE?-?500?WHERE?ID=1;
UPDATE?TEST?SET?BALANCE?=?BALANCE?+?500?WHERE?ID=2;
--?上面三行必須選中一起執行,下面的選擇其中一個執行
--?如果數據出現問題就選擇這個執行,數據會被恢復
ROLLBACK?--?回滾事務
--?如果數據沒有問題就選擇這個執行,數據會被永久修改
COMMIT?--?提交事務
MySQL數據庫中事務默認是自動提交,一條DML(增刪改)語句會自動提交一次事務
事務提交的兩種方式
修改事務的默認提交方式
事務的四大特征
原子性:是不可分割的最小操作單位,要么同時成功,要么同時失敗
持久性:當事務提交或回滾后,數據庫會持久化保存數據
隔離性:多個事務之間,相互獨立
一致性:事務操作前后,數據總量不變
事務的隔離級別
概念:多個事務之間隔離的,相互獨立的。但是如果多個事務操作同一批數據,則會引發一些問題,設置不同的級別就可以解決這些問題
存在問題
隔離級別
| 讀未提交 Read uncommitted | 有 | 有 | 有 |
| 讀已提交 Read committed(Oracle默認) | 沒有 | 有 | 有 |
| 可重復讀 Repeatable read(MySQL默認) | 沒有 | 沒有 | 有 |
| 串行化/可序列化 Serializable | 沒有 | 沒有 | 沒有 |
注意:隔離級別從小到大安全性越來越高,但效率越來越低
- 數據庫查詢隔離級別:select @@tx_isolation;
- 數據庫設置隔離級別:set global transaction isolation level 級別字符串;
DCL
管理用戶
添加用戶
CREATE?USER?'用戶名'@'主機名'?IDENTIFIED?BY?'密碼';--?*?通配符:**%**表示可以在任意主機使用該用戶登錄數據庫
刪除用戶
DROP?USER?'用戶名'@'主機名';修改用戶密碼
UPDATE?USER?SET?PASSWORD?=?PASSWORD('新密碼')?WHERE?USER?=?'用戶名';SET?PASSWORD?FOR?'用戶名'@'主機名'?=?PASSWORD('新密碼');
查詢用戶
USE?MYSQL;?SELECT?*?FROM?USER;
MySQL忘記root密碼
管理員權限打開cmd --> net stop mysql 停止MySQL服務
使用無驗證方式啟動MySQL服務:mysqld --skip-grant-tables
管理員權限打開新的cmd窗口,直接輸入mysql命令就可以登錄成功
use?MySQL;UPDATE?USER?SET?PASSWORD?=?PASSWORD('新密碼')?WHERE?USER?=?'用戶名';
關閉兩個窗口,打開任務管理器,手動結束mysqld.exe的進程
啟動mysql服務:net start mysql,使用新密碼登錄
權限管理
查詢權限
SHOW?CRANTS?FOR?'用戶名'@'主機名';授予權限
GRANT?權限列表?ON?數據庫名.表名?to?'用戶名'@'主機名';--?授予所有權限
GRANT?ALL?ON?*.*?to?'用戶名'@'主機名';
撤銷權限
REVOKE?權限列表?ON?數據庫名.表名?FROM?'用戶名'@'主機名';其他
設置sql自動遞增初始值
ALTER?TABLE?表名?AUTO_INCREMENT=初始值;授權mysql遠程登錄
--?進入mysql數據庫GRANT?ALL?PRIVILEGES?ON?*.*?TO?'root'@'%'?IDENTIFIED?BY?'你自己密碼'?WITH?GRANT?OPTION;
flush?privileges;
查詢語句順序
select?字段??from?表1,表2?[where?條件?GROUP?BY?字段?having?條件?order?by?字段?LIMIT?5];SELECT?selection_list?'要查詢的列名稱'
FROM?table_list?'要查詢的表名稱'
WHERE?condition?'篩選數據行的條件'
GROUP?BY?grouping_columns?'對結果分組'
HAVING?condition?'分組后的篩選行的條件'
ORDER?BY?sorting_columns?'對結果排序'
LIMIT?offset_start,?row_count?'結果限定*'
END
往期推薦
Centos軟件安裝
Centos基本使用
Docker基礎知識
網易云課堂2019 Java高級教程
郭術生AE教程
總結
以上是生活随笔為你收集整理的mysql 分组求和_MySql基础语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jdbc preparestatemen
- 下一篇: linux cmake编译源码,linu