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:还可以包含比较运算符:= 、 !=、> 、<等