您的位置:首页 > 数据库 > MySQL

mysql学习4:select,update,insert,delete

2015-07-02 09:43 696 查看
查询表格:

基本语法:

select 属性列表 from 表 [where 表达式] [group by 属性列表 [having 表达式]] [order by 属性 [asc/desc],属性 [asc/desc]] [limit [起始位置,]数量];

mysql> select * from employer;

+-----+--------+-----+------+------------+

| num | name   | sex | age  | homeaddr   |

+-----+--------+-----+------+------------+

|   1 | 黄冲   | 男  |   22 | 1号街区    |

|   2 | 张三   | 男  |   25 | NULL       |

|   3 | 李四   | 女  |   23 | 4号街区    |

|   4 | 王五   | 女  |   20 | 5号街区    |

|   5 | 王二   | 男  |   19 | 5号街区    |

|   6 | 麻子   | 女  |   26 | 6号街区    |

+-----+--------+-----+------+------------+

select name from employer;查找部分数据。将他们列出来。

select group_concat(name),sex from employer group by sex;用sex进行分类,列出name。一般group by每个分组只显示一条记录,都是用函数count(name)。

where语句:

select * from employer where homeaddr like "5%";匹配符%是多个匹配多个字节;homeaddr='5%'是不行的。'_'匹配一个字节。like要比=强一些。

select * from employer where num in(1,2,3);在in里面的集合。not in取反集合。

select * from employer where age between 20 and 25 order by age desc,num asc;not between;order by age desc用age排序asc升序,num asc辅助降序,这个与where语句无关。

select * from employer where homeaddr is not NULL;

where用and,or跟c语言一样的啦。

select name,sex,age from employer where sex='女' and age between 20 and 25 order by age asc;2个and不一样的啦。

select num,age,homeaddr from employer where sex like '男' and age<25 and num<>1;

mysql> select * from employer where sex like '女' and age>20 or homeaddr is not null and age<>19 limit 1,2;and比or优先级高。

+-----+--------+-----+------+------------+

| num | name   | sex | age  | homeaddr   |

+-----+--------+-----+------+------------+

|   1 | 黄冲   | 男  |   22 | 1号街区    |

|   3 | 李四   | 女  |   23 | 4号街区    |

|   4 | 王五   | 女  |   20 | 5号街区    |

|   6 | 麻子   | 女  |   26 | 6号街区    |

+-----+--------+-----+------+------------+

select distinct homeaddr from employer;distinct取消重复。5号街区打印一次。

group by分组:

select * from employer group by sex,homeaddr;

select sex,count(sex) from employer group by sex having sex like '男' and count(sex)>2;group

select sex,group_concat(name) from employer group by sex WITH ROLLUP;WITH ROLLUP和group_concat,count使用。多显示一行求总和。

函数:GROUP_CONCAT(),count(*/字段),SUM(),AVG(),MAX(),MIN();

select sex,avg(age) from employer group by sex;

mysql> select * from suremployer;

+-----------+------+--------------+------+-----+----------------------+

| num       | d_id | name         | age  | sex | homeaddr             |

+-----------+------+--------------+------+-----+----------------------+

| 201500001 | 1000 | 张三         |   25 | 男  | students street      |

| 201500002 | 1012 | 李四         |   24 | 女  | class street         |

| 201500003 | 1010 | 李四         |   24 | 女  | grade street         |

| 201500004 | 1011 | 王五         |   21 | 女  | home street          |

| 201500005 | 1012 | 黄六         |   27 | 女  | communication street |

| 201500006 | 1013 | 麻子望而     |   19 | 男  | hospital street      |

| 201500007 |  800 | 廖坑         |   32 | 女  | company street       |

| 201500008 | 1011 | 吴杰         |   26 | 女  | chongqing street     |

| 201500009 | 1010 | 杨冲         |   30 | 男  | hurryup street       |

| 201500010 | 1013 | 温江         |   26 | 男  | breakout street      |

| 201500011 | 1000 | 张杰         |   42 | 男  | mountion street      |

| 201500012 |  800 | 吴失         |   28 | 女  | department street    |

| 201500013 | 1013 | 杨慧         |   30 | 女  | localhost street     |

| 201500014 | 1012 | 红丝         |   34 | 男  | computer street      |

+-----------+------+--------------+------+-----+----------------------+

mysql> select * from surdepartment;

+------+-----------+----------+------+

| id   | name      | function | addr |

+------+-----------+----------+------+

|  800 | 采购部    | NULL     | NULL |

| 1000 | 生产部    | NULL     | NULL |

| 1001 | 档案部    | NULL     | NULL |

| 1010 | 销售部    | NULL     | NULL |

| 1011 | 管理部    | NULL     | NULL |

| 1012 | 财务部    | NULL     | NULL |

| 1013 | 物料部    | NULL     | NULL |

+------+-----------+----------+------+

多表组合查询:

内联查询:where

select num,suremployer.name as employer_name, age, sex, surdepartment.name as department_name from suremployer, surdepartment where suremployer.d_id=surdepartment.id;

