MySQL数据库(基本操作之增删改查)

参考网址:https://gitee.com/moist-master/rimi_linux_mysql

*数据库基础操作(增删改查):

1.创建数据库:create database+数据库名称 default character set utf8mb4 collate utf8mb4_general_ci(增加)
2.修改数据库:alter database+数据库名称 default character set utf8mb4 collate utf8mb4_general_ci(修改,将create换成alter即是修改数据库信息)
3.查看有哪些数据库:show databases (查询)
4.进入数据库:use+数据库名称
5.查看当前数据库下所有表:show tables
6.删除数据库:drop database +数据库名称(删除)

*数据表基础操作(增删改查):

**
1.创建数据表:create table +数据表名称(字段名 字段类型(字段长度) primary key,字段名 字段类型(字段长度))

primary key表明将该字段设置为主键,需要添加多少字段就在括号里面写多少,各字段彼此用逗号隔开
1
2.为数据表添加字段:alter table +数据表名称 add +要添加的字段名 字段类型(10) not Null (后面not Null可要可不要,not Null是一个约束条件,代表该字段的值是否可以为空,设置为not Null则在插入数据时必须要有数据值)
3.在指定的字段后面增加一个字段:alter table +数据表名称 add +要添加的字段名 字段类型(10) [是否为空] after 已存在的字段名
4.删除字段:alter table +数据表名称 drop +字段名称
5.修改某个表的字段名称及指定为空或非空:alter table 表名 change 原字段名 新字段名 字段类型 [是否为空];
6.修改某个表的字段类型及指定为空或非空:alter table 表名 modify 字段名 字段类型 [是否为空];
7.插入数据:insert into +数据表名称(各字段名称) values(各字段对应的值),(各字段对应的值)(values后面可以直接写多行数据一起插入,彼此逗号隔开)
8.修改或者更新表中数据信息:update 数据表名称 set 要修改的字段名=‘new_value’ where id=1
9.删除表:drop table +数据表名称
10.select * from user\G 以行的形式展现所有字段信息
11.查询当前数据库下指定数据表的详细信息:select * from +数据表名称
12.重命名数据表名称:alter table 表原名称 rename 表新名称
13.删除一条数据:delete from 表名称 where id=1
14.查询数据表结构:show columns from +数据表名称 (等价查询:desc +数据表名称)

可以将*号换成指定字段名(可以写上多个字段名,用逗号隔开),表明查看该表指定字段的信息
1
15.更新数据,即对表中存在的数据进行修改:update 表名 set +字段名1=值1[,字段名2=值2,…] +where 条件表达式

16.删除数据,表名指的是要执行删除操作的表。 where 条件表达式,可选参数,只要满足条件的记录会被删除。语法:delete from +表名 [where 条件表达式]

MySQL基础查询:

1.查看所有数据,使用* 代表查询所有字段:select * from +数据表名称;

2.查询部分字段数据,字段名加逗号隔开,代表查询部分字段:select 字段1,字段2 from +数据表名称;

3.where 限制条件查询:select col1,col2 from user where col1=xxx

4.limit 表示查询多少条数据或者从多少条到多少条数据:

1)select Id,Sex from 数据表名称 limit 2(代表查询指定字段前两条信息)
2)select * from 数据表名称 limit 3,2 (表示查询从第三条后面一条开始记录,显示出2条数据来)
3)select * from table limit 95,-1; // 检索记录行 96-到最后
1
2
3
5.order by 排列数据顺序,可以让数据遵从某个字段来排序,desc 倒序,asc正序
1)select * from 表名称 order by Id desc (以字段Id为准且倒序排列输出)
2)select * from 表名称 order by Name asc (以字段Name为准正序排列输出)
3)select * from 表名称 order by Name (以字段Name为准来排序)

6.in,between ;in表示在其中的数据,between表示在两个数之间的数据查询:
1)select * from Student where Id between 3 and 5 (表示以Id字段为准,查询第三条至第五条之间的数据,包含第三和第五)
2)select * from Student where Id in(1,7,6) (表示以Id字段为准,查询Id为1,6,7的数据)

7.or,and 表示在数据满足一个或者全部都满足:
1)select * from atable where col1=n1 or col2=n2//表示数据必须满足启动一项
2)select * from atable where col1=n1 and col2=n2//表示数据必须满足两个才行

8.运算符,可以使用运算符表示数据大于 小于等于等情况:
1)select * from atable where col1>=n1 //col 大于等于n1
2)select * from atable where col1!=n1 //col不等于n1

