數據表的操作
新增
普通插入
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: 0mysql> 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)這的刪除/修改都是持久生效的,都會影響到數據庫服務器硬盤中的數據