首页 > 代码库 > 【数据库】MySQL数据库(四)

【数据库】MySQL数据库(四)

一、对数据的操作(详细版)

1.添加数据
1> insert into 表名 (字段1,字段2...) values (值1,值2...);

2> insert into 表名 (字段1,字段2...) values (值1,值2...),(值1,值2...);

3> insert into 表名 values (值1,值2,值3...);

4> insert into 表名 values (值1,值2,值3...),(值1,值2,值3...);

5> insert into stu set id=833689,name=‘xiaojie‘,sex=‘w‘,age=28,classid=‘lamp155‘;

2.删除数据

1> delete from 表名; 别用!!!

2> delete from 表名 where 条件;

3> truncate table 表名; 保留表结构,清空表数据,id索引重新从1开始

3.修改数据

1> update 表名 set 字段名=修改后的值; //不加条件会导致所有的数据都被修改

2> update 表名 set 字段名=修改后的值 where 条件; //一定要加条件

3> update 表名 set 字段名1=值1,字段名2=值2... where 条件; //修改多条

4.查询数据
① select 主句
select database(); //查看当前所使用的数据库
select version(); //查看当前MySQL的版本
select user(); //查看当前所使用的用户
select 1+2; //3 //查看运算结果

注意:select 主句可以单独执行一些命令

② from 子句

1> select * from 表名; //从指定的表中查询数据

2> select 字段1,字段2... from 表名; //从指定的表中查出指定的字段信息

③ where 子句【***对于数据的查询进行条件限制会应用到的知识点***】

包含条件、算术运算符、逻辑运算符、比较运算符

算术运算符:+ - * / %
比较运算符:> < >= <= != =
逻辑运算符:逻辑或(or ||)、逻辑与(and &&)、逻辑非(not !)
提升运算符的优先级:()括弧

1.搜索stu表中id<20的所有数据;
select * from stu where id<20;

2.搜索stu表中id在20-40之间的数据;
select * from stu where id>20 && id<40;
select * from stu where id between 20 and 40;

3.搜索stu表中id除了20-40之间的数据,并且id小于50;
select * from stu where (id<20 || id>40) && id<50;
select * from stu where id not between 20 and 40;

4.搜索stu表中id在(1,3,5,7,9)之中的数据;
select * from stu where id=1 or id=3 or id=5 or id=7 or id=9;
select * from stu where id<10 && id%2=1;
select * from stu where id<10 && id%2!=0;
select * from stu where id in (1,3,5,7,9);

5.搜索id%2=0的所有数据
select * from stu where id%2=0;

6.搜索stu表中name它名字以5结尾的数据,并且id小于50的数据;
select * from stu where name like ‘%5‘

7.搜索stu表中id数据以2开头的数据,并且id小于30的数据;
select * from stu where id like ‘2%‘ and id<30;

8.搜索stu表中class班级包含183的数据,并且id小于50的数据;
select * from stu where classid like ‘%175%‘;

in 关键字:

查询一个集合的数据
搜索stu表中id在1,3,5,7,9之中的数据;

搜索stu表中id不在1,3,5,7,9之中的数据,并且id小于20;

between...and... 关键字:
查询一个区间的数据
搜索stu表中id在20-40之间的数据;

搜索stu表中id除了20-40之间的数据,并且id小于50;

not 关键字:
配合其他的一些关键字来使用

like 关键字(模糊查询):
%:任意长度

_:一个长度

④ group by 分组子句:

查询出stu表中id在50之中的,按班级分组,并且统计每个班有多少学生,
统计数量大于8的数据显示出来

1.首先查询出stu表中id在50之中的数据
mysql> select * from stu where id<50;
+----+------------+-----+-----+---------+
| id | name | sex | age | classid |
+----+------------+-----+-----+---------+
| 1 | zhangsan1 | w | 23 | lamp177 |
| 2 | zhangsan2 | w | 28 | lamp176 |
| 3 | zhangsan3 | w | 21 | lamp177 |
| 4 | zhangsan4 | w | 19 | lamp180 |
| 5 | zhangsan5 | w | 26 | lamp176 |
| 6 | zhangsan6 | w | 24 | lamp180 |
………………

2.其次按班级分组(按照那个字段进行分组,就将该字段写到group by后面)
mysql> select * from stu where id<50 group by classid;
+----+------------+-----+-----+---------+
| id | name | sex | age | classid |
+----+------------+-----+-----+---------+
| 13 | zhangsan13 | w | 28 | lamp175 |
| 2 | zhangsan2 | w | 28 | lamp176 |
| 1 | zhangsan1 | w | 23 | lamp177 |
| 7 | zhangsan7 | w | 18 | lamp178 |
| 33 | zhangsan33 | w | 23 | lamp179 |
| 4 | zhangsan4 | w | 19 | lamp180 |
+----+------------+-----+-----+---------+