9.group by 分组查询,把某个列相同的数据分为一组来查询(即类似分类汇总。将前面复合函数查询到结果根据group by 后面的字段进行分组,并且将相同的字段并称一列数据,如果group by 后面没有这个字段的话就要分成好多的数据)

1)select max(工资),编号 from guest group by 编号
在这里插入图片描述
如图所示,表示查询到的结果按照姓名字段分组,叫王五的所有人的平均分以及工资总和。
9.like 模糊查询,使用like语句表示查询的时候匹配查询, %表示0、1或者多个字符的占位符, _ 表示一个字符的占位符(即通配符)。
1)select * from atable where col1 like ‘%test1%’//col
2)select * from t_persons where address like ‘%t’(表示任意字符开头,t结尾的)
3)select * from t_persons where address like ‘%ch%’(表示任意字符开头,结尾也是任意字符,中间包含ch)

10.MySql 中 case when then else end 的用法:
SELECT
case -------------如果
when sex=‘1’ then ‘男’ -------------sex=‘1’,则返回值’男’
when sex=‘2’ then ‘女’ -------------sex=‘2’,则返回值’女’
else 0 -------------其他的返回’其他’
end -------------结束
from sys_user --------整体理解: 在sys_user表中如果sex=‘1’,则返回值’男’如果sex=‘2’,则返回值’女’ 否则返回’其他’
example:

select case sex when “m” then “f” when “f” then “m” else “” end from salary; 等同于select case when sex=“m” then “f” when sex= “f” then “m” else “其他值” end from salary;
update salary set sex = case sex when “m” then “f” when “f” then “m” else “” end;
11.DATEDIFF()内置函数的使用:
example:select W1.Id from Weather as W1 join Weather as W2 on DATEDIFF(W1.RecordDate,W2.RecordDate) = 1 where W1.Temperature > W2.Temperature;
MySQL 使用 DATEDIFF 来比较两个日期类型的值。DATEDIFF(W1.RecordDate,W2.RecordDate) = 1代表的是两个日期差集为1
12. if条件判断语句的用法:
1)if(条件判断语句,语句1,语句2.),若条件判断语句为真则执行语句1,否则执行语句2,类似Python的三目运算符。
example:
2)ifNULL(语句1,语句2),若语句1为真,则正常执行语句1,若语句1为假,则执行语句2
example:select ifNULL((select distinct Salary from Employee order by Salary desc limit 1,1),NULL) as SecondHighestSalary;

连表查询

内联结
1.常用简单语法:select * from +表名1 join +表名2,这样就把两张表连起来了 统计在一张临时tables里面 (这种默认属于内联结,join也可以使用inner join),"*"号也可以换成两张表的指定字段名,表示只以这两个字段的数据信息连接起来,看下面例子
例:
1)select Student.Department,Student1.Department from Student join Student1 on Student.Name=Student1.Name
2)select * from class1 join class2 on class1.name=class2.name ,这样就将表1和表2中字段name相同的数值查询出来了 这种语法也等价于:select * from class1,class2 where class1.name=class2.name

在连表查询中可以使用on代替限制条件查询中的where

1
2.别名的使用(起别名目的是让数据列的名字不允许产生歧义)
1)通常不起别名,直接指定表和字段名称语法是:select Student.Department,Student1.Department from Student join Student1 on Student.Name=Student1.Name
2)给表起别名的语法是:select a.Department,b.Department from Student as a join Student1 as b on a.Name=b.Name

外联结
1.说明:内联结只显示在两个数据表里都能找到匹配的数据行。外联结除了显示同样的匹配结果,还可以把其中一个数据表在另一个数据表里没有匹配的数据行也显示出来

2.外联结:外联结分左联结和右联结两种。左联结(left join)意思是把左数据表在右数据表里没有匹配的数据行也显示出来。right join刚好与此相反,它将把右数据表在左数据表里没有匹配的数据行也显示出来。

