1、linux系统中安装mysql:
①、[root@localhost /]# yum install mysql:安装mysql客户端
②、[root@localhost /]# yum install mysql-server:安装mysql服务端
备注:在企业里面一般不需要下载安装数据、只需要安装一个远程连接数据库的工具
2、什么是数据库?
是存放数据的电子仓库。以某种方式存储百万条,上亿条数
据,供多个用户访问共享
3、关系型数据库和非关系型数据库分别有哪些:
关系型数据
1.db2
2.oracle
3.mysql
4.sql server
非关系型数据库
1.hbase(列模型)
2.redis(键值对模型)
3.mongodb(文档类模型)
4、在项目中什么时候会使用到数据库
①、执行用例的时候需要去数据库中核对一些数据
②、定位bug的时候也需要去数据库中查询一些数据信息
③、测试的某些场景需要去数据库中构造测试数据
④、页面新增一些字段需要执行sql脚本
5、数据库的结构
①、库(database)
②、表(table)
④、数据(data)
备注:表是否表字段+表数据组成的
6、如何启动/关闭/重启/数据库、查看数据库的状态
①、service mysqld start:启动
②、service mysqld stop:停止
③、service mysqld restart:重启
④、service mysqld status:查看数据库状态
7、mysql默认的端口号:3306
8、如何给登录数据库用户root设置初始密码
[root@localhost /]# mysqladmin -uroot password '123456'
备注:设置登录用户的初始密码前需要先启动数据库
9、如何在linux系统中登录数据库
第一种登录方法:
[root@localhost /]# mysql -uroot -p
Enter password: 123456
备注:登录成功后会显示mysql>提示符
第二种登录方法:
[root@localhost /]# mysql -uroot -p123456
备注:登录成功后会显示mysql>提示符
10、如何从mysql交互界面退出到linux交互界面
1、ctrl+z
2、exit
11、学习linux系统中三种提示符:
①、[root@localhost /]# :linux命令
②、mysql> :输入sql语句
③、Xshell:> :ssh+ip地址
12、在linux系统中如何更改登录数据库用户的密码
[root@localhost /]# mysqladmin -uroot -p123456 password '1234567'
13、查询当前所有的库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
备注:
①、sql语句必须要以英文的分号结尾
②、以上三个库为系统自带、切勿删除
14、如何新建一个自定义库
mysql> create database dcs73;
Query OK, 1 row affected (0.00 sec)
15、如何查询当前所在库
实例1:当前不在任何库中
mysql> select database();
+------------+
| database() |
+------------+
| NULL |
+------------+
实例2:当前所在库为dcs73
mysql> select database();
+------------+
| database() |
+------------+
| dcs73 |
+------------+
16、如何进入指定库/切换到指定的库
mysql> use dcs73;
Database changed
17、查询当前所在库中所有的表
mysql> show tables;
18、创表语法:
create table +表名(字段1+数据类型+约束,字段2+数据类型+约束,......)
实例1:创建一张学生表
mysql> create table student(id int primary key
auto_increment,name char(20) not null,score
float(10,2),phone bigint default'18389581558',
s_time date);
电脑(windows)
1、开机
2、登录电脑
3、启动qq
4、登录qq
5、进行聊天
虚拟机(linux)
1、开机
2、登录虚拟机
3、启动数据库
4、登录数据库
5、进行查询数据
18、创表语法:
create table +表名(字段1+数据类型+约束,字段2+数据类型+约束,......)
实例1:创建一张学生表
mysql> create table student(id int primary key auto_increment,name char(20) not null,score float(10,2),phone bigint default'18389581558', s_time date);
备注:
1、在企业中创表是由开发去完成
2、表名称不允许重复
3、create table student:创建一个张学生表
4、id、name、score、phone、s_time:代表的是字段
5、每个字段必须以逗号就行分隔
6、声明字段时必须设置数据类型、约束是选填
19、mysql中常见的数据类型有哪些?
1、int:整型
2、char:字符串
3、varchar:字符串
4、float:浮点型
5、bigint:整型、当存储的值超过2147483647
6、date:日期类型
20、mysql中常见的约束有哪些?
1、primary key:主键约束
2、auto_increment:自增约束
3、not null:不能为null
4、default:默认值约束
21、如何查看指定的表的完整表结构?
mysql> desc student;
22、针对表结构的操作:
1、重命名指定表名称:
语法: alter table+旧的表名称 rename+新的表名称
实例:将student表名称修改成s_student表名称:
mysql> alter table student rename s_student;
2、表结构中添加字段
语法:alter table+表名称 add+字段名称+数据类型+约束(选填);
实例1:给student表中添加一个指定的字段且存放在末尾
mysql> alter table student add dcs1 int;
备注:当添加字段时且没有声明存放的位置则默认存在末尾
实例2:添加一个表字段且指定加到首位
mysql> alter table student add dcs2 int first;
备注:first代表的是首位
实例3:添加一个表字段且指定添加到指定的位置
mysql> alter table student add dcs3 int after name;
备注:after name代表的是存放在name字段的后面
实例4:给一张表同时添加多个表字段
语法:alter table+表名称 add(字段1+数据类型,字段2+数据类型,.....)
mysql> alter table student add(dcs1 int,dcs2 int);
备注:dcs1、dcs2代表的是添加的字段
3、删除表字段
语法:alter table+表名 drop+字段名称1,drop+字段名称2,drop....
实例1:删除表结构中指定的字段(单个)
mysql> alter table student drop dcs1;
备注:dcs1代表的是被删除的表字段
实例2:删除表结构中指定的字段(多个)
mysql> alter table student drop dcs1,drop dcs2;
备注:
①、dcs1和dcs2代表被删除的字段
②、删除多少个字段就必须要有多少个drop
4、修改表结构中表字段名称、数据类型、约束(change)
语法:alter table+表名称 change 旧的字段名称 新的字段名称+数据类型+约束
实例1: 修改表结构中的字段名称、其他保持不变
mysql> alter table student change name s_name char(20) not null
备注:name为旧的字段名称、s_name为新的字段名称
实例2:修改表结构中的字段的数据类型、其他保持不变
mysql> alter table student change name name varchar(22) not null;
备注:
①、sql中的2个name代表是将name修改成name
②、varchar(22)代表的是修改后的字段数据类型
实例3:修改表结构中的字段约束、其他保持不变
第一种场景:取消约束
mysql> mysql> alter table student change name name varchar(22);
第二种场景:增加约束
mysql> alter table student change name name varchar(22) not null;
第二种场景:修改约束
mysql> alter table student change name name varchar(22) default'zhansgan';
实例4、修改表结构中字段的名称、数据类型、约束
mysql> alter table student change name s_name char(20) not null;
5、如何删除表中的主键约束
①、删除主键约束前需要先取消自增约束
mysql> alter table student change id id int;
②、删除主键约束
mysql> alter table student drop primary key;
6、如何添加主键约束
第一种方法:change
mysql> alter table student change id id int primary key;
第二种方法:add
mysql> alter table student add primary key(id);
7、移动字段位置的同时修改数据类型、约束(modify)
语法:alter table student modify 字段名称+数据类型+约束+位置
实例1:移动指定的字段到指定位置、数据类型和约束不变
①、移动到首位
mysql> alter table student modify s_name char(20) not null first;
②、移动到指定的位置
mysql> alter table student modify s_name char(20) not null after id;
实例2: 移动字段位置的同时修改数据类型、约束
mysql> alter table student modify s_name varchar(20) default'zhangsan' after score;
8、change和modify区别:
①、change可以修改字段名称、数据类型、约束
②、modify可以修改数据类型、约束
③、modify可以移动字段位置、change不允许
23、针对表数据操作
增: insert into
1、全局插入
语法:insert into 表名称 values(值1,值2,值3....)
实例1:插入单条数据
mysql> insert into student values(1,'zhansgan',80,18389581559,'2022-05-03');
实例2:插入多条数据
mysql> insert into student values(2,'lisi',77,18389581557,'2022-05-04'),(3,'wangwu',88,18389581556,'2022-05-05');
2、指定字段插入
语法:insert into 表名称(字段1,字段2,...)values(值1,值2,...)
mysql> insert into student(score,name,phone,time)values(100,'zhaoliu',18389581555,2022-05-06);
删: delete
语法:delete from+表名称 where+条件
实例1:清空student表中所有的数据
mysql> delete from student;
实例2:指定删除/带条件删除
mysql> delete from student where score between 60 and 77;
改: update
语法:update+表名 set+字段=值 where+条件
实例1:将student表中所有人的成绩修改成77
mysql> update student set score=77;
实例2:将student表中wangwu的成绩修改成77
mysql> update student set score=77 where name='wangwu';
查: select
student表
id name class score sex
1 zhangsan dcs73 80 nan
2 lisi dcs72 81 nan
3 wangwu dcs73 77 nan
4 zhaoliu dcs73 99 nv
5 xiaoqi dcs72 100 nv
6 xiaoba dcs73 66 nan
1、查询表中所有的数据
语法:select * from +表名称
mysql> selct * from student;
备注:*代表的是所有的字段
2、查询表中指定的字段数据
语法:select 字段1,字段2... from +表名称
mysql> select name,score from student;
3、带条件查询
单个条件查询:
语法:select+字段名称 from+表名称 where +条件
实例1:查询student表中分数为100的姓名?
mysql> select name from student where score=100;
实例2:查询student表中张三的分数?
mysql> select score from student where name='zhangsan';
实例3:查询student表中分数大于80的学生的姓名?
mysql> select name from student where score>80;
实例4:查询student表中分数小于80的学生的姓名?
mysql> select name from student where score<80;
实例5:查询student表中分数大于且等于80的学生的姓名?
mysql> select name from student where score>=80;
实例6:查询student表中分数小于且等于80的学生的姓名?
mysql> select name from student where score<=80;
实例7:查询student表中分数不等于80的学生的姓名?
第一种写法:
mysql> select name from student where score !=80;
第二种写法:
mysql> select name from student where score <>80;
多个条件查询:and、or
语法:select+字段名称 from+表名称 where+条件1 and 条件2
备注:多个条件必须是同时满足
实例1:查询student表中分数为100的且性别为女的姓名?
mysql> select name from student where score=100 and sex='nv';
实例2:查询student表中分数大于80且性别为男的姓名?
mysql> select name from student where sex='nan' and score>80;
实例3:查询student表中dcs72班分数大于80且性别为女的姓名?
mysql> select name from student where class='dcs72' and score>80 and sex='nv';
语法:select+字段名称 from+表名称 where+条件1 or 条件2
备注:多个条件满足任意一个即可
实例1:查询student表中分数为100或者性别为男的学生姓名?
mysql> select name from student where score=100 or sex='nan';
实例3:查询student表中分数大于80或性别为男或学号为1的学生姓名
mysql> select name from student where score=100 or sex='nan' or id=1;
4、查询表中指定的m-n行数据(limit)
语法:select * from+表名称 limit m,n;
实例1:查询student表中2-4行数据?
mysql> select * from student limit 1,3;
备注:从student表中下标为1开始取、取3行
实例2:查询student表中4-6行数据?
mysql> select * from student limit 3,3;
备注:从student表中下标为3开始取、取3行
实例3:查询student表中前3行数据?
第一种写法:
mysql> select * from student limit 0,3;
第二种写法:
mysql> select * from student limit 3;
实例4:查询student表中第3行数据?
mysql> select * from student limit 2,1;
5、查询表中指定的范围内数据:between...and...
语法:select 字段名称 from 表名称 where+字段+between...and...
实例1: 查询分数在80-100之间的学生姓名?
第一种写法:
mysql> select name from student where score betweent 80 and 100;
第二种写法:
mysql> select name from student where score>=80 and score<=100;
6、模糊查询:like
语法:select+字段名称 from+表名称 where+字段 like '模糊查询的条件'
姓名 性别 籍贯
张三 男 广东省深圳市龙华区
李四 男 广东省广州市白云区
王五 男 江西省.............
实例1:查询籍贯是广东的所有人的姓名
mysql> select 姓名 from student where 籍贯 like '广东省%'
实例2:查询student表中姓名以'xiao'开头的所有人的分数?
mysql> select score from student where name like 'xiao%';
7、排序:order by
正序:asc
倒序:desc
语法:select * from+表名称 order by+字段+正序/倒序
实例1:查询student中所有的数据且根据分数从大到小进行排列显示
mysql> select * from student order by score desc;
实例2:查询student中所有的数据且根据分数从小到大进行排列显示
第一种写法:
mysql> select * from student order by score asc;
第二种写法:
mysql> select * from student order by score;
备注:如果没有声明正序或倒序则默认为正序
8、在或不在:in或not in
语法:select * from 表名称 where 字段 in(结果集)
语法: select * from 表名称 where 字段 not in(结果集)
实例1:查询student表中分数在80、100里面的姓名
mysql> select name from student where score in(80,100);
实例2: 查询student表中分数在不在80、100里面的姓名
mysql> select name from student where score not in(80,100);
9、is null、is not null
语法:select * from 表名称 where 字段 is null
语法:select * from 表名称 where 字段 is not null
实例1:查询参加考试的学生姓名
mysql> select name from student where score is null;
实例2:查询没有参加考试的学生姓名
mysql> select name from student where score is not null;
24、mysql中常用的聚合函数
1、count():统计
2、sum(): 求和
3、avg(): 平均值
4、max(): 最大
5、min(): 最小
6、distinct():去重
25、mysql中分组:group by
①、group by一般经常与聚合函数、having一起使用
②、group by前面可以接where、后面只能接having
③、having的作用相当于where
④、having后面接的条件是分组后的、可以直接接聚合函数
实例1:查询表中一共又多少条数据?
mysql> select count(id) from student;
实例2:查询表中一共又多少条数据且给统计出来的字段重名为a
mysql> select count(id)a from student;
实例3:查询student表中每个班级的人数?
mysql> select count(id),class from student group by class;
实例4:查询student表中每个班级分数大于80的人数====》先筛选在分组
1、先将分数大于80的所有人数据筛选出来
2、在将筛选出的所有数据进行分组统计
mysql>mysql> select count(id),class from student where score>80 group by class ;
实例5:查询班级人数大于2的班级名称====》先分组在筛选
1、先根据班级名称进行分组
2、在统计分组后的每个班级人数
3、在通过人数>2进行筛选
mysql> select class from student group by class having count(id)>2
实例6:求所有班级的总分
mysql> select sum(score) from student;
实例7:求每个班级的总分
mysql> select sum(score),class from student group by class;
实例8:求班级总分大于200分的班级名称====》先分组在筛选
mysql> select class from student group by class having sum(score)>200;
实例9:求student表中最高分
mysql> select max(score) from student;
实例10:求每个班级的最高分
mysql> select max(score),class from student group by class;
实例11:求每个班级的最高分的学生姓名
1、先求出每个班级的最高分
mysql> select max(score) from student group by class;
2、从student表中求姓名、条件是学生表中的分数要在每个班最高分的结果集中
mysql> select name from student where score in(select max(score) from student group by class)
题目:求A表中不在B表中的名字
A表
id name
1 张三
2 李四
3 王五
B表
sid sname
1 张三
2 李四
3 赵六
mysql> select name from A where name not in(select sname from B);
题目:求每个科目都及格的学生姓名?
C表
id name subject score
1 张三 语文 60
2 张三 数学 70
3 张三 英语 80
4 李四 语文 60
5 李四 数学 70
6 李四 英语 50
第一种方法:分组+聚合函数
mysql> select name from C group by name having min(score)>=60
第二种方法:子查询/嵌套
1、求出有不及格科目的学生姓名
mysql> select name from C where score<60;
2、在C表中求名字条件是C表中的名字不在不及格的学生姓名中
mysql> select distinct(name) from C where name not in(select name from C where score<60);
题目:求三科成绩的总和
score表
+------+---------+---------+------+
| id | chinese | english | math |
+------+---------+---------+------+
| 1 | 70 | 80 | 90 |
| 2 | 77 | 88 | 99 |
+------+---------+---------+------+
mysql> select sum(chinese+english+math) from score
26、mysql中delete、drop、truncate三种删除的区别
1、语法不同
①、delete from 表名 where 条件
②、drop table 表名
③、truncate 表名
2、delete和truncate只能删除表数据、不能删除表结构
3、drop删除表数据的同时删除表结构
4、delete属于DML、drop和truncate属于DDL
27、mysql中的DML、DDL分别代表是声明
DML:数据库操作语言
1、select
2、insert into
3、update
4、delete
DDL:数据库定义语言
1、create
2、alter table
3、drop
4、truncate
28、针对于表数据和表结构的增、删、改、查
1、表数据:insert into、delete、update、select
2、表结构:add、drop、change、desc
29、单表练习题?
1、查询1832班的成绩信息
select chinese,english,math from grade where class=1832;
+---------+---------+------+
| chinese | english | math |
+---------+---------+------+
| 55 | 86 | 66 |
| 84 | 90 | 88 |
| 84 | 98 | 77 |
| 56 | 57 | 77 |
| 78 | 57 | 88 |
| 80 | 76 | 88 |
+---------+---------+------+
2、查询1833班,语文成绩大于80小于90的成绩信息
select chinese,english,math from grade where class=1833 and chinese>80 and chinese<90;
+---------+---------+------+
| chinese | english | math |
+---------+---------+------+
| 86 | 90 | 40 |
| 87 | 60 | 65 |
+---------+---------+------+
3、查询学生表中5到10行的数据
select * from grade limit 4,6;
+-------+---------+---------+------+---------+------+-----+
| class | chinese | english | math | name | age | sid |
+-------+---------+---------+------+---------+------+-----+
| 1833 | 93 | 57 | 22 | lijiu | 5 | 25 |
| 1832 | 84 | 98 | 77 | niuqi | 6 | 26 |
| 1832 | 56 | 57 | 77 | liuli | 7 | 27 |
| 1833 | 48 | 58 | 88 | wangbo | 8 | 28 |
| 1832 | 78 | 57 | 88 | wangsan | 9 | 29 |
| 1833 | 87 | 60 | 65 | wangan | 10 | 30 |
+-------+---------+---------+------+---------+------+-----+
4、显示1832班英语成绩为98,数学成绩为77的姓名与学号
select name,sid from grade where class=1832 and english=98 and math=77;
+-------+-----+
| name | sid |
+-------+-----+
| niuqi | 26 |
+-------+-----+
5、查询出1832班成绩并且按语文成绩排序(降序)
1、先筛选出来
2、在进行降序显示
select chinese,english,math from grade where class=1832 order by chinese desc;
+---------+---------+------+
| chinese | english | math |
+---------+---------+------+
| 84 | 90 | 88 |
| 84 | 98 | 77 |
| 80 | 76 | 88 |
| 78 | 57 | 88 |
| 56 | 57 | 77 |
| 55 | 86 | 66 |
+---------+---------+------+
6、查询1833班与1832班,语文成绩与数学成绩都小于80的姓名。
1832 chinese<80 math<80
1833 chinese<80 math<80
select name from grade where class in(1832,1833) and chinese<80 and math<80;
select name from grade where (class=1832 or class=1833) and chinese<80 and math<80;
+-------+
| name |
+-------+
| lisi |
| liuli |
+-------+
7、查询出没有参加语文考试的学生姓名和班级名称。
select name,class from grade where chinese is null;
+---------+-------+
| name | class |
+---------+-------+
| wanghui | 1833 |
+---------+-------+
8、求出班上语文成绩不及格的学生姓名
select name from grade where chinese<60;
+--------+
| name |
+--------+
| lisi |
| liuli |
| wangbo |
+--------+
9、求出每个班的数学平均成绩
select avg(math),class from grade group by class;
+-----------+-------+
| avg(math) | class |
+-----------+-------+
| 80.6667 | 1832 |
| 66.8333 | 1833 |
+-----------+-------+
10、求出每个班级语文成绩总分 --涉及到每个的时候都需要分组
select sum(chinese),class from grade group by class;
+--------------+-------+
| sum(chinese) | class |
+--------------+-------+
| 437 | 1832 |
| 407 | 1833 |
+--------------+-------+
11、将语文成绩不及格的学生成绩改为60分
update grade set chinese=60 where chinese<60;
12、三科分数都大于70分的人名和年纪
select name,age from grade where chinese>70 and english>70 and math>70;
+----------+------+
| name | age |
+----------+------+
| wangwu | 4 |
| niuqi | 6 |
| wangping | 11 |
+----------+------+
13、求出英语分数高于70且其它任何一科目大于60分的人和班级
条件:
1、english>70 and chinese>60
2、english>70 and math>60
select name,class from grade where english>70 and (chinese>60 or math>60);
+----------+-------+
| name | class |
+----------+-------+
| zhangsan | 1833 |
| lisi | 1832 |
| wangwu | 1832 |
| niuqi | 1832 |
| wangping | 1832 |
| wanghui | 1833 |
+----------+-------+
14、统计每个班的人数
select count(sid),class from grade group by class;
+------------+-------+
| count(sid) | class |
+------------+-------+
| 6 | 1832 |
| 6 | 1833 |
+------------+-------+
15、求每个班数学成绩大于80的人数
1、先筛选除数学成绩大于80的所有人
2、在进行分组统计出来每个班数学成绩大于80的人数
select count(sid),class from grade where math>80 group by class;
+------------+-------+
| count(sid) | class |
+------------+-------+
| 3 | 1832 |
| 3 | 1833 |
+------------+-------+
16、求出每个班英语成绩最高的那个人的姓名和班级名称 --每个班英语成绩最高
1、每个班的最高英语成绩求出来且显示班级
2、在从grade表中求班级和姓名、条件是grade表中的英语成绩和班级要同时在第一个步骤里面
mysql> select name,class from grade where (english,class) in(select max(english),class from grade group by class);
+----------+-------+
| name | class |
+----------+-------+
| zhangsan | 1833 |
| niuqi | 1832 |
+----------+-------+
17、给student表增加3个字段(数据类型及长度自定义,建议要合理)
alter table grade add(字段1 数据类型,字段2 数据类型,字段3 数据类型);
navicat: 远程连接数据库的工具
navicat远程连接数据库流程:
1、mysql> use mysql;====》先进库
2、mysql> grant all privileges on . to 'root'@'%' identified by '123456';===》添加用户且设置%号权限
3、mysql> flush privileges;===》刷新一下
4、mysql> select user,host from user;===》查看用户及权限
5、退出到linux命令行:关闭防火墙/开放端口号
6、关闭防火墙命令:service iptables stop
navicat远程连接数据库需要准备的一些数据:
1、远程登录数据库用户必须要有%号
2、关闭防火墙/开放端口号
3、服务器数据库一定要启动
4、需要获取到数据库所在服务器的ip地址
常用查看日志方法
1、实时日志:tall -f xxx.log
2、搜索关键字附近日志:cat -n filename | grep "关键字"
navicat运行sql的方法:
1、运行按钮:运行左右
2、鼠标选中运行
navicat中的注释功能:
注释的作用:
1、被注释的sql将不会被执行
2、增强代码的可读性
注释的方法:
1、单行注释:#
2、段落注释:/..../
30、mysql中的多表查询
A表:信息表
id name
1 张三
2 李四
3 王五
B表:成绩表
sid score
1 80
2 90
4 100
1、基本连接:where
语法:select * from A表,B表 where A表.字段=B表.字段;
select * from A,B where A.id=B.sid;
备注:基本连接只会显示两张表具有同等条件的数据
2、内连接:inner join
语法: select * from A表 inner join B表 on A表.字段=B表.字段
select * from A inner join B on A.id=B.sid;
备注:内连接只会显示两张表具有同等条件的数据
3、左连接:left join
语法:select * from A表 left join B表 on A表.字段=B表.字段
select * from A LEFT JOIN B on A.id=B.sid;
备注:
1、left join左边的表称为主表、右边的表称为次表
2、左连接后主表的数据显示所有、次表具有同等条件的数据则会显示、否则为null
4、右连接:right join
语法:select * from A表 right join B表 on A表.字段=B表.字段
select * from A right join B on A.id=B.sid;
备注:
1、right join右边的表称为主表、左边的表称为次表
2、右连接后主表的数据显示所有、次表具有同等条件的数据则会显示、否则为null
5、硬连接:union
select * from A union select * from B;
6、关于多表查询的面试题?
①、多表查询的方法有哪些?
②、内连接和外连接有什么区别
③、左连接和右有什么区别
④、两张表没有任何属性关联,如何连接这两张表
7、求张三的成绩?
基本连接:
select score from A,B where A.id=B.sid and name='张三';
内连接:
select score from A inner join B on A.id=B.sid where name='张三';
左连接:
select score from B LEFT JOIN A on A.id=B.sid where name='张三';
右连接:
select score from A LEFT JOIN B on A.id=B.sid where name='张三';
临时表:
select score from (select * from A,B where A.id=B.sid)t where t.name='张三'
子查询/嵌套:
select score from B where sid=(select id from A where name='张三')
8、求谁没有参加考试
左连接:
select name from A left join B on A.id=B.sid where score is null;
右连接:
select name from B right join A on A.id=B.sid where score is null;
临时表:
select name from (select * from B right join A on A.id=B.sid)t where t.score is null;
子查询/嵌套:
select name from A where id not in(select sid from B);
创建一个视图
create view yy as(select id,name from student);
查看视图的两种方法:
第一种:
show tables;
第二种:
show create view yy;
针对于视图的增删改查:
1、查看视图所有内容
select * from yy;
t
2、修改视图中指定字段的值
update yy set name='wangwu' where id=2;
3、删除视图中指定的数据
delete from yy where id=2;
4、往视图中增加数据
insert into yy values(2,'lisi')
如何删除指定视图
drop table yy; #报错、无法删除
drop view yy; #删除成功
视图与基本表之间的关系:
①、视图是基于基本表创建的
②、修改(针对于表数据的增删改查)视图会同步到基本表
③、修改(针对于表数据的增删改查)基本表会同步到视图
④、删除整个视图不会影响基本表
⑤、删除整个基本表会影响视图
查看表结构的两种方法:
第一种方法:
desc student;
第二种方法:
show create table student;
CREATE TABLE student (
id int(11) NOT NULL AUTO_INCREMENT,
name char(20) NOT NULL,
class char(20) NOT NULL,
score float(10,2) DEFAULT NULL,
sex char(20) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
备份表:表结构+表数据
①、先备份表结构
mysql> create table s_grade like grade;
②、在备份表数据
①、备份表中所有的数据
mysql> insert into s_grade select * from grade;
②、备份表中指定的字段数据
mysql> insert into s_grade(sid,age,name)select sid,age,name from grade;
备份数据库:
[root@localhost /]# mysqldump -uroot -p dcs73>test.sql
备注:dcs73代表的是需要备份的库、test.sql代表的是备份后存储的文件
还原数据库:
[root@localhost /]# mysql -uroot -p s_test<test.sql
备注:s_test代表的是还原的空库
关于数据库登录用户及用户权限:
1、如何查询已有的数据库登录用户及权限
①、mysql> user mysql;
②、mysql> select user,host from user;
②、如何添加登录数据库用户
第一种方法:往uesr表中插入数据
mysql> insert into user(user,host,password)values('dcs','%',password('123456'));
mysql> insert into user(user,host,password)values('dcs','localhost',password('123456'));
第二种方法:在前端注册的形式
[root@localhost /]# grant select,drop on *.* to 'zhangsan'@'localhost' identified by '123456';
关于数据库登录用户及用户权限:
1、如何查询已有的数据库登录用户及权限
①、mysql> user mysql;
②、mysql> select user,host from user;
②、如何添加登录数据库用户
第一种方法:往uesr表中插入数据
mysql> insert into user(user,host,password)values('dcs','%',password('123456'));
mysql> insert into user(user,host,password)values('dcs','localhost',password('123456'));
第二种方法:在前端注册的形式
[root@localhost /]# grant select,drop on *.* to 'zhangsan'@'localhost' identified by '123456';
2、创建用户的同时赋予所有的权限
mysql> grant all privileges on *.* to 'lisi'@'%' identified by '123456';
3、删除登录数据库用户
①、用户在前端通过注销的方式可以删除用户
②、直接删除user表中指定的用户
mysql> delete from user where user='zhansgan' and host='localhost'
备注:删除本地登录数据库用户zhangsan
4、修改数据库登录用户的密码
①、用户在前端通过页面的方式修改密码
②、直接修改user表中password字段值
mysql> update user set password=password('1234567') where user='root' and host='localhost';
5、忘记数据库登录用户密码如何处理:
①、修改数据库配置文件(/etc/my.cnf ):
在[mysqld]中加入一行:skip-grant-table
备注:加入这一行的作用是可以越过登录权限
②、修改完数据库配置文件后需要重启数据库生效:
[root@localhost /]# service mysqld restart
③、重启后直接在linux交互界面输入命令mysql则可直接登录数据库
[root@localhost /]# mysql
④、进入mysql库且修改user表中指定用户对应的password字段值
mysql> update user set password=password('123456') where user='root' and host='localhost';
⑤、刷新以下
mysql> flush privileges
⑥、退出到linux交互界面且编辑数据库配置文件取消越过登录权限这一行
⑦、重启数据库即可
6、查看数据库的指定授权用户的权限
mysql> show grants for 'wang'@'%';
7、取消所有权限
mysql> revoke all on *.* from 'dcs'@'%' ;
查询数据库版本 select version();
查询数据服务器的当前时间 select now();
查询当前使用的是哪个数据库 select database();
查询当前登录用户 select user();
1、什么是存储过程
是完成特定功能的sql语句集合,通过编译后存储在数据库中,通过指定的存储过程名称调用执行它。
存储过程=sql语句集合+控制语句
2. Mysql5.0版本后支持存储过程
3、使用存储过程的优点:
a、存储过程可以多次调用,不需要重新编写存储过程语句。===》可以多次调用
b、假如要往表中插入大量的测试数据,用insert into语法执行速 度太慢,效率较低,那么这个时候可以通过编写存储过程,把需要 插入的数据sql集合放入存储过程的函数体当中,创建存储过程, 下次即可调用。===》效率高
c、存储过程加快程序的运行速度===》速度快
d、存储过程增加sql语句的功能和灵活性、创建的存储过程可以重复使用。===》大批量的造测试数据
4、存储过程的作用===》大批量的造测试数据
drop procedure if exists duoceshiaa;
CREATE PROCEDURE duoceshiaa(n INT)
BEGIN
drop table if exists mm;
create table mm(id int(20) primary key,score int(20));
insert into mm values(1,89),(2,88);
insert into mm values(3,25),(4,67);
insert into mm values(5,89),(6,99);
insert into mm values(7,19),(8,62);
-- select * from mm;
-- select * from mm WHERE id =n;
-- 单分支举例:
if n = 0 THEN
SELECT count(*) FROM mm;
else
SELECT * FROM mm ORDER BY score desc;
end IF;
END
call duoceshiaa(98);
5、创建存储过程
drop procedure if exists #加强代码的健壮性
create procedure #存储过程名称(参数名,数据类型)
begin
存储过程体
end
call 存储过程名称(调用的数据量)
6、具体调用方法:
a、存储过程可以用来查数据
===》不用参数查数据、用参数查数据
b、存储过程可以用来造数据
if条件判断语句
单分支
if 条件 then
sql语句
else
sql语句
end if;
多分支
if 条件 then
sql语句
else if 条件 then
sql语句
else if 条件 then
sql语句
.......
end if;
end if;
end if;
存储过程:sql语句+控制语句===》可以完成特定功能
存储过程作用:造大量数据
循环语句:造数据
控制语句:判断条件是否成立的
while循环语句:什么时候进入循环、什么时候跳出循环(备注:防止进入死循环)
drop procedure if EXISTS dcs01; #增强脚本的健壮性
#判断存储dcs01是否存在、存在则删除
create procedure dcs01(n int) #创建一个存储过程且名称为dcs01
#n代表的是形参、形参可以接收实际参数
#形参的作用是为了引用到存储过程体中
begin
#sql语句+控制语句+循环语句
if n>=0 && n<=5 then
select * from emp;
else if n>=6 && n<=10 then
select * from dept;
else
select * from dept,emp where dept.dept1=emp.dept2;
end if;
end if;
#备注:有多少个if就要加多少个end if
end
call dcs01(11); #调用存储过程
#dcs01括号里面的值代表是实参
mysql:通过select进行输出的
python:通过print()进行输出的
show tables;
select * from A;
create table aa(id int,name varchar(20));
需求:先判断aa表中是否存在1000条数据、如果存在则统计除表中的结果
如果不存在则循环造1000数据。
drop procedure if EXISTS dcs02;
create procedure dcs02(n int)
begin
declare i int default(select count(id) from aa);
if i>=n then
select count(id) from aa;
else
while i
#循环体(insert into)
insert into aa values(1,'zhangsan');
set i=i+1; #跳出循环
end while;
end if;
end
call dcs02(2000)
声明一个变量且给该变量赋一个初始值
select * from aa;
31、多表查询作业:
SELECT * from dept;
SELECT * from emp;
1.列出每个部门的平均收入及部门名称;
select avg(incoming),dept_name from dept,emp where dept.dept1=emp.dept2 group by dept_name;
2.财务部门的收入总和;
求财务部门的编号?
select dept1 from dept where dept_name='财务'
select sum(incoming) from emp where dept2=(select dept1 from dept where dept_name='财务')
3.It技术部入职员工的员工号
求IT技术部门的编号
select dept1 from dept where dept_name='IT技术'
select sid from emp where dept2=(select dept1 from dept where dept_name='IT技术')
4.财务部门收入超过2000元的员工姓名
求财务的部门编号
select dept1 from dept where dept_name='财务'
select name from emp where incoming>2000 and dept2='财务的编号'
select name from emp where incoming>2000 and dept2=(select dept1 from dept where dept_name='财务')
5.找出销售部收入最低的员工的入职时间
销售部门编号?
select dept1 from dept where dept_name='销售'
求销售部的最低工资?
select min(incoming) from emp where dept2='销售部门编号'
select worktime_start from emp where incoming='销售部的最低工资' and dept2='销售部门编号'
select min(incoming) from emp where dept2=(select dept1 from dept where dept_name='销售')
select worktime_start from emp where incoming=(select min(incoming) from emp where dept2=(select dept1 from dept where dept_name='销售')
) and dept2=(select dept1 from dept where dept_name='销售')
6.求工资在7500到8500元之间,年龄最大的人的姓名及部门;
求工资7500-8500年龄最大的?
select max(age) from emp where incoming between 7500 and 8500;
select name,dept_name from dept,emp where dept.dept1=emp.dept2 and incoming between
7500 and 8500 and age='工资7500-8500年龄最大的'
select name,dept_name from dept,emp where dept.dept1=emp.dept2 and incoming between
7500 and 8500 and age=(select max(age) from emp where incoming between 7500 and 8500
)
7.列出每个部门收入总和高于9000的部门名称
求收入总和高于9000的部门编号?
select dept2 from emp group by dept2 having sum(incoming)>9000;
select dept_name from dept where dept1 in('收入总和高于9000的部门编号')
select dept_name from dept where dept1 in(select dept2 from emp group by dept2 having sum(incoming)>9000)
8.查出财务部门工资少于3800元的员工姓名
求财务部门编号
select dept1 from dept where dept_name='财务'
select name from emp incoming<3800 and dept2='财务部门编号'
select name from emp where incoming<3800 and dept2=(select dept1 from dept where dept_name='财务')
9.求财务部门最低工资的员工姓名;
select name from emp where dept2=(select dept1 from dept where dept_name='财务') and
incoming=(select min(incoming) from emp where dept2=(select dept1 from dept where dept_name='财务'));
10.找出销售部门中年纪最大的员工的姓名
求销售部门编号
select dept1 from dept where dept_name='销售'
求销售部最大年龄
select max(age) from emp where dept2=(select dept1 from dept where dept_name='销售')
select name from emp where dept2='销售部门编号' and age='销售部最大年纪'
select name from emp where dept2=(select dept1 from dept where dept_name='销售') and age=(select max(age) from emp where dept2=(select dept1 from dept where dept_name='销售')
)
11.求收入最低的员工姓名及所属部门名称:
求最低工资
select min(incoming) from emp;
select name,dept_name from dept,emp where dept.dept1=emp.dept2 and incoming='最低工资'
select name,dept_name from dept,emp where dept.dept1=emp.dept2 and incoming=(select min(incoming) from emp)
12.求李四的收入及部门名称
select incoming,dept_name from dept,emp where dept.dept1=emp.dept2 and name='李四'
13.求员工收入小于4000元的员工部门编号及其部门名称;
求emp表中工资小于4000的dept2?
select DISTINCT(dept2) from emp where incoming<4000;
select dept1,dept_name from dept where dept1 in(emp表中工资小于4000的dept2)
select dept1,dept_name from dept where dept1 in(select DISTINCT(dept2) from emp where incoming<4000
)
14.列出每个部门中收入最高的员工姓名,部门名称,收入,并按照收入降序;
求每个部门收入最高
select max(incoming),dept2 from emp group by dept2;
select name,dept_name,incoming from dept,emp where dept.dept1=emp.dept2 and (incoming,dept2) in(每个部门收入最高里面)
select name,dept_name,incoming from dept,emp where dept.dept1=emp.dept2 and (incoming,dept2) in(select max(incoming),dept2 from emp group by dept2) order by incoming desc;
15.求出财务部门收益最高的员工的姓名,工号,收益
求财务部门编号?
select dept1 from dept where dept_name='财务'
求财务部门最高工资?
select max(incoming) from emp where dept2=(select dept1 from dept where dept_name='财务')
select name,sid,incoming from emp where dept2='财务部门号' and incoming='财务部门最高工资'
select name,sid,incoming from emp where dept2=(select dept1 from dept where dept_name='财务') and incoming=(select max(incoming) from emp where dept2=(select dept1 from dept where dept_name='财务')
)
16.查询财务部低于平均收入的员工号与员工姓名;
第一种:低于所有部门的平均工资
求所有部门平均收入?
select avg(incoming) from emp;
求财务部门编号?
select dept1 from dept where dept_name='财务'
select sid,name from emp where incoming<'所有部门平均收入' and dept2='财务部编号'
select sid,name from emp where incoming<(select avg(incoming) from emp) and dept2=(select dept1 from dept where dept_name='财务')
第二种:低于自己部门的平均工资
求财务部门编号?
select dept1 from dept where dept_name='财务'
求财务部门平均收入?
select avg(incoming) from emp where dept2=(
select dept1 from dept where dept_name='财务')
select sid,name from emp where incoming<'财务部门平均收入' and dept2='财务部编号'
select sid,name from emp where incoming<(select avg(incoming) from emp where dept2=(
select dept1 from dept where dept_name='财务')) and dept2=(select dept1 from dept where
dept_name='财务')
17.列出部门员工数大于1个的部门名称;
emp表中统计出来人数大于1的部门号?
select dept2 from emp group by dept2 having count(sid)>1;
select dept_name from dept where dept1 in('emp表中统计出来人数大于1的部门号')
select dept_name from dept where dept1 in(select dept2 from emp group by dept2 having count(sid)>1)
18.列出部门员工收入不超过7500,且大于3000的员工年纪及部门名称;
select age,dept_name from dept,emp where dept.dept1=emp.dept2 and incoming>3000 and incoming<7500;
19.求入职于20世纪70年代的员工所属部门名称;
20世纪70年代的员工对应的部门编号?
select dept2 from emp where worktime_start like '197%';
select dept_name from dept where dept2 in('20世纪70年代的员工对应的部门编号')
select dept_name from dept where dept1 in(select dept2 from emp where worktime_start like '197%')
20.查找张三所在的部门名称;
求张三的部门编号?
select dept2 from emp where name='张三'
select dept_name from dept where dept1='张三的部门编号'
select dept_name from dept where dept1=(select dept2 from emp where name='张三')
21.列出每一个部门中年纪最大的员工姓名,部门名称;
每个部门最大年龄?
select max(age),dept2 from emp group by dept2;
select name,dept_name from dept,emp where dept.dept1=emp.dept2 and (age,dept2) in(每个部门最大年龄)
select name,dept_name from dept,emp where dept.dept1=emp.dept2 and (age,dept2) in(select max(age),dept2 from emp group by dept2)
22.列出每一个部门的员工总收入及部门名称;
select sum(incoming),dept_name from dept,emp where dept.dept1=emp.dept2 group by dept_name;
23.列出部门员工收入大于7000的部门号,部门名称;
收入大于7000的员工对应的部门号?
select DISTINCT(dept2) from emp where incoming>7000;
select dept1,dept_name from dept where dept1 in('收入大于7000的员工对应的部门号')
select dept1,dept_name from dept where dept1 in(select DISTINCT(dept2) from emp where incoming>7000)
24.找出哪个部门还没有员工入职;
select dept_name from dept left JOIN emp on dept.dept1=emp.dept2 where sid is null;
select dept_name from emp RIGHT JOIN dept on dept.dept1=emp.dept2 where sid is null;
select dept_name from dept where dept1 not in(select dept2 from emp);
25.先按部门号大小排序,再依据入职时间由早到晚排序员工信息表 ;
select * from emp order by dept2 desc,worktime_start;
26.找出年龄小于平均年龄的员工的姓名,ID和部门名称
select name,sid,dept_name from dept,emp where dept.dept1=emp.dept2 and age<(select avg(age) from emp)
27.查出大于自己部门平均工资的员工编号及部门名称;
1、先求出每个部门的平均工资
select avg(incoming)a,dept2 as b from emp group by dept2;
select * from emp;
select * from emp,(select avg(incoming)a,dept2 as b from emp group by dept2)t where emp.dept2=t.b and emp.incoming>t.a
select sid,dept_name from dept,(select * from emp,(select avg(incoming)a,dept2 as b from emp group by dept2)t where emp.dept2=t.b and emp.incoming>t.a
)k where dept.dept1=k.dept2