SQL基础之增删改查

SQL之增删改查

速成SQL之增删改查

SQL(Structured Query Language:结构化查询语言)是用于访问和处理数据库的标准的计算机语言。

SQL 对大小写不敏感:SELECT 与 select 是相同的。

插入数据 INSERT INTO

INSERT INTO [TABLE_NAME] (column1, column2, column3,...columnN) 
VALUES (value1, value2, value3,...valueN);

比如:
先创建person表

create table person(
   id int primary key,
   name varchar(16) not null,
   age int,
   phone varchar(11),
   address varchar(256)
);

插入数据:

insert into person(id,name,age,phone,address)
values (1,'ayan',22,'123232323','中国上海');

此时查询person表会看到

+----+------+------+-----------+--------------+
| id | name | age  | phone     | address      |
+----+------+------+-----------+--------------+
|  1 | ayan |   22 | 123232323 | 中国上海     |
+----+------+------+-----------+--------------+

注意插入数据时,可以仅插入部分数据,此时空出的数据如果设定有默认值则显示默认值,如果没有在关系型数据库中会默认为NULL

比如插入

insert into person(id,name)
values (2,'cao');

此时会显示:

+----+------+------+-----------+--------------+
| id | name | age  | phone     | address      |
+----+------+------+-----------+--------------+
|  1 | ayan |   22 | 123232323 | 中国上海     |
|  2 | cao  | NULL | NULL      | NULL        |
+----+------+------+-----------+--------------+

删除数据DELETE

使用删除时一般如下:

DELETE FROM [table_name]
WHERE [condition];

如果不追加where会导致删除整张表的数据,所以例如删除id为1的数据如下:

delete form person where id = 1;

修改数据UPDATE

使用时一般如下格式:

UPDATE [table_name]
SET column1 = value1, column2 = value2...., columnN = valueN

比如如果该表情况如下:

+----+------+------+-----------+--------------+
| id | name | age  | phone     | address      |
+----+------+------+-----------+--------------+
|  1 | ayan |   22 | 123232323 | 中国上海     |
|  2 | cao  | NULL | NULL      |  NULL       |
+----+------+------+-----------+--------------+

此时我们输入:

update person set address='四川理塘';

则此时person表如下:

+----+------+------+-----------+--------------+
| id | name | age  | phone     | address      |
+----+------+------+-----------+--------------+
|  1 | ayan |   22 | 123232323 | 四川理塘     |
|  2 | cao  | NULL | NULL      | 四川理塘     |
+----+------+------+-----------+--------------+

此时由于我们没有指定修改哪一条数据,整张表的address都被修改了,一般我们也会使用where进行限定数据进行修改

update person set address='四川理塘' where id = 2;

此时只会修改id为2的数据

查询数据SELECT

select查询数据库中的表中的我们所需要的数据,并且是以表的方式进行返回,返回的表称作结果集

基础查询语句如下:

select column1,column2,...,columnN FROM table_name;

如果需要查询所有字段,则可以使用*替代全部成员,如:

select * from person;

where字句

where 子句又被称为条件子句,用于筛选查询出来的数据集,指定的条件语句中可以使用基本的算术、关系和逻辑运算,例如:>,<,=,!=,&&,||。

例如:person表如下:

+----+-------+------+------------+--------------+
| id | name  | age  | phone      | address      |
+----+-------+------+------------+--------------+
|  1 | ayan  |   22 | 231232132  | 中国上海     |
|  2 | cao   | NULL | NULL       | 浙江杭州     |
|  3 | li    |   23 | 34567894   | 江苏南京     |
|  4 | huang |   33 | 34567894   | 湖北武汉     |
|  5 | zhang |   30 | 4567890    | 中国北京     |
|  6 | yang  |   24 | 2343435353 | 山东青岛     |
+----+-------+------+------------+--------------+

需求为,我们需要查询名字叫做li,年龄为22的记录该写什么查询语句?

select * from person
where name='li' && age=22;

like字句

很多时候我们只知道我们所需要查询的一些信息,此时可以使用到like进行部分匹配,利用通配符进行组合查询,比如:

  • %:匹配任意多个字符
  • _:匹配一个字符

比如:'%ang'查询的就是带有ang后缀的所有,表中为huang、zhang、yang,而'_ang'查询的就是单个任意字符以ang为后缀,表中为yang。

select * from person where name like '%ang';
select * from person where name like '_ang';

in字句

in 关键字也是使用在 where 子句的条件表达式中,它限制的是一个集合,只要字段的值在集合中即符合条件,例如:

select * from person
where age in (22,30,23);

这个 SQL 语句可以查询出来所有年龄是 22,30,23 的人数据记录。

你也可以使用 not in 反向限制,例如:

select * from person
where age not in (22,30,23);

查询的是所有年龄不是22,30,23的数据的记录信息

order by字句

ORDER BY 子句根据一列或者多列的值,按照升序或者降序排列数据。某些数据库就默认以升序排列查询结果。

基本的 SQL 语法为:

SELECT column
FROM table_name 
WHERE condition
ORDER BY column1, column2, .. columnN  [ASC | DESC];