注意:classid前面的各项信息跟分组之后的信息无关,它只是取得每一个班级第一次
出现的那个人的信息显示出来了!

3.将每个班级的学生数量统计出来
mysql> select count(*) from stu where id<50 group by classid;
+----------+
| count(*) |
+----------+
| 6 |
| 8 |
| 9 |
| 6 |
| 5 |
| 15 |
+----------+


4.光有数量还不够,我得知道它所对应的班级,是哪个班
mysql> select classid,count(*) from stu where id<50 group by classid;
+---------+----------+
| classid | count(*) |
+---------+----------+
| lamp175 | 6 |
| lamp176 | 8 |
| lamp177 | 9 |
| lamp178 | 6 |
| lamp179 | 5 |
| lamp180 | 15 |
+---------+----------+


5.分组结束之后,还有一个分组后的条件时将统计数量大于6的显示出来
mysql> select classid,count(*) from stu where id<50 group by classid having count(*)>6;
+---------+----------+
| classid | count(*) |
+---------+----------+
| lamp176 | 8 |
| lamp177 | 9 |
| lamp180 | 15 |
+---------+----------+


6.结果查询到之后,再给count(*)字段进行一个别名的修改,改为sum
mysql> select classid,count(*) as sum from stu where id<50 group by classid having sum>6;
+---------+-----+
| classid | sum |
+---------+-----+
| lamp176 | 8 |
| lamp177 | 9 |
| lamp180 | 15 |
+---------+-----+

练习题:

查询stu表中id<30的数据,并且按性别进行分组,统计出男生和女生的人数,
给统计数量的那个字段一个别名叫sum

select sex,count(*) as sum from stu where id<30 group by sex;



⑤ order by:排序子句【***在项目期的数据排序会应用到的知识点***】

asc:升序排序(默认)

desc:降序排序

1.查询stu表中,id小于50的数据,按照年龄降序排序
select * from stu where id<50 order by age desc;

⑥ limit:分页子句【***在项目期的数据分页查询会应用到的知识点***】

注意:分页子句后面可以直接跟一个值,但是我们推荐写两个值

limit 0,5;
0:从第几条开始(表示的是数据的下标)
5:每页显示几条

mysql> select * from stu limit 0,5;
+----+-----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+-----------+-----+-----+---------+
| 1 | zhangsan1 | m | 27 | lamp178 |
| 2 | zhangsan2 | m | 20 | lamp180 |
| 3 | zhangsan3 | m | 22 | lamp175 |
| 4 | zhangsan4 | w | 25 | lamp176 |
| 5 | zhangsan5 | m | 28 | lamp178 |
+----+-----------+-----+-----+---------+
5 rows in set (0.00 sec)

mysql> select * from stu limit 5,5;
+----+------------+-----+-----+---------+
| id | name | sex | age | classid |
+----+------------+-----+-----+---------+
| 6 | zhangsan6 | w | 28 | lamp176 |
| 7 | zhangsan7 | w | 18 | lamp180 |
| 8 | zhangsan8 | m | 27 | lamp178 |
| 9 | zhangsan9 | w | 27 | lamp179 |
| 10 | zhangsan10 | w | 22 | lamp177 |
+----+------------+-----+-----+---------+
5 rows in set (0.00 sec)

mysql> select * from stu limit 10,5;
+----+------------+-----+-----+---------+
| id | name | sex | age | classid |
+----+------------+-----+-----+---------+
| 11 | zhangsan11 | w | 28 | lamp179 |
| 12 | zhangsan12 | w | 19 | lamp177 |
| 13 | zhangsan13 | m | 19 | lamp176 |
| 14 | zhangsan14 | w | 19 | lamp178 |
| 15 | zhangsan15 | w | 26 | lamp176 |
+----+------------+-----+-----+---------+
5 rows in set (0.00 sec)

mysql> select * from stu limit 15,5;
+----+------------+-----+-----+---------+
| id | name | sex | age | classid |
+----+------------+-----+-----+---------+
| 16 | zhangsan16 | m | 26 | lamp175 |
| 17 | zhangsan17 | w | 19 | lamp178 |
| 18 | zhangsan18 | w | 18 | lamp177 |
| 19 | zhangsan19 | w | 23 | lamp179 |
| 20 | zhangsan20 | m | 20 | lamp175 |
+----+------------+-----+-----+---------+
5 rows in set (0.00 sec)

⑦ 搜索语句当中常用的一些函数

count(); //统计函数

mysql> select count(*) from stu;
+----------+
| count(*) |
+----------+
| 100 |
+----------+

max(); //求最大值

mysql> select max(age) from stu;
+----------+
| max(age) |
+----------+
| 28 |
+----------+
1 row in set (0.00 sec)

min(); //求最小值

mysql> select min(age) from stu;
+----------+
| min(age) |
+----------+
| 18 |
+----------+
1 row in set (0.00 sec)

sum(); //求和

mysql> select sum(age) from stu;
+----------+
| sum(age) |
+----------+
| 2295 |
+----------+
1 row in set (0.00 sec)

avg(); //求平均值

mysql> select avg(age) from stu;
+----------+
| avg(age) |
+----------+
| 22.9500 |
+----------+
1 row in set (0.00 sec)

⑧ 子查询(嵌套查询)

一个查询语句的结果是另一个查询语句的条件

mysql> select * from stu where age=(select max(age) from stu);
+-----+-------------+-----+-----+---------+
| id | name | sex | age | classid |
+-----+-------------+-----+-----+---------+
| 5 | zhangsan5 | m | 28 | lamp178 |
| 6 | zhangsan6 | w | 28 | lamp176 |
| 11 | zhangsan11 | w | 28 | lamp179 |
| 49 | zhangsan49 | m | 28 | lamp177 |
| 68 | zhangsan68 | w | 28 | lamp178 |
| 87 | zhangsan87 | m | 28 | lamp180 |
| 99 | zhangsan99 | w | 28 | lamp178 |
| 100 | zhangsan100 | w | 28 | lamp180 |
+-----+-------------+-----+-----+---------+

⑨ 查询语句的书写顺序

select 字段信息 from 表名 where 分组前条件 group by 字段信息 having 分组后条件 order by 排序字段 [asc|desc] limit 分页条件;

select -> from -> where -> group by -> having -> order by -> asc|desc -> limit

⑩ 关联查询(多表联查)【***在项目期的多表联查会使用到该知识点***】
当我们查询一个表的数据不能够完成我们想要的功能的时候,我们就可能会需要使用
多表联查的方法!

功能:
我想要查询怡红院表中每个人的姓名,以及它所对应的职位;

1.找关联:观察多个表,看他们两两之间字段的关系
确定两个表中有关系的字段是谁

2.先写出:select * from stulist,job;

mysql> select * from stulist,job;
+----+------+-----+-----+-----+----+-----+------------+
| id | name | sex | age | job | id | jid | name |
+----+------+-----+-----+-----+----+-----+------------+
| 1 | 康辉 | m | 28 | 4 | 1 | 1 | 怡红院老板 |
| 1 | 康辉 | m | 28 | 4 | 2 | 2 | 怡红院头牌 |
| 1 | 康辉 | m | 28 | 4 | 3 | 3 | 怡红院二牌 |
| 1 | 康辉 | m | 28 | 4 | 4 | 4 | 怡红院老鸨 |
| 1 | 康辉 | m | 28 | 4 | 5 | 5 | 怡红院龟公 |
| 2 | 丁辉 | w | 38 | 2 | 1 | 1 | 怡红院老板 |
| 2 | 丁辉 | w | 38 | 2 | 2 | 2 | 怡红院头牌 |
| 2 | 丁辉 | w | 38 | 2 | 3 | 3 | 怡红院二牌 |
| 2 | 丁辉 | w | 38 | 2 | 4 | 4 | 怡红院老鸨 |
| 2 | 丁辉 | w | 38 | 2 | 5 | 5 | 怡红院龟公 |
| 3 | 卫东 | w | 48 | 2 | 1 | 1 | 怡红院老板 |
| 3 | 卫东 | w | 48 | 2 | 2 | 2 | 怡红院头牌 |
| 3 | 卫东 | w | 48 | 2 | 3 | 3 | 怡红院二牌 |
| 3 | 卫东 | w | 48 | 2 | 4 | 4 | 怡红院老鸨 |
| 3 | 卫东 | w | 48 | 2 | 5 | 5 | 怡红院龟公 |
| 4 | 紫薇 | w | 58 | 3 | 1 | 1 | 怡红院老板 |
| 4 | 紫薇 | w | 58 | 3 | 2 | 2 | 怡红院头牌 |
| 4 | 紫薇 | w | 58 | 3 | 3 | 3 | 怡红院二牌 |
| 4 | 紫薇 | w | 58 | 3 | 4 | 4 | 怡红院老鸨 |
| 4 | 紫薇 | w | 58 | 3 | 5 | 5 | 怡红院龟公 |
| 5 | 尔康 | m | 68 | 5 | 1 | 1 | 怡红院老板 |
| 5 | 尔康 | m | 68 | 5 | 2 | 2 | 怡红院头牌 |
| 5 | 尔康 | m | 68 | 5 | 3 | 3 | 怡红院二牌 |
| 5 | 尔康 | m | 68 | 5 | 4 | 4 | 怡红院老鸨 |
| 5 | 尔康 | m | 68 | 5 | 5 | 5 | 怡红院龟公 |
| 6 | 飞哥 | m | 18 | 1 | 1 | 1 | 怡红院老板 |
| 6 | 飞哥 | m | 18 | 1 | 2 | 2 | 怡红院头牌 |
| 6 | 飞哥 | m | 18 | 1 | 3 | 3 | 怡红院二牌 |
| 6 | 飞哥 | m | 18 | 1 | 4 | 4 | 怡红院老鸨 |
| 6 | 飞哥 | m | 18 | 1 | 5 | 5 | 怡红院龟公 |
+----+------+-----+-----+-----+----+-----+------------+

3.写条件:
mysql> select * from stulist,job where stulist.job=job.jid;
+----+------+-----+-----+-----+----+-----+------------+
| id | name | sex | age | job | id | jid | name |
+----+------+-----+-----+-----+----+-----+------------+
| 1 | 康辉 | m | 28 | 4 | 4 | 4 | 怡红院老鸨 |
| 2 | 丁辉 | w | 38 | 2 | 2 | 2 | 怡红院头牌 |
| 3 | 卫东 | w | 48 | 2 | 2 | 2 | 怡红院头牌 |
| 4 | 紫薇 | w | 58 | 3 | 3 | 3 | 怡红院二牌 |
| 5 | 尔康 | m | 68 | 5 | 5 | 5 | 怡红院龟公 |
| 6 | 飞哥 | m | 18 | 1 | 1 | 1 | 怡红院老板 |
+----+------+-----+-----+-----+----+-----+------------+

4.限定要查询的字段内容
mysql> select stulist.name,job.name from stulist,job where stulist.job=job.jid;
+------+------------+
| name | name |
+------+------------+
| 康辉 | 怡红院老鸨 |
| 丁辉 | 怡红院头牌 |
| 卫东 | 怡红院头牌 |
| 紫薇 | 怡红院二牌 |
| 尔康 | 怡红院龟公 |
| 飞哥 | 怡红院老板 |
+------+------------+

注意:虽然结果我们已经查出来了!但是名字是一样的!所以我们需要起别名

5.将可以起别名的两个字段分别起别名,并进行使用
mysql> select stulist.name as sname,job.name as jname from stulist,job where stulist.job=job.jid;
+-------+------------+
| sname | jname |
+-------+------------+
| 康辉 | 怡红院老鸨 |
| 丁辉 | 怡红院头牌 |
| 卫东 | 怡红院头牌 |
| 紫薇 | 怡红院二牌 |
| 尔康 | 怡红院龟公 |
| 飞哥 | 怡红院老板 |
+-------+------------+

6.将两个表的名字起别名再进行使用
mysql> select s.name as sname,j.name as jname from stulist as s,job as j where s.job=j.jid;
+-------+------------+
| sname | jname |
+-------+------------+
| 康辉 | 怡红院老鸨 |
| 丁辉 | 怡红院头牌 |
| 卫东 | 怡红院头牌 |
| 紫薇 | 怡红院二牌 |
| 尔康 | 怡红院龟公 |
| 飞哥 | 怡红院老板 |
+-------+------------+

7.将所有的as都可以省略点,也代表起别名的含义
mysql> select s.name sname,j.name jname from stulist s,job j where s.job=j.jid;
+-------+------------+
| sname | jname |
+-------+------------+
| 康辉 | 怡红院老鸨 |
| 丁辉 | 怡红院头牌 |
| 卫东 | 怡红院头牌 |
| 紫薇 | 怡红院二牌 |
| 尔康 | 怡红院龟公 |
| 飞哥 | 怡红院老板 |
+-------+------------+

⑩① 字段拼接 concat():【在项目期的类别管理会应用此处知识点】

concat()的使用效果和php当中的.连接非常相似,我们只需要将需要拼接的字段名
写入concat后的括号当中,就可以实现将该字段下的所有内容进行拼接,也因为是
字符串拼接,所以,我们可以放入一些自己定义的符号进行多个字段之间内容的连
接,这就是concat()函数

mysql> select concat(name,‘-‘,sex,‘-‘,age) from stulist;
+------------------------------+
| concat(name,‘-‘,sex,‘-‘,age) |
+------------------------------+
| 康辉-m-28 |
| 丁辉-w-38 |
| 卫东-w-48 |
| 紫薇-w-58 |
| 尔康-m-68 |
| 飞哥-m-18 |
+------------------------------+


$a = "hello";
$b = "world!";
$c = $a.$b; //hello world!

【数据库】MySQL数据库(四)