重修课程day41(mysql五之表的查看操作)
Posted 方杰0410
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重修课程day41(mysql五之表的查看操作)相关的知识,希望对你有一定的参考价值。
一 补充一些杂碎的知识
1 插入数据:
create table 新表名(字段 数据类型[约束条间]。。。) select 字段。。。 from 旧表名
create table 新表名(字段 数据类型[约束条件]。。。) select 字段 as 别名 from 旧表名 [where 条件];
as 起一个别名,起别名时,默认有as 所以可以不用加as 就可以起别名。
mysql> create table t1(id int primary key auto_increment, -> name char(10) not null, -> age int not null); Query OK, 0 rows affected (0.38 sec) mysql> insert into t1(name,age)values(\'fang\',18),(\'haiyan\',17),(\'dong\',21); Query OK, 3 rows affected (0.06 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> desc t1; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(10) | NO | | NULL | | | age | int(11) | NO | | NULL | | +-------+----------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> select * from t1; +----+--------+-----+ | id | name | age | +----+--------+-----+ | 1 | fang | 18 | | 2 | haiyan | 17 | | 3 | dong | 21 | +----+--------+-----+ 3 rows in set (0.00 sec) mysql> create table t2(name char(10) not null, -> age int not null) select name,age from t1; Query OK, 3 rows affected (0.32 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> desc t2; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | name | char(10) | NO | | NULL | | | age | int(11) | NO | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> select * from t2; +--------+-----+ | name | age | +--------+-----+ | fang | 18 | | haiyan | 17 | | dong | 21 | +--------+-----+ 3 rows in set (0.00 sec) mysql> create table t3(x char(10) not null, -> a int not null) select name as x,age a from t1; Query OK, 3 rows affected (0.31 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> desc t3; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | x | char(10) | NO | | NULL | | | a | int(11) | NO | | NULL | | +-------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> select * from t3; +--------+----+ | x | a | +--------+----+ | fang | 18 | | haiyan | 17 | | dong | 21 | +--------+----+ 3 rows in set (0.00 sec)
2 修改数据:
update 表名 set 字段=记录 where 条件;
mysql> create table t1(id int primary key auto_increment, -> name char(10) not null, -> age int not null); Query OK, 0 rows affected (0.38 sec) mysql> insert into t1(name,age)values(\'fang\',18),(\'haiyan\',17),(\'dong\',21); Query OK, 3 rows affected (0.06 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> desc t1; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(10) | NO | | NULL | | | age | int(11) | NO | | NULL | | +-------+----------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> select * from t1; +----+--------+-----+ | id | name | age | +----+--------+-----+ | 1 | fang | 18 | | 2 | haiyan | 17 | | 3 | dong | 21 | +----+--------+-----+ 3 rows in set (0.00 sec) mysql> update t1 set name=\'jie\' where id=3 and age=21; Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t1; +----+--------+-----+ | id | name | age | +----+--------+-----+ | 1 | fang | 18 | | 2 | haiyan | 17 | | 3 | jie | 21 | +----+--------+-----+ 3 rows in set (0.00 sec)
3 杂碎的内容:
concat:字符串的拼接,可以拼成任意的格式
concat_ws:第一个参数指定的是分割符,后面加上自己要看的字段
\\G:将乱了的记录重新按行显示。
二 常用的select查看
select 的基本格式:
select distinot:去重 字段名。。。 from 表名
where 约束条件 :取出来的记录默认为是一个组,在这里就可以使用聚合函数,约束条件就是默认某些字段的约束。
group by 字段名 :后面加上某个字段,就会按照那个字段分组,分组过后可以直接查看分组的字段,要想查看其他的字段,必须要借助聚合函数,分组是为了一类一类的处理数据。而分组的字段是依据字段的约束条件不唯一。
having 过滤语句 :只能跟在分组的后面,处理一些分组过后的约束条件。
order by 字段 排序 :排序。后面加上需要按照排序的字段,后面可以同时加上多个排序条件,如果前面的排序有重复的,才会执行后面的,如果没有重复的,后面的就不会执行。他是在取出了相应字段的记录后才开始执行的。
limit 限制条件 :规定查看的范围,在最后才开始运行。
/* having 和 where两者都可以对查询结果进行进一步的过滤,差别有: <1>where语句只能用在分组之前的筛选,having可以用在分组之后的筛 选; <2>使用where语句的地方都可以用having进行替换 <3>having中 可以用聚合函数,where中就不行。 */
准备表:
mysql> use day44; Database changed mysql> 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 -> ); Query OK, 0 rows affected (0.28 sec) mysql> mysql> mysql> #查看表结构 mysql> desc employee; +--------------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-----------------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | NO | | NULL | | | sex | enum(\'male\',\'female\') | NO | | male | | | age | int(3) unsigned | NO | | 28 | | | hire_date | date | NO | | NULL | | | post | varchar(50) | YES | | NULL | | | post_comment | varchar(100) | YES | | NULL | | | salary | double(15,2) | YES | | NULL | | | office | int(11) | YES | | NULL | | | depart_id | int(11) | YES | | NULL | | +--------------+-----------------------+------+-----+---------+----------------+ 10 rows in set (0.01 sec) mysql> mysql> #插入记录 mysql> #三个部门:教学,销售,运营 mysql> insert into employee(name,sex,age,hire_date,post,salary,office,depart_id) values -> (\'egon\',\'male\',18,\'20170301\',\'老男孩驻沙河办事处外交大使\',7300.33,401,1), #以下是教学部 -> (\'alex\',\'male\',78,\'20150302\',\'teacher\',1000000.31,401,1), -> (\'wupeiqi\',\'male\',81,\'20130305\',\'teacher\',8300,401,1), -> (\'yuanhao\',\'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) -> ; Query OK, 18 rows affected (0.09 sec) Records: 18 Duplicates: 0 Warnings: 0
集合函数:min:最小值 max:最大值 avg:计算平均值 sum:计算总和 count:计算个数
where 条件约束:后面可以加上比较符号(> < = != <> <= >=) 逻辑运算符(and or not)
in:什么或什么或什么 between:在什么和什么之间 like:像什么 后面出入两个符号 % :任意多个字符 _ :表示任意一个字符 is:什么是什么
mysql> select * from employee where age>50; +----+---------+------+-----+------------+---------+--------------+------------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+---------+------+-----+------------+---------+--------------+------------+--------+-----------+ | 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 | | 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 | | 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 | +----+---------+------+-----+------------+---------+--------------+------------+--------+-----------+ 3 rows in set (0.00 sec) mysql> select * from employee where sex=\'male\' and salary>30000; +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+ | 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 | +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+ 1 row in set (0.00 sec) mysql> select * from employee where post=\'teacher\' or salary>30000; +----+------------+--------+-----+------------+---------+--------------+------------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+------------+--------+-----+------------+---------+--------------+------------+--------+-----------+ | 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 | | 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 | | 4 | yuanhao | 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 | +----+------------+--------+-----+------------+---------+--------------+------------+--------+-----------+ 7 rows in set (0.00 sec) mysql> select * from employee where age between 20 and 30; +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | 5 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 | | 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 | | 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 | +----+-----------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ 3 rows in set (0.01 sec) mysql> select * from employee where id in(3,6,16) or name like \'程%\'; +----+------------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+------------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 | | 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 | | 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 | +----+------------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ 6 rows in set (0.44 sec)
group by 分组:后面加上一个字段名
mysql> select post,count(id),group_concat(name) from employee group by post; +----------------------------+-----------+-------------------------------------------------------+ | post | count(id) | group_concat(name) | +----------------------------+-----------+-------------------------------------------------------+ | operation | 5 | 张野,程咬金,程咬银,程咬铜,程咬铁 | | sale | 5 | 歪歪,丫丫,丁丁,星星,格格 | | teacher | 7 | alex,wupeiqi,yuanhao,liwenzhou,jingliyang,jinxin,成龙 | | 老男孩驻沙河办事处外交大使 | 1 | egon | +----------------------------+-----------+-------------------------------------------------------+ 4 rows in set (0.00 sec) mysql> select post,min(salary) from employee group by post; +----------------------------+-------------+ | post | min(salary) | +----------------------------+-------------+ | operation | 10000.13 | | sale | 1000.37 | | teacher | 2100.00 | | 老男孩驻沙河办事处外交大使 | 7300.33 | +----------------------------+-------------+ 4 rows in set (0.00 sec) mysql> select post,max(salary) from employee group by post; +----------------------------+-------------+ | post | max(salary) | +----------------------------+-------------+ | operation | 20000.00 | | sale | 4000.33 | | teacher | 1000000.31 | | 老男孩驻沙河办事处外交大使 | 7300.33 | +----------------------------+-------------+ 4 rows in set (0.00 sec) mysql> select post,sum(salary) from employee group by post; +----------------------------+-------------+ | post | sum(salary) | +----------------------------+-------------+ | operation | 84000.13 | | sale | 13001.47 | | teacher | 1062900.31 | | 老男孩驻沙河办事处外交大使 | 7300.33 | +----------------------------+-------------+ 4 rows in set (0.00 sec) mysql> select post,avg(salary) from employee group by post; +----------------------------+---------------+ | post | avg(salary) | +----------------------------+---------------+ | operation | 16800.026000 | | sale | 2600.294000 | | teacher | 151842.901429 | | 老男孩驻沙河办事处外交大使 | 7300.330000 | +----------------------------+---------------+ 4 rows in set (0.00 sec)
having 过滤条件:后面加的内容和where一样的,不过需要借助于聚合函数过滤记录
mysql> select post from employee group by post having count(id)>5; +---------+ | post | +---------+ | teacher | +---------+ 1 row in set (0.00 sec) mysql> select post from employee group by post having count(id)>5 or avg(salary) >10000; +-----------+ | post | +-----------+ | operation | | teacher | +-----------+ 2 rows in set (0.00 sec)
order by :后面跟上:asc:升序,从小到大排序 ; desc:降序,从大到小排序。order by:默认是从小到达排序的。
mysql> select * from employee order by age asc,id desc; +----+------------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+------------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+ | 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 | | 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 | | 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 | | 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 | | 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 | | 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 | | 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 | | 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 | | 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 | | 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 | | 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 | | 5 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 | | 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 | | 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 | | 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 | | 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 | | 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 | | 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300.00 | 401 | 1 | +----+------------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+ 18 rows in set (0.00 sec)
limit 限制条件:后面输入整数类型,只传一个值是查看记录的条数,默认从第1条记录开始查看,如果出入两个数,第一个数是初始值,就是从那一条的下一条开始查看,第二个数就是查看记录的条数。
mysql> select * from employee where id limit 6,10; +----+--------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+--------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ | 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 | +----+--------+--------+-----+------------+-----------+--------------+----------+--------+-----------+ 10 rows in set (0.00 sec)
他们的执行顺序是:from——》where—》group by—》having—》distinct—》order—》limit。如果上一个没有顺序还是不会改变
distinct:去掉重复
only_full_group_by:使用方法 set @@lobal sql_mode=\'only_full_group_by\' 修改全局的一条信息
where后面还可以跟上regexp:正则表达式条件约束,regexp后面跟的内容和正则表达式里面的内容差不多
mysql> select * from employee where name regexp \'a.\'; +----+------------+--------+-----+------------+---------+--------------+------------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+------------+--------+-----+------------+---------+--------------+------------+--------+-----------+ | 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 | | 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 | | 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 | +----+------------+--------+-----+------------+---------+--------------+------------+--------+-----------+ 3 rows in set (0.05 sec) mysql> select * from employee where name regexp \'^a.\'; +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+ | 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 | +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+ 1 row in set (0.00 sec) mysql> select * from employee where name regexp \'^j.\'; +----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+ | 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 | +----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+ 2 rows in set (0.00 sec) mysql> select * from employee where name regexp \'^j.*n$\'; +----+--------+------+-----+------------+---------+--------------+----------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+--------+------+-----+------------+---------+--------------+----------+--------+-----------+ | 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 | +----+--------+------+-----+------------+---------+--------------+----------+--------+-----------+ 1 row in set (0.00 sec) mysql> select * from employee where name REGEXP \'^jin.*[n|g]$\'; +----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+ | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id | +----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+ | 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 | +----+------------+--------+-----+------------+---------+--------------+----------+--------+-----------+ 2 rows in set (0.00 sec)
以上是关于重修课程day41(mysql五之表的查看操作)的主要内容,如果未能解决你的问题,请参考以下文章