ASC 表示数据结果集按升序排序,DESC 表示数据结果集按降序排序。

order by后跟的属性值为排序依据,其后若跟多个值是因为存在第一个值相同的情况,此时判断第二个值进行排序,以此类推。

例如:将 person 表中的数据参照 id 列,倒序排序:

select * from person
order by id desc;

结果如下:

+----+-------+------+------------+--------------+
| id | name  | age  | phone      | address      |
+----+-------+------+------------+--------------+
|  6 | yang  |   24 | 2343435353 | 山东青岛     |
|  5 | zhang |   30 | 4567890    | 中国北京     |
|  4 | huang |   33 | 34567894   | 湖北武汉     |
|  3 | li    |   23 | 34567894   | 江苏南京     |
|  2 | cao   | NULL | NULL       | 浙江杭州     |
|  1 | ayan  |   22 | 231232132  | 中国上海     |
+----+-------+------+------------+--------------+

group by字句

GROUP BY 用于将查询返回的结果集进行一个分组,并展示各个分组中排在第一个的记录,将分组中其余成员隐藏。

我们为 person 表添加几条数据,用于演示

+----+-------+------+------------+----------+
| id | name  | age  | phone      | address  |
+----+-------+------+------------+----------+
|  1 | ayan  |   22 | 231232132  | 中国上海 |
|  2 | cao   |   30 | 456789     | 浙江杭州 |
|  3 | li    |   23 | 34567894   | 江苏南京 |
|  4 | huang |   33 | 34567894   | 湖北武汉 |
|  5 | zhang |   30 | 4567890    | 中国北京 |
|  6 | yang  |   24 | 2343435353 | 山东青岛 |
|  7 | cao   |   44 | 12312312   | 河南郑州 |
|  8 | huang |   45 | 5677675    | 安徽合肥 |
|  9 | yang  |   80 | 3343738    | 江苏南通 |
+----+-------+------+------------+----------+

注意观察姓名列,有几组重复的姓名。

我们按照姓名对结果集进行分组,SQL 如下:

select * from person
group by name;

执行 SQL,得到结果:

+----+-------+------+-----------+----------+
| id | name  | age  | phone     | address  |
+----+-------+------+-----------+----------+
|  1 | ayan  |   22 | 231232132 | 中国上海 |
|  2 | cao   |   30 | 456789    | 浙江杭州 |
|  4 | huang |   33 | 34567894  | 湖北武汉 |
|  3 | li    |   23 | 34567894  | 江苏南京 |
|  6 | yang  |   24 | 2343435353 | 山东青岛 |
|  5 | zhang |   30 | 4567890   | 中国北京 |
+----+-------+------+-----------+----------+

此时发现相同姓名的仅显示了第一个数据,其余隐藏。

但是此时出现一个问题,此时顺序改变了,这是因为如果没有显式指定排序方式就会默认以分组依据的那个字段进行排序,在本例子中就是以name进行重新排序了。

所以如果不想顺序打乱,则可以指定我们想要的排列顺序,比如指定id顺序排列。

select * from person
group by name
order by id;

结果如下:

+----+-------+------+-----------+----------+
| id | name  | age  | phone     | address  |
+----+-------+------+-----------+----------+
|  1 | ayan  |   22 | 231232132 | 中国上海 |
|  2 | cao   |   30 | 456789    | 浙江杭州 |
|  3 | li    |   23 | 34567894  | 江苏南京 |
|  4 | huang |   33 | 34567894  | 湖北武汉 |
|  5 | zhang |   30 | 4567890   | 中国北京 |
|  6 | yang  |   24 | 2343435353 | 山东青岛 |
+----+-------+------+-----------+----------+

此时大家可能觉得这有啥用,只是合并了一些信息,但是我们也不知道少了哪些信息。

其实group by主要是我们依据需求进行分组后,获取分组内的一些信息。比如获取分组的平均年龄有多大,最高薪水,平均身高等。

比如:

select avg(age) as '平均年龄' from person
group by name;

此时结果为:

+----------+
| 平均年龄 |
+----------+
|  37.0000 |
|  39.0000 |
|  23.0000 |
|  42.0000 |
|  30.0000 |
+----------+

having 字句

HAVING 子句在简单来说就是一个高配版的 where 子句,无论是我们的分组或是排序,都是基于以返回的结果集,也就是说 where 子句的筛选已经结束。

那么如果我们对排序、分组后的数据集依然有筛选需求,就用到我们的 HAVING 子句了。

例如:

select avg(age) as vage from person
group by name
having vage>23;

分组之后,我们得到每个分组中数据的平均年龄,再者我们通过 having 语句筛选出平均年龄大于 23 的数据记录。

以上我们介绍了六个子句的应用场景及其使用语法,但是如果需要同时用到这些子句,语法格式是什么样的?作用优先级是什么样的?

SELECT column1, column2
FROM table
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

大家一定要记住这个模板,各个子句在 SQL 语句中的位置,可以不出现,但不得越位,否则就会出错

posted @   mobbu  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示