如果没有where suremployer.d_id=surdepartment.id将打印两表的合并组合信息:5(一表有5行)*4(2表有4行)=20条信息。

外联查询:left/right join on。

select num,suremployer.name as employer_name, age, sex, surdepartment.name as department_name from suremployer, surdepartment left join on suremployer.d_id=surdepartment.id;以左表为主查询,用右表添加到左表。

复合条件查询:where或者on 有and或者OR。

select num,suremployer.name as employer_name, age, sex, surdepartment.name as department_name from suremployer, surdepartment left join on suremployer.d_id=surdepartment.id and suremployer.age>25;

where用in,not in,any,all,exists,not exist.

select * from suremployer where d_id in(select id from surdepartment where id=1012);

mysql> select * from suremployer where d_id in(select id from surdepartment where id=1012);

+-----------+------+--------+------+-----+----------+

| num       | d_id | name   | age  | sex | homeaddr |

+-----------+------+--------+------+-----+----------+

| 201500002 | 1012 | 李四   |   24 | 女  | NULL     |

| 201500005 | 1012 | 黄六   |   27 | 女  | NULL     |

| 201500014 | 1012 | 红丝   |   34 | 男  | NULL     |

+-----------+------+--------+------+-----+----------+

mysql> select * from surdepartment where id not in(select d_id from suremployer);

+------+-----------+----------+------+

| id   | name      | function | addr |

+------+-----------+----------+------+

| 1001 | 档案部    | NULL     | NULL |

+------+-----------+----------+------+

select * from suremployer where d_id>=(select id from surdepartment where id=1013);>=后面需要一个值,而不是一个组合。还包括:>,<,<=,!=,<>,=等。

mysql> select * from suremployer where d_id>1009 and exists(select name from surdepartment where id=1000);exists用来判断后面的语句是否成功,后面的语句有数据则为1,无数据则为0。如果用 not exists则相反。

select * from suremployer where d_id>any(select id from surdepartment where id<1012);any任意一个,只要d_id>any最小值即满足条件。对应的all需要满足d_id>all最大值。

合并查询结果:

select d_id from suremployer union select id from surdepartment;将suremployer表与surdepartment的ID无重复组合。union all则用于罗列suremployer的id然后在罗列surdepartment的id。

为表格取别名:

select * from suremployer a where a.num>201500010;a为suremployer的别名。就可以使用a.num了。

为字段取别名:

select num as employer_ID,name as employer_name from suremployer where d_id=1013;

组合:

select a.num as employer_ID,a.name as employer_name from suremployer a where a.d_id=1013;

使用正则表达式:regexp

//////////////////////////////////////////////////////////////

    ^l:以l或者字符串开头。

    $l:以l或者字符串结尾。

    '.':匹配一个字节

    [abc]:集合,匹配其中一个即可。

    [^abc]:集合,不在该集合即可。

    string1|string2|string3:匹配一个字符串即可。

    a*c:*表示c之前出现过0个或者一个'a'。出现c即满足条件。

    a+c:+表示c前一个字符是1个'a'。

    string{n}:string出现n次。

    string{m,n}:string出现m~n次。至少m次,最多n次。

////////////////////////////////////////////////////////////

select * from suremployer where name regexp '杨';包含'杨'即可满足条件。相当于匹配一个字符串。

select * from suremployer where name regexp '$杨';以'杨'结尾可满足条件。插入一条字符串,一般情况下都是以‘\0’结束。

select * from suremployer where name regexp '^杨';以'杨'开头可满足条件。

select * from suremployer where name regexp '[子]';没有考虑中文的情况,'子'有两个字节,匹配其中一个即可。

select * from suremployer where name regexp '[1-9a-d]';

select * from suremployer where name regexp '[^1-9a-d]';

mysql> select * from suremployer where homeaddr regexp 'la|ca|an';包含3个字符串其中一个即可

mysql> select * from suremployer where homeaddr regexp 'm{2}';m连续出现2次。

插入:

insert into employer(num,name,sex) values(2,'张三','男'),(3,'李四','女');(num,name,sex)指定插入参数,没有这些默认所有字段都需要提供;插入可以多条。

mysql> insert into employer values(1,'李四','女','4号街区');

insert into usetable1(id,name,sex) select mid,mname,msex from usetable2 where departmentID='采购部';将表格usetable2的数据插入到usetable1中。

insert into temptable select num,name,age,sex from suremployer;

mysql> insert into temptable(id,name,age,sex) select num,name,age,sex from suremployer where age>23 and age<31;

ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'意思是主键需要唯一,1在主键中已经有了。

自增字段的插入:insert into surdepartment(id,name) values(null,'物料部');id为主键和自增。但id也可以指定。

修改:

update employer set name='黄冲',sex='男',homeaddr='1号街区' where num=1;

删除:

mysql> delete from suremployer where name='李四' and homeaddr='class street';条件删除

mysql> delete from suremployer;全部删除
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: