Mysql行操作

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)算符:= 、 !=、> 、<等
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容