3.外联结的工作情况(即left join与right join的工作情况)是这样的:你给出用来匹配两个数据表里的数据行的数据列,当来自左数据表的某个数据行与来自右数据表的某个数据行匹配时,那两个数据行的内容就会被选取为一个输出数据行;如果来自左数据表的某个数据行在右数据表里找不到匹配,它也会被选取为一个输出数据行,此时与它联结的是一个来自右数据表的“假”数据行,这个“假”数据行的所有数据列都包含NULL值。
在这里插入图片描述
4.外联结用处:left join很有用,尤其是在你只想找出在右数据表里没有匹配的左数据表的行时。具体地说,增加一条WHERE子句,让它把右数据表的数据列全部是NULL值的(也就是那些在一个数据表里有匹配,但在另一个数据表里没有匹配)数据行筛选出来。right join同样效果
例如:select a.i1,b.i2 from t1 as a left join t2 as b on a.i1=b.i2 where b.i2 is null

5.其他知识点:
example:select name as Customers from Customers left join Orders on Customers.Id = Orders.CustomerId where Orders.CustomerId is NULL;(在添加限制条件是 NULL可以用 字段名 is NULL,而不是 字段名=NUL)

聚合函数 (重要)

简介
聚合函数aggregation function又称为组函数。 认情况下 聚合函数会对当前所在表当做一个组进行统计。

聚合函数的特点
1.每个组函数接收一个参数(字段名或者表达式) 统计结果中默认忽略字段为NULL的记录

2.要想列值为NULL的行也参与组函数的计算,必须使用IFNULL函数对NULL值做转换。

3.不允许出现嵌套 比如sum(max(xx))

详细的聚合函数
count 求数据表的行数

select count(*|字段名) from 数据表
max| min 求某列的最大|小数值

select max(字段名)from 数据表
sum 对数据表的某列进行求和操作

select sum(字段名) from 数据表
avg,对数据表的某列进行求平均值操作

select avg(字段名) from 数据表
GROUP BY 分组

SELECT 列名 COUNT(*)表名 GROUP BU 列名
去重 distinct 用来去除查询结果中的重复记录,具体的语法如下

select distinct expression[,expression...] from tables [where conditions];

列如:

建表语句

CREATE TABLE `person` (
    `id`  int(11) NOT NULL AUTO_INCREMENT ,
    `name`  varchar(30) NULL DEFAULT NULL ,
    `country`  varchar(50) NULL DEFAULT NULL ,
    `province`  varchar(30) NULL DEFAULT NULL ,
    `city`  varchar(30) NULL DEFAULT NULL ,
    PRIMARY KEY (`id`)
)ENGINE=InnoDB
;

插入语句

insert into `test111`.`person1` ( `country`, `province`, `name`, `city`) values ( 'China', 'sichuang', 'abc1', 'chengdu');
insert into `test111`.`person1` ( `country`, `province`, `name`, `city`) values ( 'China', 'sichuang', 'abc2', 'mianyang');
insert into `test111`.`person1` ( `country`, `province`, `name`, `city`) values ( 'China', 'chongqing', 'abc3', 'chongqing');
insert into `test111`.`person1` ( `country`, `province`, `name`, `city`) values ( 'japan', 'bingku', 'abc4', 'shenhu');
insert into `test111`.`person1` ( `country`, `province`, `name`, `city`) values ( 'korea', 'jingji', 'abc5', 'shuiyuan');

只对一列操作

select distinct country from person1

多列操作

select distinct country, province from person1
从上例中可以发现,当distinct应用到多个字段的时候,其应用的范围是其后面的所有字段,而不只是紧挨着它的一个字段,而且distinct只能放到所有字段的前面

having表示筛选 和where不同点在于having后面可以跟上聚合函数

SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000

mysql 子查询

