Mysql行操作

concat() 函数用于连接字符串

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作业.md
-rw-r--r-- 1 root root 13628 12月 20 09:58 mysql行(记录)的详细操作.md
-rw-r--r-- 1 root root 12979 12月 20 09:58 作业.md
[root@solang day42--超难的mysql题-多表和单表查询]# cat mysql行\(记录\)的详细操作.md 
Mysql数据操作:DML 

数据定义语言:DDl

数据控制语句:DCL

#### 存储引擎

show engines; 查看存储引擎

InnoDB mysql 5.6以上 默认的存储方式 支持行级锁,表级锁,外键,事务 保证数据安全 数据的完整性而设置的概念 树tree-加速查询(树形结构(数据+树)+表结构)

staff.frm -- frame 表结构

staff.ibd -- ibd innodb data

MyISAM 5.5版本以下 默认的存储方式,支持表级锁,不支持事务 树tree-加速查询(树形结构+数据+表结构)

staff1.frm -- frame 表结构

staff1.MYD -- data数据

staff1.MYI -- index 索引

MEMORY 内存中的保存 断开连接可能会丢失 基于hash

BLACKHOLE 内存中的,不会保存

#### 插入数据insert

~~~python
1. 插入完整数据(顺序插入)
    语法一:
    INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); #指定字段来插入数据,插入的值要和你前面的字段相匹配

    语法二:
    INSERT INTO 表名 VALUES (值1,值2,值3…值n); #不指定字段的话,就按照默认的几个字段来插入数据

2. 指定字段插入数据
    语法:
    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. 插入查询结果
    语法:
    INSERT INTO 表名(字段1,字段2,字段3…字段n) 
                    SELECT (字段1,字段2,字段3…字段n) FROM 表2
                    WHERE …; #将从表2里面查询出来的结果来插入到我们的表中,但是注意查询出来的数据要和我们前面指定的字段要对应好

更新数据update

update 表名 set 字段1=值1,字段2=值2 where condition;
# 注意语法,可以同时修改多个值,用逗号分隔
# 更改哪些数据,通过where条件来定位到符合条件的数据
示例:
update mysql,user set password=password('134') where user='root' and host='localhost';

删除数据delete

语法:
    delete from 表名 where conition; # 删除符合条件的一些记录
    delete from 表名; 如果不加where条件,意思是将表里面的所有内容都删掉,但是清空所有的内容,一般我们用truncate,能够将id置为0,delete不能将id置为零,再插入数据的时候,会按照之前的数据记录的id数继续递增
示例:
    delete from mysql.user where password='123';

show processlist; # 查看当前连接的用户

查询数据select

单表查询

#查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据。下面是完整的一个单表查询的语法

select * from,这个select * 指的是要查询所有字段的数据。

SELECT distinct 字段1,字段2... FROM 库名.表名 
                #from后面是说从库的某个表中去找数据,mysql会去找到这个库对应的文件夹下去找到你表名对应的那个数据文件,找不到就直接报错了,找到了就继续后面的操作
                  WHERE 条件       
                #从表中找符合条件的数据记录,where后面跟的是你的查询条件
                  GROUP BY field(字段)   #分组
                  HAVING 筛选    
                  #过滤,过滤之后执行select后面的字段筛选,就是说我要确定一下需要哪个字段的数据,你查询的字段数据进行去重,然后在进行下面的操作
                  ORDER BY field(字段)   
                  #将结果按照后面的字段进行排序
                  LIMIT 限制条数    
                 #将最后的结果加一个限制条数,就是说我要过滤或者说限制查询出来的数据记录的条数

distinct 避免重复

select post from employee;
select distinct post from employee;

concat() 函数用于连接字符串

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() 第一个参数为分隔符来进行字符串拼接

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. 比较运算符:> < >= <= <> !=
2. between 80 and 100 值在80到100之间
3. in(80,90,100)  值是80或90或100
4. like 'egon%'
  pattern可以是%或_,
  %表示任意多字符
  表示一个字符
5. 逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

Group by

SELECT distinct 字段1,字段2... FROM 库名.表名 
                  WHERE 条件       
                  GROUP BY field(字段)   
                  HAVING 筛选      #过滤,过滤之后执行select后面的字段筛选,就是说我要确定一下需要哪个字段的数据,你查询的字段数据进行去重,然后在进行下面的操作
                  ORDER BY field(字段)   #将结果按照后面的字段进行排序
                  LIMIT 限制条数 

注意:虽然语法里面我们先写的select,但是并不是先执行的select,按照mysql自己的规范来执行的下面关键字的优先级
  from
  where
  group by
  having
  select
  distinct
  order by
  limit



单独使用GROUP BY关键字分组
    SELECT post FROM employee GROUP BY post;
    注意:我们按照post字段分组,那么select查询的字段只能是post,想要获取组内的其他相关信息,需要借助函数

GROUP BY关键字和GROUP_CONCAT()函数一起使用,比如说我想按部门分组,每个组有哪些员工,都显示出来,怎么搞
    SELECT post,GROUP_CONCAT(name) FROM employee GROUP BY post;#按照岗位分组,并查看组内所有成员名,通过逗号拼接在一起
    SELECT post,GROUP_CONCAT(name,':',salary) as emp_members FROM employee GROUP BY post;

GROUP BY一般都会与聚合函数一起使用,聚合是什么意思:聚合就是将分组的数据聚集到一起,合并起来搞事情,拿到一个最后的结果
    select post,count(id) as count from employee group by post;#按照岗位分组,并查看每个组有多少人,每个人都有唯一的id号,我count是计算一下分组之后每组有多少的id记录,通过这个id记录我就知道每个组有多少人了

关于集合函数,mysql提供了以下几种聚合函数:count、max、min、avg、sum等,上面的group_concat也算是一个聚合函数了,做字符串拼接的操作

having



having的语法格式和where是一模一样的,只不过having是在分组之后进行的进一步的过滤,where不能使用聚合函数,having是可以使用聚合函数的
#!!!执行优先级从高到低:where > group by > having 
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。

#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,having是可以使用聚合函数


distinct 去重

select distinct post from employee; # 注意distinct去重要写在查询字段的前面

order by 查询排序

按单列排序
    SELECT * FROM employee ORDER BY salary; #默认是升序排列
    SELECT * FROM employee ORDER BY salary ASC; #升序
    SELECT * FROM employee ORDER BY salary DESC; #降序

限制查询的记录数:limit

示例:  #取出工资最高的前三位
    SELECT * FROM employee ORDER BY salary DESC 
        LIMIT 3;                    #默认初始位置为0,从第一条开始顺序取出三条 
    
    SELECT * FROM employee ORDER BY salary DESC
        LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条 

    SELECT * FROM employee ORDER BY salary DESC
        LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条

多表查询

#重点:外链接语法

SELECT 字段列表
    FROM 表1 INNER|LEFT|RIGHT JOIN 表2
    ON 表1.字段 = 表2.字段;
inner 默认join
    
# 左连接
#以左表为准,即找出所有员工信息,当然包括没有部门的员工
#本质就是:在内连接的基础上增加左边有右边没有的结果  #注意语法:
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       | 技术         |
|  5 | liwenzhou  | 技术         |
|  2 | alex       | 人力资源     |
|  3 | wupeiqi    | 人力资源     |
|  4 | yuanhao    | 销售         |
|  6 | jingliyang | NULL         |
+----+------------+--------------+

# 右连接
#以右表为准,即找出所有部门信息,包括没有员工的部门
#本质就是:在内连接的基础上增加右边有左边没有的结果
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      | 技术         |
|    2 | alex      | 人力资源     |
|    3 | wupeiqi   | 人力资源     |
|    4 | yuanhao   | 销售         |
|    5 | liwenzhou | 技术         |
| NULL | NULL      | 运营         |
+------+-----------+--------------+

# 联合查询
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:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
#3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
#4:还可以包含比较运算符:= 、 !=、> 、<等
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353