mysql数据操作
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,一、插入数据INSERT1.插入完整数据(顺序插入)语法一:INSERT INTO 表名(字段1, 字段2, 字段3…字段n) VALUES(值1, 值2, 值3…值n);语法二:INSERT INT
千家信息网最后更新 2025年01月20日mysql数据操作
语法一:
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 …;
二、更新数据UPDATE
语法:
UPDATE 表名 SET
字段1=值1,
字段2=值2,
WHERE CONDITION;
示例:
UPDATE mysql.user SET password=password('123') where user='root' and host='localhost';
三、删除数据DELETE
语法:
DELETE FROM 表名
WHERE CONITION;
示例:
DELETE FROM mysql.user
WHERE password='';
四、权限管理
#创建用户
create user 'egon'@'1.1.1.1' identified by '123';
create user 'egon'@'192.168.1.%' identified by '123';
create user 'egon'@'%' identified by '123';
#授权:对文件夹,对文件,对文件某一字段的权限
查看帮助:help grant
常用权限有:select,update,alter,delete
all可以代表除了grant之外的所有权限
五、mysql单表查询
1、单表查询的语法
SELECT 字段1,字段2... FROM 表名
WHERE 条件
GROUP BY field
HAVING 筛选
ORDER BY field
LIMIT 限制条数
2、关键字的执行优先级
from #找到表
where #拿着where指定的约束条件,去文件/表中取出一条条记录
group by #将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
having #将分组的结果进行having过滤
select #执行select
distinct #去重
order by #将结果按条件排序
limit #限制结果的显示条数
3、简单查询
(1)查出所有员工的名字,薪资,格式为
<名字:egon> <薪资:3000>
(2)查出所有的岗位(去掉重复)
(3)查出所有员工名字,以及他们的年薪,年薪的字段名为annual_year
4、WHERE约束
练习:
(1)查看岗位是teacher的员工姓名、年龄
(2)查看岗位是teacher且年龄大于30岁的员工姓名、年龄
(3)查看岗位是teacher且薪资在9000-1000范围内的员工姓名、年龄、薪资
(4)查看岗位描述不为NULL的员工信息
(5)查看岗位是teacher且薪资是10000或9000或30000的员工姓名、年龄、薪资
(6)查看岗位是teacher且薪资不是10000或9000或30000的员工姓名、年龄、薪资
(7)查看岗位是teacher且名字是jin开头的员工姓名、年薪
5、分组查询:GROUP BY
(1)GROUP BY
单独使用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) as emp_members FROM employee GROUP BY post;
GROUP BY与聚合函数一起使用
select post,count(id) as count from employee group by post; #按照岗位分组,并查看每个组有多少人
如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义
多条记录之间的某个字段值相同,该字段通常用来作为分组的依据
(2)聚合函数
#强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组
示例:
SELECT COUNT(*) FROM employee;
SELECT COUNT(*) FROM employee WHERE depart_id=1;
SELECT MAX(salary) FROM employee;
SELECT MIN(salary) FROM employee;
SELECT AVG(salary) FROM employee;
SELECT SUM(salary) FROM employee;
SELECT SUM(salary) FROM employee WHERE depart_id=3;
练习:
(1)查询岗位名以及岗位包含的所有员工名字
(2)查询岗位名以及各岗位内包含的员工个数
(3)查询公司内男员工和女员工的个数
(4)查询岗位名以及各岗位的平均薪资
(5)查询岗位名以及各岗位的最高薪资
(6)查询岗位名以及各岗位的最低薪资
(7)查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
6、HAVING过滤
HAVING与WHERE不一样的地方在于!!!!!!
#!!!执行优先级从高到低:where > group by > having
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
练习:
1. 查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数
2. 查询各岗位平均薪资大于10000的岗位名、平均工资
3. 查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资
7、查询排序:ORDER BY
按单列排序
SELECT * FROM employee ORDER BY salary;
SELECT * FROM employee ORDER BY salary ASC;
SELECT * FROM employee ORDER BY salary DESC;
按多列排序:先按照age排序,如果年纪相同,则按照薪资排序
SELECT * from employee ORDER BY age,salary DESC;
练习:
1. 查询所有员工信息,先按照age升序排序,如果age相同则按照hire_date降序排序
2. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资升序排列
3. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资降序排列
8、限制查询的记录数:LIMIT
练习:分页显示,每页5条
9、使用正则表达式查询
小结:对字符串匹配的方式
WHERE name = 'li';
WHERE name LIKE 'yua%';
WHERE name REGEXP 'on$';
练习:
查看所有员工中名字是jin开头,n或者g结果的员工信息
select * from employee where name regexp '^jin.*[gn]$';
六、mysql多表查询
1、建表
2、多表连接查询
(1)交叉连接:不适用任何匹配条件。生成笛卡尔积
(2)内连接:只连接匹配的行
#找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果
#department没有204这个部门,因而employee表中关于204这条员工信息没有匹配出来
(3)外链接之左连接:优先显示左表全部记录
#以左表为准,即找出所有员工信息,当然包括没有部门的员工
#本质就是:在内连接的基础上增加左边有右边没有的结果
(4)外链接之右连接:优先显示右表全部记录
#以右表为准,即找出所有部门信息,包括没有员工的部门
#本质就是:在内连接的基础上增加右边有左边没有的结果
(5)全外连接:显示左右两个表全部记录
全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
#注意:mysql不支持全外连接 full JOIN
#强调:mysql可以使用此种方式间接实现全外连接
3、符合条件连接查询
4、子查询
#1:子查询是将一个查询语句嵌套在另一个查询语句中。
#2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
#3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
#4:还可以包含比较运算符:= 、 !=、> 、<等
(1)带IN关键字的子查询
(2)带比较运算符的子查询
#比较运算符:=、!=、>、>=、<、<=、<>
(3)带EXISTS关键字的子查询
EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。
而是返回一个真假值。True或False
当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
一、插入数据INSERT
语法一:
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 …;
二、更新数据UPDATE
语法:
UPDATE 表名 SET
字段1=值1,
字段2=值2,
WHERE CONDITION;
示例:
UPDATE mysql.user SET password=password('123') where user='root' and host='localhost';
三、删除数据DELETE
语法:
DELETE FROM 表名
WHERE CONITION;
示例:
DELETE FROM mysql.user
WHERE password='';
四、权限管理
#创建用户
create user 'egon'@'1.1.1.1' identified by '123';
create user 'egon'@'192.168.1.%' identified by '123';
create user 'egon'@'%' identified by '123';
#授权:对文件夹,对文件,对文件某一字段的权限
查看帮助:help grant
常用权限有:select,update,alter,delete
all可以代表除了grant之外的所有权限
#针对所有库的授权:*.*grant select on *.* to 'li'@'localhost' identified by '123'; #只在user表中可以查到li用户的select权限被设置为Y#针对某一数据库:db1.*grant select on db1.* to 'wang'@'%' identified by '123'; #只在db表中可以查到wang用户的select权限被设置为Y#针对某一个表:db1.t1grant select on db1.t1 to 'tom'@'%' identified by '123'; #只在tables_priv表中可以查到tom用户的select权限#针对某一个字段:mysql> select * from t3;+------+-------+------+| id | name | age |+------+-------+------+| 1 | egon1 | 18 || 2 | egon2 | 19 || 3 | egon3 | 29 |+------+-------+------+grant select (id,name),update (age) on db1.t3 to 'egon4'@'localhost' identified by '123';#可以在tables_priv和columns_priv中看到相应的权限mysql> select * from tables_priv where user='egon4'\Gmysql> select * from columns_priv where user='egon4'\G#删除权限revoke select on db1.* to 'alex'@'%';
五、mysql单表查询
1、单表查询的语法
SELECT 字段1,字段2... FROM 表名
WHERE 条件
GROUP BY field
HAVING 筛选
ORDER BY field
LIMIT 限制条数
2、关键字的执行优先级
from #找到表
where #拿着where指定的约束条件,去文件/表中取出一条条记录
group by #将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
having #将分组的结果进行having过滤
select #执行select
distinct #去重
order by #将结果按条件排序
limit #限制结果的显示条数
3、简单查询
#创建表create database company;use company;create table employee(id int not null unique auto_increment,name varchar(20) not null,sex enum('male','female') not null default 'male',age int(3) unsigned not null default 28,hire_date date not null,post varchar(50),post_comment varchar(100),salary double(15,2),office int,depart_id int);#插入记录三个部门:教学,销售,运营insert into employee(name,sex,age,hire_date,post,salary,office,depart_id) values('wang','male',18,'20170301','teacher',7300.33,401,1),('li','male',78,'20150302','teacher',1000000.31,401,1),('jim','male',81,'20130305','teacher',8300,401,1),('zhao','male',73,'20140701','teacher',3500,401,1),('liwenzhou','male',28,'20121101','teacher',2100,401,1),('jingliyang','female',18,'20110211','teacher',9000,401,1),('jinxin','male',18,'19000301','teacher',30000,401,1),('成龙','male',48,'20101111','teacher',10000,401,1),('歪歪','female',48,'20150311','sale',3000.13,402,2),('丫丫','female',38,'20101101','sale',2000.35,402,2),('丁丁','female',18,'20110312','sale',1000.37,402,2),('星星','female',18,'20160513','sale',3000.29,402,2),('格格','female',28,'20170127','sale',4000.33,402,2),('张野','male',28,'20160311','operation',10000.13,403,3),('程咬金','male',18,'19970312','operation',20000,403,3),('程咬银','female',18,'20130311','operation',19000,403,3),('程咬铜','male',18,'20150411','operation',18000,403,3),('程咬铁','female',18,'20140512','operation',17000,403,3);+----+------------+--------+-----+------------+-----------+--------------+------------+--------+-----------+| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |+----+------------+--------+-----+------------+-----------+--------------+------------+--------+-----------+| 1 | wang | male | 18 | 2017-03-01 | teacher | NULL | 7300.33 | 401 | 1 || 2 | li | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 || 3 | jim | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 || 4 | zhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 || 5 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 || 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 || 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 || 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 || 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 || 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 || 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 || 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 || 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 || 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 || 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 || 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 || 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 || 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 |+----+------------+--------+-----+------------+-----------+--------------+------------+--------+-----------+# 简单查询SELECT id, name, sex, age, hire_date, post, post_comment, salary, office, depart_id FROM employee;SELECT * FROM employee;SELECT name, salary FROM employee;# 避免重复DISTINCTSELECT DISTINCT post FROM employee;+-----------+| post |+-----------+| teacher || sale || operation |+-----------+# 通过四则运算查询SELECT name, salary * 12 FROM employee;SELECT name, salary * 12 AS Annual_salary FROM employee;SELECT name, salary * 12 Annual_salary FROM employee;+------------+---------------+| name | Annual_salary |+------------+---------------+| wang | 87603.96 || li | 12000003.72 || jim | 99600.00 || zhao | 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 |+------------+---------------+# 定义显示格式CONCAT() 函数用于连接字符串SELECT CONCAT('姓名: ', name, ' 年薪: ', salary * 12) AS Annual_salary FROM employee;CONCAT_WS() 第一个参数为分隔符SELECT CONCAT_WS(':', name, salary * 12) AS Annual_salary FROM employee;+----------------------+| Annual_salary |+----------------------+| wang:87603.96 || li:12000003.72 || jim:99600.00 || zhao: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 |+----------------------+练习:
(1)查出所有员工的名字,薪资,格式为
<名字:egon> <薪资:3000>
(2)查出所有的岗位(去掉重复)
(3)查出所有员工名字,以及他们的年薪,年薪的字段名为annual_year
select concat('<名字:',name,'> ','<薪资:',salary,'>') from employee;select distinct depart_id from employee;select name,salary*12 annual_salary from employee;
4、WHERE约束
# 1:单条件查询SELECT name FROM employee WHERE post = 'sale';# 2:多条件查询SELECT name, salary FROM employee WHERE post = 'teacher' AND salary > 10000;# 3:关键字BETWEEN ANDSELECT name, salary FROM employee WHERE salary BETWEEN 10000 AND 20000;SELECT name, salary FROM employee WHERE salary NOT BETWEEN 10000 AND 20000;# 4:关键字IS NULL(判断某个字段是否为NULL不能用等号,需要用IS)SELECT name, post_comment FROM employee WHERE post_comment IS NULL;SELECT name, post_comment FROM employee WHERE post_comment IS NOT NULL;SELECT name, post_comment FROM employee WHERE post_comment = ''; #注意''是空字符串,不是nullps: 执行 update employee set post_comment = '' where id = 2; 再用上条查看,就会有结果了# 5:关键字IN集合查询SELECT name, salary FROM employee WHERE salary = 3000 OR salary = 3500 OR salary = 4000 OR salary = 9000;SELECT name, salary FROM employee WHERE salary IN(3000, 3500, 4000, 9000);SELECT name, salary FROM employee WHERE salary NOT IN(3000, 3500, 4000, 9000);# 6:关键字LIKE模糊查询通配符' % 'SELECT * FROM employee WHERE name LIKE 'eg%';通配符'_'SELECT * FROM employee WHERE name LIKE 'al__';
练习:
(1)查看岗位是teacher的员工姓名、年龄
(2)查看岗位是teacher且年龄大于30岁的员工姓名、年龄
(3)查看岗位是teacher且薪资在9000-1000范围内的员工姓名、年龄、薪资
(4)查看岗位描述不为NULL的员工信息
(5)查看岗位是teacher且薪资是10000或9000或30000的员工姓名、年龄、薪资
(6)查看岗位是teacher且薪资不是10000或9000或30000的员工姓名、年龄、薪资
(7)查看岗位是teacher且名字是jin开头的员工姓名、年薪
select name,age from employee where post = 'teacher';select name,age from employee where post='teacher' and age > 30;select name,age,salary from employee where post='teacher' and salary between 9000 and 10000;select * from employee where post_comment is not null;select name,age,salary from employee where post='teacher' and salary in (10000,9000,30000);select name,age,salary from employee where post='teacher' and salary not in (10000,9000,30000);select name,salary*12 from employee where post='teacher' and name like 'jin%';mysql> select name,salary*12 as year_salary from employee where post='teacher' and name like 'jin%';
5、分组查询:GROUP BY
(1)GROUP BY
单独使用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) as emp_members FROM employee GROUP BY post;
GROUP BY与聚合函数一起使用
select post,count(id) as count from employee group by post; #按照岗位分组,并查看每个组有多少人
如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义
多条记录之间的某个字段值相同,该字段通常用来作为分组的依据
(2)聚合函数
#强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组
示例:
SELECT COUNT(*) FROM employee;
SELECT COUNT(*) FROM employee WHERE depart_id=1;
SELECT MAX(salary) FROM employee;
SELECT MIN(salary) FROM employee;
SELECT AVG(salary) FROM employee;
SELECT SUM(salary) FROM employee;
SELECT SUM(salary) FROM employee WHERE depart_id=3;
练习:
(1)查询岗位名以及岗位包含的所有员工名字
(2)查询岗位名以及各岗位内包含的员工个数
(3)查询公司内男员工和女员工的个数
(4)查询岗位名以及各岗位的平均薪资
(5)查询岗位名以及各岗位的最高薪资
(6)查询岗位名以及各岗位的最低薪资
(7)查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
mysql> select post,group_concat(name) from employee group by post;mysql> select post,count(id) from employee group by post;mysql> select sex,count(id) from employee group by sex;mysql> select post,avg(salary) from employee group by post;mysql> select post,max(salary) from employee group by post;mysql> select post,min(salary) from employee group by post;mysql> select sex,avg(salary) from employee group by sex;
6、HAVING过滤
HAVING与WHERE不一样的地方在于!!!!!!
#!!!执行优先级从高到低:where > group by > having
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
练习:
1. 查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数
2. 查询各岗位平均薪资大于10000的岗位名、平均工资
3. 查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资
mysql> select post,group_concat(name),count(id) from employee group by post having count(id) < 2;mysql> select post,avg(salary) from employee group by post having avg(salary) > 10000;mysql> select post,avg(salary) from employee group by post having avg(salary) > 10000 and avg(salary) <20000;
7、查询排序:ORDER BY
按单列排序
SELECT * FROM employee ORDER BY salary;
SELECT * FROM employee ORDER BY salary ASC;
SELECT * FROM employee ORDER BY salary DESC;
按多列排序:先按照age排序,如果年纪相同,则按照薪资排序
SELECT * from employee ORDER BY age,salary DESC;
练习:
1. 查询所有员工信息,先按照age升序排序,如果age相同则按照hire_date降序排序
2. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资升序排列
3. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资降序排列
mysql> select * from employee ORDER BY age asc,hire_date desc;mysql> select post,avg(salary) from employee group by post having avg(salary) > 10000 order by avg(salary) asc;mysql> select post,avg(salary) from employee group by post having avg(salary) > 10000 order by avg(salary) desc;
8、限制查询的记录数:LIMIT
SELECT * FROM employee ORDER BY salary DESC LIMIT 3; # 默认初始位置为0SELECT * FROM employee ORDER BY salary DESC LIMIT 0, 5; # 从第0开始,即先查询出第一条,然后包含这一条在内往后查5条SELECT * FROM employee ORDER BY salary DESC LIMIT 5, 5; # 从第5开始,即先查询出第6条,然后包含这一条在内往后查5条
练习:分页显示,每页5条
mysql> select * from employee limit 0,5; #显示第1到5条记录mysql> select * from employee limit 5,5; #显示第5到10条记录mysql> select * from employee limit 10,5; #显示第10到15条记录
9、使用正则表达式查询
SELECT * FROM employee WHERE name REGEXP '^ale';SELECT * FROM employee WHERE name REGEXP 'on$';SELECT * FROM employee WHERE name REGEXP 'm{2}';
小结:对字符串匹配的方式
WHERE name = 'li';
WHERE name LIKE 'yua%';
WHERE name REGEXP 'on$';
练习:
查看所有员工中名字是jin开头,n或者g结果的员工信息
select * from employee where name regexp '^jin.*[gn]$';
六、mysql多表查询
1、建表
create table department(id int,name varchar(20));create table employee(id int primary key auto_increment,name varchar(20),sex enum('male','female') not null default 'male',age int,dep_id int);#插入数据insert into department values(200,'技术'),(201,'人力资源'),(202,'销售'),(203,'运营');insert into employee(name,sex,age,dep_id) values('egon','male',18,200),('alex','female',48,201),('wupeiqi','male',38,201),('yuanhao','female',28,202),('liwenzhou','male',18,200),('jingliyang','female',18,204);
2、多表连接查询
(1)交叉连接:不适用任何匹配条件。生成笛卡尔积
mysql> select * from department;+------+--------------+| id | name |+------+--------------+| 200 | 技术 || 201 | 人力资源 || 202 | 销售 || 203 | 运营 |+------+--------------+mysql> select * from employee;+----+------------+--------+------+--------+| id | name | sex | age | dep_id |+----+------------+--------+------+--------+| 1 | egon | male | 18 | 200 || 2 | alex | female | 48 | 201 || 3 | wupeiqi | male | 38 | 201 || 4 | yuanhao | female | 28 | 202 || 5 | liwenzhou | male | 18 | 200 || 6 | jingliyang | female | 18 | 204 |+----+------------+--------+------+--------+mysql> select * from employee,department;
(2)内连接:只连接匹配的行
#找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果
#department没有204这个部门,因而employee表中关于204这条员工信息没有匹配出来
mysql> select employee.id,employee.name,employee.age,employee.sex,department.name from employee inner join department on employee.dep_id=department.id;+----+-----------+------+--------+--------------+| id | name | age | sex | name |+----+-----------+------+--------+--------------+| 1 | egon | 18 | male | 技术 || 2 | alex | 48 | female | 人力资源 || 3 | wupeiqi | 38 | male | 人力资源 || 4 | yuanhao | 28 | female | 销售 || 5 | liwenzhou | 18 | male | 技术 |+----+-----------+------+--------+--------------+mysql> select employee.id,employee.name,employee.age,employee.sex,department.name from employee,department where employee.dep_id=department.id;
(3)外链接之左连接:优先显示左表全部记录
#以左表为准,即找出所有员工信息,当然包括没有部门的员工
#本质就是:在内连接的基础上增加左边有右边没有的结果
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 |+----+------------+--------------+
(4)外链接之右连接:优先显示右表全部记录
#以右表为准,即找出所有部门信息,包括没有员工的部门
#本质就是:在内连接的基础上增加右边有左边没有的结果
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 | 运营 |+------+-----------+--------------+
(5)全外连接:显示左右两个表全部记录
全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
#注意:mysql不支持全外连接 full JOIN
#强调:mysql可以使用此种方式间接实现全外连接
select * from employee left join department on employee.dep_id = department.idunionselect * from employee right join department on employee.dep_id = department.id;+------+------------+--------+------+--------+------+--------------+| id | name | sex | age | dep_id | id | name |+------+------------+--------+------+--------+------+--------------+| 1 | egon | male | 18 | 200 | 200 | 技术 || 5 | liwenzhou | male | 18 | 200 | 200 | 技术 || 2 | alex | female | 48 | 201 | 201 | 人力资源 || 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 || 4 | yuanhao | female | 28 | 202 | 202 | 销售 || 6 | jingliyang | female | 18 | 204 | NULL | NULL || NULL | NULL | NULL | NULL | NULL | 203 | 运营 |+------+------------+--------+------+--------+------+--------------+#注意 union与union all的区别:union会去掉相同的纪录
3、符合条件连接查询
#示例1:以内连接的方式查询employee和department表,并且employee表中的age字段值必须大于25,即找出年龄大于25岁的员工以及员工所在的部门select employee.name,department.name from employee inner join department on employee.dep_id = department.id where age > 25;+---------+--------------+| name | name |+---------+--------------+| alex | 人力资源 || wupeiqi | 人力资源 || yuanhao | 销售 |+---------+--------------+#示例2:以内连接的方式查询employee和department表,并且以age字段的升序方式显示select employee.id,employee.name,employee.age,department.name from employee,department where employee.dep_id = department.id and age > 25 order by age asc;+----+---------+------+--------------+| id | name | age | name |+----+---------+------+--------------+| 4 | yuanhao | 28 | 销售 || 3 | wupeiqi | 38 | 人力资源 || 2 | alex | 48 | 人力资源 |+----+---------+------+--------------+
4、子查询
#1:子查询是将一个查询语句嵌套在另一个查询语句中。
#2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
#3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
#4:还可以包含比较运算符:= 、 !=、> 、<等
(1)带IN关键字的子查询
#查询平均年龄在25岁以上的部门名select id,name from department where id in (select dep_id from employee group by dep_id having avg(age) > 25);#查看技术部员工姓名select name from employee where dep_id in (select id from department where name='技术');#查看不足1人的部门名(子查询得到的是有人的部门id)select name from department where id not in (select distinct dep_id from employee);
(2)带比较运算符的子查询
#比较运算符:=、!=、>、>=、<、<=、<>
#查询大于所有人平均年龄的员工名与年龄mysql> select name,age from emp where age > (select avg(age) from emp);#查询大于部门内平均年龄的员工名、年龄select t1.name,t1.age from emp t1inner join(select dep_id,avg(age) avg_age from emp group by dep_id) t2 on t1.dep_id = t2.dep_id where t1.age > t2.avg_age;
(3)带EXISTS关键字的子查询
EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。
而是返回一个真假值。True或False
当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询
#department表中存在dept_id=203,Turemysql> select * from employee where exists (select id from department where id=200);#department表中存在dept_id=205,Falsemysql> select * from employee where exists (select id from department where id=204);
查询
字段
员工
岗位
薪资
人力
人力资源
结果
资源
分组
年龄
技术
关键
关键字
部门
权限
条件
销售
函数
姓名
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
云服务器配置apache
c 串口软件开发
霍邱软件开发商在线咨询
我的世界服务器公会建设
qq服务器不同步好友无故删除
校园网络安全危险
适合做服务器的linux
sql2008附加数据库失败
数据库收费吗
怎么连接数据库安卓
我国网络安全的手抄报
网络数据分析网络安全考试
深圳必过网络技术公司
软件开发项目工程特点
提高办公软件开发能力
怎么能看到游戏数据库
上海网络安全设置
美国最快速服务器
什么是网络安全的中心环节
石家庄思科网络技术学院在哪
西安有什么打车软件开发
武汉传弈软件开发有限公司
mysql 不同服务器
迈嘉网络技术
服务器风扇接在哪里
词语数据库庞大
软件开发都有哪些项目
如何查看数据库表的关系图
微信数据库重名
html 缓存数据库