从零开始的Linux运维屌丝之路,资源免费分享平台   运维人员首选:简单、易用、高效、安全、稳定、社区活跃的开源软件

06 - MYSQL增删改查

发布:蔺要红08-09分类: MYSQL

 
# 条件筛选
    = 等于
    <> (sql作者支持的)或者 != 不等于
    > 大于
    < 小于
    >= 大于等于
    <= 小于等于 

# 增 插入数据

insert into student(name,age,register_date) values("linyaohong",3,"2019-06-08");
INSERT INTO STU (name,age,register_date) VALUES("lin",22,'2015-05-05'),("yao",32,'2015-05-06');
INSERT INTO stu3(name,age,register_date) SELECT name,age,register_date from stu;

# 删除

delete from student where id=5;
delete from userinfo;      # 清空userinfo表,插入新数据时,id从原来的基础上自增
truncate table  userinfo;  # 清空userinfo表,插入新数据时,id从1开始自增

# 修改数据更新(一定要接where 否则会全部改掉,后果严重严重严重)(数据特别重要的情况下,可以给表设置标记位0和1,删除的时候把1改为0,1则显示,0则不显示)
update student set name="LIN",age=18 where id=4;
update student set name="LinYaoHong",age=18 where name="LIN";


# 查询----------------------------------------------------------------------------------------

SELECT column_name,column_name  FROM table_name [WHERE Clause] [OFFSET M ] [LIMIT N]

查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
SELECT 命令可以读取一条或者多条记录。
可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
可以使用 WHERE 语句来包含任何条件。
可以通过OFFSET指定SELECT语句开始查询的数据偏移量,默认情况下偏移量为0,(从第几行开始查询)
可以使用 LIMIT 属性来设定返回的记录数


mysql> select name as 别名1,age as 别名2 from student;    #起一个别名显示
+-------+-------+
| 别名1 | 别名2 |
+-------+-------+
| lin   |    22 |
| yao   |    33 |


# 加入通用一列 并且给自定值,定义为0(测试的只有数字可以),如果写成汉字则报错
# 表中是没有 0 这个字段的

mysql> select name as 姓名,age as 年龄,register_date as 注册日期,0 as 状态 from
student;
+------+------+------------+------+
| 姓名 | 年龄 | 注册日期   | 状态 |
+------+------+------------+------+
| lin  |   22 | 2015-05-05 |    0 |
| yao  |   32 | 2015-05-06 |    0 |
| lin  |   22 | 2015-05-05 |    0 |



# UNION  UNION  ALL 合并两次查询

# UNION 把两次查询结果连起来,前提是列数要相同
 SELECT sid,sname FROM student
 UNION
 SELECT *  FROM class;

# UNION all 不自动去重
 SELECT sid,sname FROM student
 UNION  ALL
 SELECT sid,sname FROM student


#条件
select * from stu WHERE REVERSE(name) = "nil" # reverse 反转 nil > lin
select * from student where id>3 and age >4;
select * from student where id in (1,3);   # not in
select * from student where id between 5 and 7;       #(包含5,7)
select * from 表 where id in (select nid from 表)  # select * from stu where id in (SELECT id from stu3) #()里面只能查一列


# 过滤(通配符) 

select * from stu where  name like "y_";  # 一个_代表匹配一位,两个就代表两位,精准匹配
select * from stu where  name like "y%";  #l% 代表后面任意
select * from student where  register_date like "2019-04%";
select * from student where  name like "zhang%";    


# 分页 限制显示行数和开始查询的行数
SELECT * from stu limit 3;    #只显示3行
SELECT * from stu limit 3,5;  或者  select * from stu LIMIT 3 OFFSET 5;  #从第OFFSET4 条数据开始查,并且只显示LIMIT 3行  OFFSET不能单独使用


# 排序 DESC(降序) 和 ASC(升序)
select * from student order by register_date DESC limit 3; #取后3条数据
select * from student order by register_date ASC;
select * from student order by register_date ASC,age ASC; # 日期按照升序,如果相同则按照年龄的升序


# 聚合函数
count
max
min
sum
avg


# 分组统计一列,并统计个数
SELECT name from stu GROUP BY name #仅分组统计所有姓名
select name, COUNT(id) as stu_name总数 FROM stu GROUP BY name; # 分组统计所有姓名并且统计个数


# 如果对于聚合函数的结果进行二次筛选,必须使用having  (where语句后面不能出现聚合函数)
select name,count(id) from stu group by name having count(id) >4



#统计行数(总行数)
select count(id) from student;  

#分组统计取另外一列最大或者最小(min)
select name,max(age) as 年龄最大 from stu group by name


## 求年龄总数
select sum(age) as stu_age FROM student;
select sum(age) as stu_age FROM student WHERE id <4;  

# 分组求和(分组后,在统计一列的总和)
select name,sum(age) as stu_age FROM student GROUP BY name; 

# 分组求和并且包含总数统计
MySQL [lin]> select name,sum(age) as stu_age FROM student GROUP BY name with rollup;
+------------+---------+
| name       | stu_age |
+------------+---------+
| gangtiexia |      36 |
| LinYaoHong |     216 |
| zhangyang  |       9 |
| NULL       |     261 |
+------------+---------+
4 rows in set (0.00 sec)

# 连表查询
select * from stu left join dept on stu.dept_id=dept.id
# left : 左边全部显示
select * from stu right join dept on stu.dept_id=dept.id
# right  右边全部显示

# inner 不显示NULL行
select * from stu inner join dept on stu.dept_id=dept.id  #推荐
# 或者
SELECT * from stu ,dept where stu.dept_id=dept.id;

#或者 select * from stu,dept where stu.dept_id=dept.id(新版MYSQL性能都一样了)

# 查询表A和B的交集
select * from A LEFT JOIN B on A.a = B.b;
# 查询表A和B的差集
select * from A LEFT JOIN B on B.a = B.b;
# 查询表A和B的并集 不直接支持 FULL JOIN
select * from A left join B on A.a = B.b UNION select * from A right join B on A.a = B.b;
 
温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,如有侵权我会在24小时之内删除!

欢迎使用手机扫描访问本站