数据表的操作
新增
普通插入
insert into 表名 values(值,值...)
注意: 此处的值要和表中的列相匹配
使用’‘单引号或者”“双引号来表示字符串
mysql> insert into student values(123,'zhangsan');
Query OK, 1 row affected (0.02 sec)
指定列插入
insert into 表名(列名,列名..)values(值,值..);
后面的值要与前面的列相对应
mysql> insert into student(name) values('lisi');
Query OK, 1 row affected (0.00 sec)
注意: 当我们指定列插入的时候,没有被指定的那一行(即没有插入数据的那一行则被填充为默认值;此处默认值为null
一次插入多行
insert into 表名 values(值,值...),(值,值...);
mysql> insert into student values(3,'天天'),(4,'多多');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
注意: 一次插入多行记录,相比于一次插入一行,分多次插入要快很多
DATETIME类型插入
(1)
可以是用一个固定格式的字符串,来表示时间日期
insert into student values(1,'zhangsan','2002-01-01 12:00:00');
(2)直接获取当前的时间
mysql> insert into student values(1,'zhangsan',now());
Query OK, 1 row affected (0.01 sec)
直接使用now()
查询
null参与任何运算以后,结果还是null
全列查询
select*from 表名;
把表中的所有行和所有列都查询出来
mysql> select*from student;
+------+----------+---------------------+
| id | name | birthday |
+------+----------+---------------------+
| 1 | zhangsan | 2024-05-08 13:20:22 |
+------+----------+---------------------+
1 row in set (0.01 sec)
指定列查询
select 列名,列名..from 表名;
比全列查询更加高效
查询字段为表达式
一边查询一边计算,在查询的时候,写作由列名构成的表达式,把这一列中的所有行都带入表达式中参与运算
(1)
(2)计算每个同学的总成绩
(3)注意: 表达式查询是列和列之间的运算,把每一行都带入到这样的运算中,不是行与行之间的运算
查询的时候给列/表达式/表指定别名
select 表达式/列名 as 别名 from 表名;
as也可以省略,但是我们一般不建议省略
去重
distinct 修饰某个列/多个列值相同的行,只会保留一个
select distinct 列名 from 表名;
==注意:==如果distinct有多个列时,只有当它这两列对应的行信息完全相同时才会去重
查询的时候排序
把行进行排序
明确排序规则
(1)针对哪个列作为比较规则
(2)排序的时候是升序还是降序
select 列名 from 表名 order by 列名 asc/desc;
PS:(1)order by 列名,这块的列名是指定某个列进行排序;
asc表示升序排序,desc表示降序排序,如果没有写这两个,那么默认为升序排序
(2)mysql是一个客户端服务器结构的程序,把请求发给服务器之后,服务器进行查询数据,并且把查询到的结果进行排序之后,再组织成响应数据返回客户端**(排序仍然是针对临时数据来展开的,此处的排序不影响原有数据在mysql服务器上存储的顺序)**
(3)(4)根据表达式进行排序
PS:在使用表达式的时候可以使用别名
(5)指定多个列来排序(重要),即order by后面有多个列,多个列之间使用,来分割开
多个列之间排序是有优先级的,写在前面的先排序,后面的依次
条件查询(重要)
会指定具体的条件,按照条件针对数据进行筛选
select 列名 from 表名 where 条件;
遍历这个表的每一行记录,把每一行的数据分别带入到条件中,如果条件成立,这个记录会被放入结果集合中;如果条件不成立,这个记录会被pass
(1)比较运算符
(2)逻辑运算符
PS:不能使用别名来汇总表达式将其使用在比较查询中(不能在where语句中使用别名)
(3)like详细说明
like模糊匹配:使用通配符,就是一些特殊的字符来表示一些特定的含义;
%:代指任意个任意字符;_:代指一个任意字符
PS:【1】0个字符也可以被%匹配出来,如下图所示
【2】%的使用:孙%:查询以 孙 开头的内容;%孙: 查询以 孙 结尾的内容;%孙%: 查询包含孙的.
总结: 此处模糊查询的功能是有限的,就像没有办法查询名字中带两个孙的这样的列及内容;
但在计算机中,进行模糊匹配字符串还有‘正则表达式’,通过这样的方式实现,但是正则表达式匹配速度很慢;
正则表达式: javaSE中String的一个方法split,参数其实就是一个正则表达式;比如按照 . 来切分,就需要写作 “\.”;如果是有原始字符串,就可以写简单了
分页查询(LIMIT)
select*这样的查询方式太危险了,一次性查询出来的东西太多了,所以我们使用分页查询(limit)去限制这次最多查询出多少个结果
(1)此时就是只查询3条数据,这块也可以写成limit 3 offest 0;(2)我们使用offest来达到查询3条下面的3条(4、5、6)和3条再下面的3条(7、8、9);offest是一个偏移量,一个下标
修改
普通修改
update 表名 set列名=值 where 条件;
注意: update后面不加任何条件,就是针对所有行进行修改(即不添加where条件)
mysql> select*from user;
+------+--------+--------+
| ID | accout | amount |
+------+--------+--------+
| 45 | 123 | 2000 |
| 355 | 246 | 900 |
| 199 | 145 | 4000 |
| 123 | NULL | 2000 |
+------+--------+--------+
4 rows in set (0.00 sec)
mysql> update user set ID=66 where accout=123 and amount=2000;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
mysql> select*from user;
+------+--------+--------+
| ID | accout | amount |
+------+--------+--------+
| 66 | 123 | 2000 |
| 355 | 246 | 900 |
| 199 | 145 | 4000 |
| 123 | NULL | 2000 |
+------+--------+--------+
4 rows in set (0.00 sec)
where条件来限制我们修改哪些行数据,它的用法和select里面的where用法是相同的,我们直接可以看上面的笔记
一次修改多个列
update 表名 set列名=值,列名=值... where条件;
这里的=就不是比较相等了,是赋值的作用
mysql> update user set ID=67,accout=124 where amount=2000;
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select*from user;
+------+--------+--------+
| ID | accout | amount |
+------+--------+--------+
| 67 | 124 | 2000 |
| 355 | 246 | 900 |
| 199 | 145 | 4000 |
| 67 | 124 | 2000 |
+------+--------+--------+
4 rows in set (0.00 sec)
PS:mysql> select * from exam result order by chinese + math + english limit 3;
这样的写法表示的是倒数后三行的信息,我们可以使用order by和limit来达到这样的效果
删除
普通删除
delete from 表名 where条件/order by/limit;
删除整张表
不指定任何条件,就是删除整张表
delete from 表名;
PS:(1)drop table 表名是删除了表和表中的所有数据,这个表彻底不存在了
(2)delete from 表名只是删除了表里面的数据,但是表依然是存在的,只是我们得到的就是一张空表了
总结
(1)delete和update都是很危险的操作,delete一旦删除的条件没有设置好,就可能把不该删的数据删掉
(2)这的删除/修改都是持久生效的,都会影响到数据库服务器硬盘中的数据