数据准备
CREATE TABLE goods (
id int(11) NOT NULL,
name varchar(20) DEFAULT NULL,
kind varchar(20) DEFAULT NULL,
price int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
insert into test111.goods ( id, kind, name, price) values ( ‘1’, ‘phone’, ‘phone1’, ‘1000’);
insert into test111.goods ( id, kind, name, price) values ( ‘2’, ‘phone’, ‘phone2’, ‘999’);
insert into test111.goods ( id, kind, name, price) values ( ‘3’, ‘phone’, ‘phone3’, ‘1001’);
insert into test111.goods ( id, kind, name, price) values ( ‘4’, ‘phone’, ‘phone4’, ‘3000’);
insert into test111.goods ( id, kind, name, price) values ( ‘5’, ‘car’, ‘car1’, ‘400000’);
insert into test111.goods ( id, kind, name, price) values ( ‘6’, ‘car’, ‘car2’, ‘800000’);
insert into test111.goods ( id, kind, name, price) values ( ‘7’, ‘car’, ‘car3’, ‘150000’);
insert into test111.goods ( id, kind, name, price) values ( ‘8’, ‘com’, ‘computer1’, ‘10000’);
insert into test111.goods ( id, kind, name, price) values ( ‘9’, ‘com’, ‘computer2’, ‘8000’);
insert into test111.goods ( id, kind, name, price) values ( ‘10’, ‘com’, ‘computer3’, ‘9000’);
概述 mysql可以把查询的结果做为另外一个查询的条件来使用
1、where型子查询(把内层查询结果当作外层查询的比较条件)
查询id最大的一件商品(使用排序+分页实现)

select * from goods ORDER BY id desc LIMIT 0,1

查询id最大的一件商品(使用where子查询实现)

select * from goods where id=(select max(id) from goods);

查询每个类别下id最大的商品(使用where子查询实现)

select * from goods where id in (select max(id) from goods group by kind)

2.from型子查询(把内层的查询结果当成临时表,供外层sql再次查询。查询结果集可以当成表看待。临时表要使用一个别名。)
查询car的值,重点 使用了 as tmp给内存表取名字

select * from (select * from goods where kind=‘car’) as tmp order by id desc

some any all exists
数据准备
建表

CREATE TABLE salary_table(id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,position VARCHAR(40) NOT NULL,salary INT);
插入数据

INSERT salary_table(position,salary) VALUES(‘JAVA’,8000),(‘Java’,8400),(‘Java’,9000),(‘Python’,6500),(‘Python’,10000),(‘Python’,8900);

  1. any 和 some
    select * from salary_table where salary > some (select salary from salary_table where position = ‘Python’);

some和any会帮助我们筛选出最小的一个数来作为条件

  1. all
    select * from salary_table where salary > all (select salary from salary_table where position = ‘java’);

all 会筛选出满足所有条件的选项

some 和 any 等于 in
SELECT * FROM salary_table WHERE salary IN (SELECT salary FROM salary_table WHERE position = ‘Python’);
SELECT * FROM salary_table WHERE salary =some (SELECT salary FROM salary_table WHERE position = ‘Python’);
= some 或者 any可以帮助我们筛选出来像in一样的条件语句

  1. exists
    exists会判断数据是否存在 如果不存在则不会筛选数据

select * from salary_table where exists(SELECT * from salary_table where id = 1)

mysql 多表查询

说明:

之前的讨论都是针对于单表的查询,接下来将讨论多表的查询,多表之间的关系。

准备数据

创建数据表t1

CREATE TABLE t1 (i1 int(11) NOT NULL,c1 varchar(255) DEFAULT NULL,PRIMARY KEY (i1))
创建数据表t2

CREATE TABLE t2 (i2 int(11) NOT NULL,c2 varchar(255) DEFAULT NULL,PRIMARY KEY (i1))
插入数据

insert into t1 (i1,c1) values(1,‘a’),(2,‘b’),(3,‘c’);

insert into t2 (i2,c2) values(2,‘c’),(3,‘b’),(4,‘a’);
显示如下 t1

±—±-----+
| i1 | c1 |
±—±-----+
| 1 | a |
| 2 | b |
| 3 | c |
±—±-----+

t2

±—±-----+
| i2 | c2 |
±—±-----+
| 2 | c |
| 3 | b |
| 4 | a |
±—±-----+

内联结

说明:

如果你在SELECT语句的FROM子句里列出了多个数据表,并用INNER JOIN将它们的名字隔开,MySQL将执行内联结(inner join)操作,这将通过把一个数据表里的数据行与另一个数据表里的数据行进行匹配来产生结果。

语句

执行查询语句

mysql> select * from t1 inner join t2;
结果

±—±-----±—±-----+
| i1 | c1 | i2 | c2 |
±—±-----±—±-----+
| 1 | a | 2 | c |
| 2 | b | 2 | c |
| 3 | c | 2 | c |
| 1 | a | 3 | b |
| 2 | b | 3 | b |
| 3 | c | 3 | b |
| 1 | a | 4 | a |
| 2 | b | 4 | a |
| 3 | c | 4 | a |
±—±-----±—±-----+
在这条语句里,SELECT 的含义是,从FROM子句所列出的每一个数据表里选取每一个数据列。你也可以把这写成SELECT t1.,t2.*:

select t1.,t2. from t1 inner join t2;
根据某个数据表里的每一个数据行与另一个数据表里的每一个数据行得到全部可能的组合的联结操作叫做生成笛卡儿积(cartesian product)。像这样来联结数据表有可能产生非常多的结果数据行,因为结果数据行的总数将是对每个数据表的数据行个数进行连续乘法而得到的积。假设你有3个数据表分别包含100、200和300个数据行,它们的交叉联结将返回6百万个(100×200×300)数据行。这可是个相当大的数字,而那3个数据表都很小。在这种情况下,通常需要增加一条WHERE子句以便把结果集压缩到一个更便于管理的尺寸。

执行语句

elect t1.*,t2.* from t1 inner join t2 where t1.i1=t2.i2;

结果

+----+----+----+----+
 | i1 | c1 | i2 | c2 |
 +----+----+----+----+
 | 2  | b  | 2  | c  |
 | 3  | c  | 3  | b  |
 +----+----+----+----+

等价的查询

CROSS JOIN和JOIN联结类型类似于INNER JOIN。

select t1.,t2. from t1 cross join t2 where t1.i1=t2.i2;

select t1.,t2. from t1 join t2 where t1.i1=t2.i2;

“,”(逗号)关联操作符的效果与INNER JOIN相似

select t1.,t2. from t1,t2 where t1.i1=t2.i2;
请注意,逗号操作符的优先级和其他联结类型不一样,有时还会导致语法错误,而其他联结类型没有这些问题。我个人认为应该尽量避免使用逗号操作符。

on语句

用一条ON子句代替WHERE子句。下面是一个使用了ON子句的INNER JOIN操作的例子

select t1.,t2. from t1 join t2 on t1.i1=t2.i2;
别名的使用

在SELECT语句里给出的数据列的名字不允许产生歧义,而且必须来自FROM子句里的某个数据表。如果只涉及一个数据表,就不会产生歧义,被列出的所有数据列都来自那个数据表。如果涉及多个数据表,只在一个表中出现的数据列名称不会产生歧义。不过,如果某个数据列的名字出现在多个数据表里,在引用这个数据列时必须使用tbl_namel.col_name语法给它加上一个数据表的名字来表明它来自哪一个数据表。

直接指定表和字段名称

select t1.i1,t2.i2 from t1 join t2 on t1.i1=t2.i2;

给表起别名

```
select a.i1,b.i2 from t1 as a join t2 as b on a.i1=b.i2;
```

外连接

说明:

内联结只显示在两个数据表里都能找到匹配的数据行。外联结除了显示同样的匹配结果,还可以把其中一个数据表在另一个数据表里没有匹配的数据行也显示出来。外联结分左联结和右联结两种。本小节里的绝大多数例子使用的是LEFT JOIN,意思是把左数据表在右数据表里没有匹配的数据行也显示出来。RIGHT JOIN刚好与此相反,它将把右数据表在左数据表里没有匹配的数据行也显示出来,数据表的角色调换了一下。

LEFT JOIN的工作情况是这样的:你给出用来匹配两个数据表里的数据行的数据列,当来自左数据表的某个数据行与来自右数据表的某个数据行匹配时,那两个数据行的内容就会被选取为一个输出数据行;如果来自左数据表的某个数据行在右数据表里找不到匹配,它也会被选取为一个输出数据行,此时与它联结的是一个来自右数据表的“假”数据行,这个“假”数据行的所有数据列都包含NULL值。

LEFT JOIN

select a.i1,b.i2 from t1 as a left join t2 as b on a.i1=b.i2;
±—±-------+
| i1 | i2 |
±—±-------+
| 1 | |
| 2 | 2 |
| 3 | 3 |
±—±-------+
right join

elect a.i1,b.i2 from t1 as a right join t2 as b on a.i1=b.i2;
±-------±—+
| i1 | i2 |
±-------±—+
| 2 | 2 |
| 3 | 3 |
| | 4 |
±-------±—+
用处

LEFT JOIN很有用,尤其是在你只想找出在右数据表里没有匹配的左数据表的行时。具体地说,增加一条WHERE子句,让它把右数据表的数据列全部是NULL值的(也就是那些在一个数据表里有匹配,但在另一个数据表里没有匹配)数据行筛选出来

select a.i1,b.i2 from t1 as a right join t2 as b on a.i1=b.i2 where a.i1 is null;
±-------±—+
| i1 | i2 |
±-------±—+
| | 4 |
±-------±—+
LEFT JOIN还有几种同义词和变体。LEFT OUTER JOIN是LEFT JOIN的一个同义词

猜你喜欢

转载自blog.csdn.net/weixin_43843797/article/details/86478590