concat() 函數(shù)用于連接字符串
as 起別名
mysql> select concat(' 姓名: ',name,' 年薪: ',salary*12) as Annual_salary from employee;
+---------------------------------------+
| Annual_salary |
+---------------------------------------+
| 姓名: egon 年薪: 87603.96 |
| 姓名: alex 年薪: 12000003.72 |
| 姓名: wupeiqi 年薪: 99600.00 |
| 姓名: yuanhao 年薪: 42000.00 |
| 姓名: liwenzhou 年薪: 25200.00 |
| 姓名: jingliyang 年薪: 108000.00 |
| 姓名: jinxin 年薪: 360000.00 |
| 姓名: 成龍 年薪: 120000.00 |
| 姓名: 歪歪 年薪: 36001.56 |
| 姓名: 丫丫 年薪: 24004.20 |
| 姓名: 丁丁 年薪: 12004.44 |
| 姓名: 星星 年薪: 36003.48 |
| 姓名: 格格 年薪: 48003.96 |
| 姓名: 張野 年薪: 120001.56 |
| 姓名: 程咬金 年薪: 240000.00 |
| 姓名: 程咬銀 年薪: 228000.00 |
| 姓名: 程咬銅 年薪: 216000.00 |
| 姓名: 程咬鐵 年薪: 204000.00 |
+---------------------------------------+
18 rows in set (0.00 sec)
# 還可以分成兩列
mysql> select concat('姓名:',name,'n 年薪:', salary*12) as year_salary,concat('性別',sex) from employee;
+-------------------------------------+----------------------+
| year_salary | concat('性別',sex) |
+-------------------------------------+----------------------+
| 姓名:egonn 年薪:87603.96 | 性別male |
| 姓名:alexn 年薪:12000003.72 | 性別male |
| 姓名:wupeiqin 年薪:99600.00 | 性別male |
| 姓名:yuanhaon 年薪:42000.00 | 性別male |
| 姓名:liwenzhoun 年薪:25200.00 | 性別male |
| 姓名:jingliyangn 年薪:108000.00 | 性別female |
[root@solang day42--超難的mysql題-多表和單表查詢]# ll
總用量 40
-rw-r--r-- 1 root root 4973 12月 20 09:58 day42作業(yè).md
-rw-r--r-- 1 root root 13628 12月 20 09:58 mysql行(記錄)的詳細(xì)操作.md
-rw-r--r-- 1 root root 12979 12月 20 09:58 作業(yè).md
[root@solang day42--超難的mysql題-多表和單表查詢]# cat mysql行\(zhòng)(記錄\)的詳細(xì)操作.md
Mysql數(shù)據(jù)操作:DML
數(shù)據(jù)定義語言:DDl
數(shù)據(jù)控制語句:DCL
#### 存儲引擎
show engines; 查看存儲引擎
InnoDB mysql 5.6以上 默認(rèn)的存儲方式 支持行級鎖,表級鎖,外鍵,事務(wù) 保證數(shù)據(jù)安全 數(shù)據(jù)的完整性而設(shè)置的概念 樹tree-加速查詢(樹形結(jié)構(gòu)(數(shù)據(jù)+樹)+表結(jié)構(gòu))
staff.frm -- frame 表結(jié)構(gòu)
staff.ibd -- ibd innodb data
MyISAM 5.5版本以下 默認(rèn)的存儲方式,支持表級鎖,不支持事務(wù) 樹tree-加速查詢(樹形結(jié)構(gòu)+數(shù)據(jù)+表結(jié)構(gòu))
staff1.frm -- frame 表結(jié)構(gòu)
staff1.MYD -- data數(shù)據(jù)
staff1.MYI -- index 索引
MEMORY 內(nèi)存中的保存 斷開連接可能會丟失 基于hash
BLACKHOLE 內(nèi)存中的,不會保存
#### 插入數(shù)據(jù)insert
~~~python
1. 插入完整數(shù)據(jù)(順序插入)
語法一:
INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); #指定字段來插入數(shù)據(jù),插入的值要和你前面的字段相匹配
語法二:
INSERT INTO 表名 VALUES (值1,值2,值3…值n); #不指定字段的話,就按照默認(rèn)的幾個字段來插入數(shù)據(jù)
2. 指定字段插入數(shù)據(jù)
語法:
INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);
3. 插入多條記錄
語法:#插入多條記錄用逗號來分隔
INSERT INTO 表名 VALUES
(值1,值2,值3…值n),
(值1,值2,值3…值n),
(值1,值2,值3…值n);
4. 插入查詢結(jié)果
語法:
INSERT INTO 表名(字段1,字段2,字段3…字段n)
SELECT (字段1,字段2,字段3…字段n) FROM 表2
WHERE …; #將從表2里面查詢出來的結(jié)果來插入到我們的表中,但是注意查詢出來的數(shù)據(jù)要和我們前面指定的字段要對應(yīng)好
更新數(shù)據(jù)update
update 表名 set 字段1=值1,字段2=值2 where condition;
# 注意語法,可以同時修改多個值,用逗號分隔
# 更改哪些數(shù)據(jù),通過where條件來定位到符合條件的數(shù)據(jù)
示例:
update mysql,user set password=password('134') where user='root' and host='localhost';
刪除數(shù)據(jù)delete
語法:
delete from 表名 where conition; # 刪除符合條件的一些記錄
delete from 表名; 如果不加where條件,意思是將表里面的所有內(nèi)容都刪掉,但是清空所有的內(nèi)容,一般我們用truncate,能夠?qū)d置為0,delete不能將id置為零,再插入數(shù)據(jù)的時候,會按照之前的數(shù)據(jù)記錄的id數(shù)繼續(xù)遞增
示例:
delete from mysql.user where password='123';
show processlist; # 查看當(dāng)前連接的用戶
查詢數(shù)據(jù)select
單表查詢
#查詢數(shù)據(jù)的本質(zhì):mysql會到你本地的硬盤上找到對應(yīng)的文件,然后打開文件,按照你的查詢條件來找出你需要的數(shù)據(jù)。下面是完整的一個單表查詢的語法
select * from,這個select * 指的是要查詢所有字段的數(shù)據(jù)。
SELECT distinct 字段1,字段2... FROM 庫名.表名
#from后面是說從庫的某個表中去找數(shù)據(jù),mysql會去找到這個庫對應(yīng)的文件夾下去找到你表名對應(yīng)的那個數(shù)據(jù)文件,找不到就直接報錯了,找到了就繼續(xù)后面的操作
WHERE 條件
#從表中找符合條件的數(shù)據(jù)記錄,where后面跟的是你的查詢條件
GROUP BY field(字段) #分組
HAVING 篩選
#過濾,過濾之后執(zhí)行select后面的字段篩選,就是說我要確定一下需要哪個字段的數(shù)據(jù),你查詢的字段數(shù)據(jù)進(jìn)行去重,然后在進(jìn)行下面的操作
ORDER BY field(字段)
#將結(jié)果按照后面的字段進(jìn)行排序
LIMIT 限制條數(shù)
#將最后的結(jié)果加一個限制條數(shù),就是說我要過濾或者說限制查詢出來的數(shù)據(jù)記錄的條數(shù)
distinct 避免重復(fù)
select post from employee;
select distinct post from employee;
concat() 函數(shù)用于連接字符串
as 起別名
mysql> select concat(' 姓名: ',name,' 年薪: ',salary*12) as Annual_salary from employee;
+---------------------------------------+
| Annual_salary |
+---------------------------------------+
| 姓名: egon 年薪: 87603.96 |
| 姓名: alex 年薪: 12000003.72 |
| 姓名: wupeiqi 年薪: 99600.00 |
| 姓名: yuanhao 年薪: 42000.00 |
| 姓名: liwenzhou 年薪: 25200.00 |
| 姓名: jingliyang 年薪: 108000.00 |
| 姓名: jinxin 年薪: 360000.00 |
| 姓名: 成龍 年薪: 120000.00 |
| 姓名: 歪歪 年薪: 36001.56 |
| 姓名: 丫丫 年薪: 24004.20 |
| 姓名: 丁丁 年薪: 12004.44 |
| 姓名: 星星 年薪: 36003.48 |
| 姓名: 格格 年薪: 48003.96 |
| 姓名: 張野 年薪: 120001.56 |
| 姓名: 程咬金 年薪: 240000.00 |
| 姓名: 程咬銀 年薪: 228000.00 |
| 姓名: 程咬銅 年薪: 216000.00 |
| 姓名: 程咬鐵 年薪: 204000.00 |
+---------------------------------------+
18 rows in set (0.00 sec)
# 還可以分成兩列
mysql> select concat('姓名:',name,'n 年薪:', salary*12) as year_salary,concat('性別',sex) from employee;
+-------------------------------------+----------------------+
| year_salary | concat('性別',sex) |
+-------------------------------------+----------------------+
| 姓名:egonn 年薪:87603.96 | 性別male |
| 姓名:alexn 年薪:12000003.72 | 性別male |
| 姓名:wupeiqin 年薪:99600.00 | 性別male |
| 姓名:yuanhaon 年薪:42000.00 | 性別male |
| 姓名:liwenzhoun 年薪:25200.00 | 性別male |
| 姓名:jingliyangn 年薪:108000.00 | 性別female |
| 姓名:jinxinn 年薪:360000.00 | 性別male |
| 姓名:成龍n 年薪:120000.00 | 性別male |
| 姓名:歪歪n 年薪:36001.56 | 性別female |
| 姓名:丫丫n 年薪:24004.20 | 性別female |
| 姓名:丁丁n 年薪:12004.44 | 性別female |
| 姓名:星星n 年薪:36003.48 | 性別female |
| 姓名:格格n 年薪:48003.96 | 性別female |
| 姓名:張野n 年薪:120001.56 | 性別male |
| 姓名:程咬金n 年薪:240000.00 | 性別male |
| 姓名:程咬銀n 年薪:228000.00 | 性別female |
| 姓名:程咬銅n 年薪:216000.00 | 性別male |
| 姓名:程咬鐵n 年薪:204000.00 | 性別female |
+-------------------------------------+----------------------+
18 rows in set (0.00 sec)
concat_ws() 第一個參數(shù)為分隔符來進(jìn)行字符串拼接
mysql> select concat_ws(':',name,salary*12) as year_salary from employee; # 用冒號將name和salary連接起來
+----------------------+
| year_salary |
+----------------------+
| egon:87603.96 |
| alex:12000003.72 |
| wupeiqi:99600.00 |
| yuanhao:42000.00 |
| liwenzhou:25200.00 |
| jingliyang:108000.00 |
| jinxin:360000.00 |
| 成龍:120000.00 |
| 歪歪:36001.56 |
| 丫丫:24004.20 |
| 丁丁:12004.44 |
| 星星:36003.48 |
| 格格:48003.96 |
| 張野:120001.56 |
| 程咬金:240000.00 |
| 程咬銀:228000.00 |
| 程咬銅:216000.00 |
| 程咬鐵:204000.00 |
+----------------------+
18 rows in set (0.00 sec)
where語句
1. 比較運(yùn)算符:> < >= <= <> !=
2. between 80 and 100 值在80到100之間
3. in(80,90,100) 值是80或90或100
4. like 'egon%'
pattern可以是%或_,
%表示任意多字符
表示一個字符
5. 邏輯運(yùn)算符:在多個條件直接可以使用邏輯運(yùn)算符 and or not
Group by
SELECT distinct 字段1,字段2... FROM 庫名.表名
WHERE 條件
GROUP BY field(字段)
HAVING 篩選 #過濾,過濾之后執(zhí)行select后面的字段篩選,就是說我要確定一下需要哪個字段的數(shù)據(jù),你查詢的字段數(shù)據(jù)進(jìn)行去重,然后在進(jìn)行下面的操作
ORDER BY field(字段) #將結(jié)果按照后面的字段進(jìn)行排序
LIMIT 限制條數(shù)
注意:雖然語法里面我們先寫的select,但是并不是先執(zhí)行的select,按照mysql自己的規(guī)范來執(zhí)行的下面關(guān)鍵字的優(yōu)先級
from
where
group by
having
select
distinct
order by
limit
單獨(dú)使用GROUP BY關(guān)鍵字分組
SELECT post FROM employee GROUP BY post;
注意:我們按照post字段分組,那么select查詢的字段只能是post,想要獲取組內(nèi)的其他相關(guān)信息,需要借助函數(shù)
GROUP BY關(guān)鍵字和GROUP_CONCAT()函數(shù)一起使用,比如說我想按部門分組,每個組有哪些員工,都顯示出來,怎么搞
SELECT post,GROUP_CONCAT(name) FROM employee GROUP BY post;#按照崗位分組,并查看組內(nèi)所有成員名,通過逗號拼接在一起
SELECT post,GROUP_CONCAT(name,':',salary) as emp_members FROM employee GROUP BY post;
GROUP BY一般都會與聚合函數(shù)一起使用,聚合是什么意思:聚合就是將分組的數(shù)據(jù)聚集到一起,合并起來搞事情,拿到一個最后的結(jié)果
select post,count(id) as count from employee group by post;#按照崗位分組,并查看每個組有多少人,每個人都有唯一的id號,我count是計算一下分組之后每組有多少的id記錄,通過這個id記錄我就知道每個組有多少人了
關(guān)于集合函數(shù),mysql提供了以下幾種聚合函數(shù):count、max、min、avg、sum等,上面的group_concat也算是一個聚合函數(shù)了,做字符串拼接的操作
having
having的語法格式和where是一模一樣的,只不過having是在分組之后進(jìn)行的進(jìn)一步的過濾,where不能使用聚合函數(shù),having是可以使用聚合函數(shù)的
#!??!執(zhí)行優(yōu)先級從高到低:where > group by > having
#1. Where 發(fā)生在分組group by之前,因而Where中可以有任意字段,但是絕對不能使用聚合函數(shù)。
#2. Having發(fā)生在分組group by之后,因而Having中可以使用分組的字段,無法直接取到其他字段,having是可以使用聚合函數(shù)
distinct 去重
select distinct post from employee; # 注意distinct去重要寫在查詢字段的前面
order by 查詢排序
按單列排序
SELECT * FROM employee ORDER BY salary; #默認(rèn)是升序排列
SELECT * FROM employee ORDER BY salary ASC; #升序
SELECT * FROM employee ORDER BY salary DESC; #降序
限制查詢的記錄數(shù):limit
示例: #取出工資最高的前三位
SELECT * FROM employee ORDER BY salary DESC
LIMIT 3; #默認(rèn)初始位置為0,從第一條開始順序取出三條
SELECT * FROM employee ORDER BY salary DESC
LIMIT 0,5; #從第0開始,即先查詢出第一條,然后包含這一條在內(nèi)往后查5條
SELECT * FROM employee ORDER BY salary DESC
LIMIT 5,5; #從第5開始,即先查詢出第6條,然后包含這一條在內(nèi)往后查5條
多表查詢
#重點(diǎn):外鏈接語法
SELECT 字段列表
FROM 表1 INNER|LEFT|RIGHT JOIN 表2
ON 表1.字段 = 表2.字段;
inner 默認(rèn)join
# 左連接
#以左表為準(zhǔn),即找出所有員工信息,當(dāng)然包括沒有部門的員工
#本質(zhì)就是:在內(nèi)連接的基礎(chǔ)上增加左邊有右邊沒有的結(jié)果 #注意語法:
mysql> select employee.id,employee.name,department.name as depart_name from employee left join department on employee.dep_id=department.id;
+----+------------+--------------+
| id | name | depart_name |
+----+------------+--------------+
| 1 | egon | 技術(shù) |
| 5 | liwenzhou | 技術(shù) |
| 2 | alex | 人力資源 |
| 3 | wupeiqi | 人力資源 |
| 4 | yuanhao | 銷售 |
| 6 | jingliyang | NULL |
+----+------------+--------------+
# 右連接
#以右表為準(zhǔn),即找出所有部門信息,包括沒有員工的部門
#本質(zhì)就是:在內(nèi)連接的基礎(chǔ)上增加右邊有左邊沒有的結(jié)果
mysql> select employee.id,employee.name,department.name as depart_name from employee right join department on employee.dep_id=department.id;
+------+-----------+--------------+
| id | name | depart_name |
+------+-----------+--------------+
| 1 | egon | 技術(shù) |
| 2 | alex | 人力資源 |
| 3 | wupeiqi | 人力資源 |
| 4 | yuanhao | 銷售 |
| 5 | liwenzhou | 技術(shù) |
| NULL | NULL | 運(yùn)營 |
+------+-----------+--------------+
# 聯(lián)合查詢
select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id
;
子查詢
子查詢:#1:子查詢是將一個查詢語句嵌套在另一個查詢語句中。
#2:內(nèi)層查詢語句的查詢結(jié)果,可以為外層查詢語句提供查詢條件。
#3:子查詢中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關(guān)鍵字
#4:還可以包含比較運(yùn)算符:= 、 !=、> 、<等