SQL語句分類
- DQL(數(shù)據(jù)查詢語言): 查詢語句骄噪,凡是select語句都是DQL链蕊。
- DML(數(shù)據(jù)操作語言):insert delete update滔韵,對表當中的數(shù)據(jù)進行增刪改。
- DDL(數(shù)據(jù)定義語言):create drop alter邦马,對表結(jié)構(gòu)的增刪改滋将。
- TCL(事務(wù)控制語言):commit提交事務(wù)症昏,rollback回滾事務(wù)齿兔。(TCL中的T是Transaction)
- DCL(數(shù)據(jù)控制語言): grant授權(quán)、revoke撤銷權(quán)限等添诉。
Select語句
查看表結(jié)構(gòu)
desc
+ table_name
mysql> desc dept;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| DEPTNO | int(2) | NO | PRI | NULL | | 部門編號
| DNAME | varchar(14) | YES | | NULL | | 部門名稱
| LOC | varchar(13) | YES | | NULL | | 部門位置
+--------+-------------+------+-----+---------+-------+
簡單查看表中數(shù)據(jù)
簡答查詢
語法格式:
select 字段名1,字段名2,字段名3,.... from 表名;
提示:
1、任何一條sql語句以“;”結(jié)尾蘑斧。
2竖瘾、sql語句不區(qū)分大小寫捕传。
給查詢結(jié)果的列重命名
as
關(guān)鍵字庸论,as 關(guān)鍵字可以省略
select ename,sal * 12 as yearsal from emp;
查詢所有字段
select * from table_name;
實際開發(fā)中不建議使用*棒呛,效率較低簇秒。
mysql> select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
條件查詢
語法格式:
select
字段,字段...
from
表名
where
條件;
執(zhí)行順序:先from扛禽,然后where拆内,最后select
模糊查詢
模糊查詢使用關(guān)鍵字like
在模糊查詢當中麸恍,必須掌握兩個特殊的符號抹沪,一個是%
瓤球,一個是_
%
代表任意多個字符卦羡,_
代表任意1個字符。
示例
找出名字當中含有O的瓶颠?
(在模糊查詢當中刺桃,必須掌握兩個特殊的符號瑟慈,一個是%,一個是_)
%代表任意多個字符借杰,_代表任意1個字符第步。
select ename from emp where ename like '%O%';
+-------+
| ename |
+-------+
| JONES |
| SCOTT |
| FORD |
+-------+
找出名字中第二個字母是A的缘琅?
select ename from emp where ename like '_A%';
+--------+
| ename |
+--------+
| WARD |
| MARTIN |
| JAMES |
+--------+
找出名字中有下劃線的刷袍?
mysql> select * from t_user;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | WANG_WU |
+------+----------+
select name from t_user where name like '%_%';
+----------+
| name |
+----------+
| zhangsan |
| lisi |
| WANG_WU |
+----------+
select name from t_user where name like '%\_%';
+---------+
| name |
+---------+
| WANG_WU |
+---------+
找出名字中最后一個字母是T的呻纹?
select ename from emp where ename like '%T';
+-------+
| ename |
+-------+
| SCOTT |
+-------+
結(jié)果集去重
distinct
關(guān)鍵字
mysql> select distinct job from emp; // distinct關(guān)鍵字去除重復(fù)記錄淑仆。
+-----------+
| job |
+-----------+
| CLERK |
| SALESMAN |
| MANAGER |
| ANALYST |
| PRESIDENT |
+-----------+
mysql> select ename,distinct job from emp;
以上的sql語句是錯誤的哥力。
記追园稀:distinct只能出現(xiàn)在所有字段的最前面桥温。
排序
關(guān)鍵字order by
MySQL中默認是升序梁丘。asc
表示升序旺韭,desc
表示降序
語法格式
select
...
from
表名
order by
...
執(zhí)行順序
select
字段 3
from
表名 1
where
條件 2
order by
.... 4
order by是最后執(zhí)行的。
查看當前 數(shù)據(jù)庫與版本號
mysql> select database(); 查看當前使用的是哪個數(shù)據(jù)庫
+-------------+
| database() |
+-------------+
| swu |
+-------------+
mysql> select version(); 查看mysql的版本號珊燎。
+-----------+
| version() |
+-----------+
| 8.0.28 |
+-----------+
分組函數(shù)
分組函數(shù)又稱多行處理函數(shù),輸入多行遵湖,最終輸出的結(jié)果是1行
- count 計數(shù)
- sum 求和
- avg 平均值
- max 最大值
- min 最小值
所有的分組函數(shù)都是對“某一組”數(shù)據(jù)進行操作
注意
分組函數(shù)自動忽略NULL
where中不能直接使用
select ename,sal from emp where sal > avg(sal);
//ERROR 1111 (HY000): Invalid use of group function
思考以上的錯誤信息:無效的使用了分組函數(shù)悔政?
原因:SQL語句當中有一個語法規(guī)則,分組函數(shù)不可直接使用在where子句當中
我們用序號來表示執(zhí)行的先后順序
因為group by是在where執(zhí)行之后才會執(zhí)行的
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
count(*)和count(字段)的區(qū)別
count(*):不是統(tǒng)計某個字段中數(shù)據(jù)的個數(shù)延旧,而是統(tǒng)計總記錄條數(shù)谋国。(和某個字段無關(guān))
count(comm): 表示統(tǒng)計comm字段中不為NULL的數(shù)據(jù)總數(shù)量
group by and having
group by
: 按照某個字段或者某些字段進行分組。
having
: having是對分組之后的數(shù)據(jù)進行再次過濾
案例:找出每個工作崗位的最高薪資
select max(sal),job from emp group by job;
+----------+-----------+
| max(sal) | job |
+----------+-----------+
| 3000.00 | ANALYST |
| 1300.00 | CLERK |
| 2975.00 | MANAGER |
| 5000.00 | PRESIDENT |
| 1600.00 | SALESMAN |
+----------+-----------+
注意:
- 分組函數(shù)一般都會和group by聯(lián)合使用迁沫,這也是為什么它被稱為分組函數(shù)的原因芦瘾。
- 并且任何一個分組函數(shù)(count sum avg max min)都是在group by語句執(zhí)行結(jié)束之后才會執(zhí)行的。
- 當一條sql語句沒有g(shù)roup by的話集畅,整張表的數(shù)據(jù)會自成一組近弟。
select ename,max(sal),job from emp group by job;
以上在mysql當中祷愉,查詢結(jié)果是有的,但是結(jié)果沒有意義,在Oracle數(shù)據(jù)庫當中會報錯欺殿。語法錯誤擂啥。
Oracle的語法規(guī)則比MySQL語法規(guī)則嚴謹蜒谤。
記住一個規(guī)則:當一條語句中有g(shù)roup by的話,select后面只能跟分組函數(shù)和參與分組的字段。
完整DQL語句寫法
數(shù)字代表執(zhí)行順序
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
insert語句
語法格式:
insert into 表名(字段名1,字段名2,字段名3,....) values(值1,值2,值3,....)
要求:字段的數(shù)量和值的數(shù)量相同,并且數(shù)據(jù)類型要對應(yīng)相同
注意:
- 當一條insert語句執(zhí)行成功之后,表格當中必然會多一行記錄。
- 即使多的這一行記錄當中某些字段是NULL挥唠,后期也沒有辦法在執(zhí)行
- insert語句插入數(shù)據(jù)了号坡,只能使用update進行更新。
一次插入多行數(shù)據(jù)
insert into t_student(no,name,sex,classno,birth) values
(3,'rose','1','1101','1952-12-14'),
(4,'jack','1','1201','1955-12-14');
查詢結(jié)果插入表
mysql> insert into dept1 select * from dept;
mysql> select * from dept1;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
表的復(fù)制
語法:
create table 表名 as select語句;
將查詢結(jié)果當做表創(chuàng)建出來
update語句
語法格式:
update 表名 set 字段名1=值1,字段名2=值2... where 條件;
案例
將部門10的LOC修改為SHANGHAI籽慢,將部門名稱修改為RENSHIBU
update dept1 set loc = 'SHANGHAI', dname = 'RENSHIBU' where deptno = 10;
mysql> select * from dept1;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | RENSHIBU | SHANGHAI |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 10 | RENSHIBU | SHANGHAI |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
更新所有記錄
update dept1 set loc = 'x', dname = 'y';
mysql> select * from dept1;
+--------+-------+------+
| DEPTNO | DNAME | LOC |
+--------+-------+------+
| 10 | y | x |
| 20 | y | x |
| 30 | y | x |
| 40 | y | x |
| 10 | y | x |
| 20 | y | x |
| 30 | y | x |
| 40 | y | x |
+--------+-------+------+
delete語句
語法格式:
delete from 表名 where 條件;
注意:沒有where設(shè)置條件髓帽,表中的數(shù)據(jù)將會被全部刪除
如何快速刪除大數(shù)據(jù)量的表
在實際開發(fā)過程中衡查,一張表可能有成千上萬條記錄,此時執(zhí)行delete
語句往往需要十多分鐘,我們可以直接使用truncate
截斷表數(shù)據(jù),速度在瞬間完成装盯。
truncate table 表名
警告
表被截斷账磺,不可回滾碧聪,數(shù)據(jù)永久丟失
關(guān)于刪庫跑路的一點看法
新聞
首先我們來看兩條新聞
觀點
個人認為刪庫跑路的程序員不負責任趁耗,沒有擔當意識径簿,“刪庫跑路”這種行為類似與小孩子發(fā)脾氣缠捌,并且違反了相關(guān)法律法規(guī)哑芹,對自己和公司都造成了嚴重傷害乙嘀,可以說是殺敵一千,自損一萬嘉冒。
賠錢事小,蹲監(jiān)獄事大。
更何況還是刪除數(shù)據(jù)庫,給公司帶來極大損失榄鉴,相信以后沒有公司還敢再聘用這類程序員矛辕。
一時的沖動導(dǎo)致編程生涯的結(jié)束,可惜。
我們還是要遵守法律法規(guī)纠屋,心有不滿岩四,可以多和領(lǐng)導(dǎo)多交流桶唐,多溝通醉蚁。