mysql 完整的增删改查 和单表查询
增語法:
1.所有數據按順序插入
insert [into] 表名 values (值1, ..., 值n)[, ..., (值1, ..., 值n)];
2.指定字段匹配插入,可以任意順序
insert [into] 表名(字段2, 字段1, ..., 字段n) values (值2, 值1, ..., 值n)[, ..., (值2, 值1, ..., 值n)];
3.插入查詢結果
insert [into] 表1(字段1, ..., 字段n) select 字段1, ..., 字段n from 表2 [條件];
eg1:
create table t1(
id int primary key auto_increment,
x int,
y int
);
insert into? t1 values(1,2,3),(2,20,30);? 按順序插入
insert into t1(y,x) values (300,200);?? 按規定字段順序指定插入
create table nt1 like t1;?? 復制表的完成結構
insert into nt1 select *from t1; 復制所有數據??? 兩句結合起來就是完整的復制表
create? table? tt1(
x int,
z int
);
insert into tt1 values (999,888);
insert into nt1(x) select? x? from tt1; 將tt1中的指定字段插入到nt1中的指定字段
insert into nt1(x,y) select x,z from tt1;?? 將tt1中x及z的字段的結果賦值給nt1中的 x,y字段
?
刪語法:
1.會記錄自增信息,操作會被日志記錄,效率低
delete from 表名 [條件];
delete from t1;?? #不重置自增效果,沒有條件的情況下清空所有數據
insert into t1(x,y) values (6,66);
2.清空表,會重置自增信息
truncate table 表名;
truncate table? nt1
insert into t1(x,y) values (6,66);
?
改語法:
update 表名 set 字段1=值1[, ..., 字段n=值n] [條件]
update tt1 set x=666; 無條件,只要是x字段信息全改為x=666
update tt1 set x=777,z=555 where z<888; 只修改滿足條件的行
?
?
查語法:
select [distinct] 字段1 [as 別名], ..., 字段n [as 別名] from [庫名.]表名
??????????????????? [
??????????????????? where 約束條件
??????????????????? group by 分組依據
??????????????????? having 過濾條件
??????????????????? order by 排序的字段
??????????????????? limit 限制顯示的條數
??????????????????? ];
注:
1.查表中所有字段用*表示
2.條件的書寫規則嚴格按照語法順序書寫,可以缺省,但不可以錯序
3.約束條件的流程:from -> where -> group by -> having -> distinct -> order by -> limit
4.字段可以起別名 可以省略as
5.字段可以直接做運算? select age+1 'new_age' from emp;
6.分組后的條件均可以使用聚合函數
單表數據:
CREATE TABLE `emp` (`id` int(0) NOT NULL AUTO_INCREMENT,`name` varchar(10) NOT NULL,`gender` enum('男','女','未知') NULL DEFAULT '未知',`age` int(0) NULL DEFAULT 0,`salary` float NULL DEFAULT 0,`area` varchar(20) NULL DEFAULT '中國',`port` varchar(20) DEFAULT '未知',`dep` varchar(20),PRIMARY KEY (`id`) );INSERT INTO `emp` VALUES (1, 'yangsir', '男', 42, 10.5, '上海', '浦東', '教職部'),(2, 'engo', '男', 38, 9.4, '山東', '濟南', '教學部'),(3, 'jerry', '女', 30, 3.0, '江蘇', '張家港', '教學部'),(4, 'tank', '女', 28, 2.4, '廣州', '廣東', '教學部'),(5, 'jiboy', '男', 28, 2.4, '江蘇', '蘇州', '教學部'),(6, 'zero', '男', 28, 8.8, '中國', '黃浦', '咨詢部'),(7, 'owen', '男', 28, 8.8, '安徽', '宣城', '教學部'),(9, 'ying', '女', 36, 1.2, '安徽', '蕪湖', '咨詢部'),(10, 'kevin', '男', 36, 5.8, '山東', '濟南', '教學部'),(11, 'monkey', '女', 28, 1.2, '山東', '青島', '教職部'),(12, 'san', '男', 30, 9.0, '上海', '浦東', '咨詢部'),(13, 'san1', '男', 30, 6.0, '上海', '浦東', '咨詢部'),(14, 'san2', '男', 30, 6.0, '上海', '浦西', '教學部');?
簡單查詢:
select? concat(area,"-",port) as '家鄉' from emp; #提取表中的字段名的值 拼接到一起 中間可以添加自定義字符串???? 上海-浦東 屬于起的別名 家鄉列
select concat_ws("-",name,area,port) "信息" from emp; #以"-"拼接后面的所有字段
select upper(name) as 'name',gender,age from emp;
#去重前提,所查所有字段的綜合結果完全相同,才認為是重復的,只保留重復中的一行數據
select distinct area from emp;
select distinct area,port from emp;
常用函數:
concat(字段1,...,字段n):完成字段的拼接
concat_ws(x, 字段1,...,字段n):完成字段的拼接,x為連接符
lower():小寫
upper():大寫
ceil():向上取整
floor():向下取整
round():四舍五入
where 條件:
1.比較運算符
= | < | > | <= | >= | !=
select * from emp where area !="上海";
?
2.區間運算符
between 10 and 20:10~20
in(10, 20, 30):10或20或30
select *from emp where id between 3 and 5 ;???? #[3,5] 閉合區間包含3和5,三行數據
select *from emp where id in(2,4,6,8) #分離區間 取 id 2,4,6,8
3.邏輯運算符
and | or | not
select *from emp where area='山東' and port='濟南';
4.相似運算符
like '_owen%':模糊匹配字符串owen,_表示一個字符,%表示任意字符
匹配字段為en,想得到的結果為owen
select * from emp where name like '__en%'; 在en前可以出現2個任意字符,之后可以匹配出現0或者多個任意字符
需求:
查找姓名有數字的員工信息
正則匹配
like 完成模糊匹配,但功能局限,可以模糊個數,但不能模糊類型,正則可以完成類型及個數的模糊匹配
語法:字段 regexp '正則表達式'
注:只支持部分正則語法
select *from epm where name regexp '.*[0-9]+.*';
?
?
group by 分組
分組:根據字段相同值形成不同的類別,不明確分組其實整個表就為一個默認大組
原因:把以值共性得到的類別作為考慮單位,不再關系單條記錄,而且一組記錄
?
結果:只能考慮組內多條數據的聚會結果(聚合函數結果),分組的字段同樣是聚合結果,如:組內的最大最小值
?
聚合函數:
max():最大值
min():最小值
avg():平均值
sum():和
count():記數
group_concat():組內字段拼接,用來查看組內其他字段
?
eg1:
每個部門的平均薪資
select dep,avg(salary) as '平均薪資' from emp group by dep;
eg2:
每個部門有哪些人
select dep,group_concat(name) from emp group by dep;
?
需求:
各性別中附屬于教學部的最高薪資
?
select gender, max(salary) '最高薪資' from emp?? where? dep ='教學部'? group by gender;
?
思考:
想知道需求中員工的姓名 => 子查詢
上方結果:男的最高薪資對應的人名 .女的最高薪資對應的人名
解決分組思考題的過程:
一個查詢的依賴于另一個查詢的結果=>一個查詢的結果作為一個查詢的條件就是子查詢
'res'?? select gender, max(salary) '最高薪資' from emp?? where? dep ='教學部'? group by gender;
select name from emp where (salary 跟res作比較)
eg2:
select name from emp where salary in (select max(salary) '最高薪資' from emp?? where? dep ='教學部'? group by gender);
?
?
select *from emp group by dep; #非分組安全模式下,可以查詢非聚合結果,顯示的是第一條記錄沒意義,分組安全模式下不能查詢非聚合結果的字段
select dep from emp group by dep;
考慮三個問題:以什么分組(相同數據較多的字段) 分組后的考慮單位 (組,并非組內的每一條記錄)可以查詢的結果(當前分組的字段以及聚合函數形成的聚合結果)
?
?
子查詢:
子查詢:將一條查詢結果作為另外一條查詢的條件
語法:一條select語句用()包裹得到的結果作為另一條select語句的條件
select name from emp where salary in (select max(salary) '最高薪資' from emp?? where? dep ='教學部'? group by gender)
單行子查詢:
子查詢語句的結果為一行數據,可以結合 = | < | > | <= | >= | != 運算符來完成父查詢
?
多行子查詢:
子查詢語句的結果為多行數據,可以結合 in | all | any 運算符來完成父查詢
in:任意單一值,只能考慮子查詢中的一個結果??? 只要結果中的數據滿足后面的條件的任意一個
all:全部值,將子查詢結果作為一個整體考慮??? 要把條件看做一個整體.類似于要大于最大的,或者小于最小的
any:任意多個值:子查詢的每一個結果都可以作為參考依據??? 只要大于其中一個,或者小于其中的任意一個就行
子查詢的結果 (9.4 , 3)
select name from emp where salary = in (select max(salary) '最高薪資' from emp?? where? dep ='教學部'? group by gender)??? 遍歷14條數據的salary 在(9.4,3)中就可以匹配,結果就2條 9.4和3的兩條
?
select name from emp where salary <all (select max(salary) '最高薪資' from emp?? where? dep ='教學部'? group by gender)? 遍歷14條數據的salary 小于(9.4,3)中的每一個就是小于3
select name from emp where salary >any (select max(salary) '最高薪資' from emp?? where? dep ='教學部'? group by gender)? 遍歷14條數據的salary 大于(9.4,3)中的任意一個數據就行均滿足條件
?
?
?
having 篩選:
完成分組之后的篩選
注意 :having條件是實現聚合結果層面上的篩選 => 拿聚合結果來完成判斷
需求:
平均薪資大于6w的部門
select dep ,avg(salary) '平均薪資' from emp group by dep;
解決:以dep進行分組,以avg(salary)作為判斷條件(篩選)
select dep ,avg(salary) '平均薪資' from emp? group by dep?? having avg(salary)>6;
總結:having通過聚合函數結果完成篩選
?
order by 排序:
why:完成排序
注意:可以使用聚合函數,哪怕沒有明確group by
?
升序 | 降序:asc | desc
eg:order by age desc => 按照年齡降序
默認升序
需求:
將部門按照平均工資降序方式排序
select dep,avg(salary) from emp group by dep order by avg(salary);? 默認升序
limit 限制:
why:限制最終結果的數據行數
注意:limit只與數字結合使用
?
應用:
limit 1:只能顯示一行數據
limit 6,5:從第6+1行開始顯示5條數據(索引從0開始)
?
需求:
獲得薪資最高的人的一條信息
select *from emp order by salary desc limit 1;
?
轉載于:https://www.cnblogs.com/fanbiyong/p/10251784.html
總結
以上是生活随笔為你收集整理的mysql 完整的增删改查 和单表查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发中遇到的问题,以及笔记
- 下一篇: mybatis查询时间段sql语句