广州37期_罗子鹏 发表于 2021-12-17 18:59:27

第十一天笔记

珠海工行必问SQL题
现在有个科目表,里面只有两个字段:姓名、科目
求:表中选择科目大于两个科目的学生姓名
select 姓名 from 表 group by 姓名 having count(科目)>2

----------------------------------------------------------------------
数据库权限操作

设置mysql管理员密码的命令:
在Linux系统==》mysqladmin -uroot password "123456"

在mysql数据库管理系统查询网络位置/用户/密码
select host,user,password from user;
host 网络位置权限
localhost、127.0.0.1、本地的IP都是本地的网络权限
其他用户是连不上我们自己的mysql数据库的
如果要远程连接则要有一个有%权限(任意网络位置)的用户才可以操作

1.进入mysql库
   use mysql;
2.查询当前mysql 用户
   select host,user,password from user;
3.往user表插入host(网络权限位置)为localhost,user(用户名)为dcs37,password(密码)为通过password方法加密123456
   insert into user(host,user,password) values('localhost','dcs37',password('123456'));
创建密码要用password方法对密码进行加密
登录时,mysql程序默认使用password方法对我们输入的密码进行加工,然后和数据库中的密码进行匹配,相同即可登录成功
4.添加完成后需要进行刷新权限
   flush privileges;
任何对mysql的权限操作都要使用该语句刷新
5.赋予权限
grant select,delete,update,insert,create on *.* to 'dcs37'@'localhost' identified by '123456';
赋予权限在(*.*) 所有库里所有的表给在localhost的dcs37
鉴权方式为123456
赋予权限后也要刷新权限
重新被赋权用户需重新登录才有被赋予权限

--------------------------------------------------------------
赋予权限的操作是可以直接创建用户的;

创建一个root用户
赋予所有权限
在所有库所有表
’root‘@’%‘==》%任意网络位置/远程权限,具有远程操作权限的root用户
鉴权方式(登录密码)为123456
grant all privileges on *.* to 'root'@'%'identified by '123456';
完成后刷新
--------------------------------------------------------------
查看指定用户的权限情况
show grants for '用户'@'网络位置';

取消指定用户的权限
revoke all on *.* from '用户'@'网络位置'

删除用户:
delete from user where user='用户' and host='网络位置';

修改密码:
update user set password=password('新密码') where user='用户' and host='网络位置';
--------------------------------------------------------------
数据库连接工具
Navicat、DBeaver、

Navicat5.1.73连接mysql步骤:
1.在mysql中创建一个'root'@'%'的用户
2.打开Navicat,创建链接,填写对应的数据库服务器信息,以及root@%用户的信息

中文乱码——编辑连接——高级——编码选择最后一个65001(utf-8)
连接后右键编辑数据库——常规——字符集选择utf8
不行关了重启Navicat重新修改(未必成功)
---------------------------------------------------------------------
注释:被注释的内容不会被程序执行 # 或者‘--’
          #号那一行后面所有内容都不会被执行,单行
          ctrl+/快速注释或取消
多行注释/*   多行内容
                  多行内容*/
注释未保存下次会被取消
-------------------------------------------------------------------
运行:Ctrl+R运行
          选择部分片段运行
结束要分号
最后一句可以不用分号
------------------------------------------------
1.内连接 inner join
对两个表当中有字段的值相同就可以通过内连接对表进行拼接
select * from aa inner join cc on aa.id=cc.sid;
select * from 表1 inner join 表2 on 表1.字段1=表2.字段2;
字段1与字段2有相同的值

select * from 表1 join 表2 on 表1.字段1=表2.字段2;
内连接简写

2.左连接 left join 以左边表为主
显示完整的左边表,右边表出现满足条件的数据
                                       右边不符合显示为null
select * from aa left join cc on aa.id=cc.sid;
select * from 表1 left join 表2 on 表1.字段1=表2.字段2;

3.右连接 right join 以右边表为主
显示完整的右边表,左边表出现满足条件的数据
                                       左边不符合显示为null
select * from aa right join cc on aa.id=cc.sid;
select * from 表1 right join 表2 on 表1.字段1=表2.字段2;

4.基本连接 对多张表(两张以上)
多张表当中有字段的值相同
select * from 表1,表2,表3 where 表1.字段1=表2.字段2 and 表1.字段1=表3.字段3
结果和内连接一样,语法上有区别
(on变为where,不用join,后为and 表1跟表3的字段等式)

5.硬连接(机械连接)
拼接表的字段数目必须要一致,做到上拼接
select * from 表1 union select *from 表2;

select * from aa union select *from cc;
select * from aa union select sid,name from grade;

--------------------------------------------------------------------------
题目:求出zhangsan的成绩
条件:姓名为zhangsan 结果:成绩
1.内连接 左连接 右连接 基本连接(拼完后当做单表查询)
select * from aa inner join cc on aa.id=cc.sid where aa.name='zhangsan';
select cc.score from aa left join cc on aa.id=cc.sid where aa.name='zhangsan';
select cc.score from cc right join aa on aa.id=cc.sid where aa.name='zhangsan';
select cc.score from aa,cc where aa.id=cc.sid and aa.name='zhangsan';

2.字句查询
已知zhangsan在aa表中
可以求出zhangsan的id,供cc表获取对应sid的成绩
(1)通过aa表求出张三的id
select id from aa where name='zhangsan'
(2)求出张三的id的SQL语句作为条件去使用,放到cc表使用
select score from cc where sid= (select id from aa where name='zhangsan')
只能求一个值
select score from cc where sid in (select id from aa where name='zhangsan')
in方法,可以同时求多个值
‘in’的性能比‘=’稍差

3.子表查询(临时表)
(1)先获取到一张表
select * from aa,cc where aa.id=cc.sid ==》临时表
(2)对临时表进行查询
select score from (select * from aa,cc where aa.id=cc.sid) as t1 where t1.name='zhangsan'
-------------------------------------------------------------------------------
题目:求出谁没参加考试
条件:score 成绩为空 结果:谁 name
方法一:先拼
select aa.name from aa left join cc on aa.id=cc.sid where cc.score is null

方法二:字句查询
1.先求有分数sid
select sid from cc;
2.在aa表求不在有分数的id里面的同学
select name from aa where id not in(select sid from cc;);

方法三:临时表
1.建临时表
select * from cc right join aa on aa.id=cc.sid;
2.求临时表内成绩为空的人名
select name from (select * from cc right join aa on aa.id=cc.sid;) t1 where score is null;


页: [1]
查看完整版本: 第十一天笔记