数据分析 NO.2 SQL与MYSQL进阶

内容:SQL与MYSQL进阶

分组计算:
group by
having 是分组后过滤,where是分组前过滤 用法相同

子查询:
嵌套在其他查询中查询
用法:1 子查询在where里面做过滤 (也可以做表直接使用)2 作为计算字段使用
1

select district from world.city where disrtict in
(select countrycode from world.city where population >= 100000)
或
select a.district from (select district ,countrycode from world.city) a;

2

select id,name,countrycode,(select name from world.city where world.country.code=world.city.countrycode) as b;

连接表:
inner join 取交集
left join 左边是主表,共有部分选取出来,然后主表的都选取出来
right join 相反
一次只能针对两张表join,

outjoin : 目前个人理解,交集取1份,然后两边没有的也要选出来。

组合查询:
union 规则:
必须由两条或者两条以上的select语句组成,语句之间用union分隔
union中的每个查询必须包含相同的列,表达式或聚集函数
列数据类型必须兼容
union 会自动去重,不需要使用 union all
工作中: 速度快
EX:

select 	countrycode,sum(population) from world.city group by countrycode  
union 
select code,population from world.county
union

union可以多个使用
order by 只能用在最后的语句
数值可以变成字符,字符不能变成数值。

表的创建和操作:
存表的时候,不允许有相同的列名
EX: create table if not exists world.XXX
AS 下面跟代码

删除表:drop table if exists XXX

创建一个表:(一般就不做修改了,因为删除丢掉是不可逆的)
创建一个表 create table XXX
定义列名数据类型,设置主键(ps.主键可以是多个组合,也可以不用主键)(
name char
primary key (id)

插入数据
insert into
select
from

更新和删除表:(建议创建表的时候就考虑好表结构,MYsql 不可逆)
alter 修改
EX:
alter table world.country modify column population bigint 把表中population数据类型变成bigint
alter更改是创建一个新的一行,然后往里面填数据

alter table world.test
add new_name char(80);

alter table world.test
drop id   删除了id这一行

update,delete 不可逆,最好结合where,要不就是对所有的行操作了!

update world.test
set population=0 
where
id=129

update world.test
set new_name=1
where new_name is null

delete  from world.test
where new_name is null

drop 是删除表,delete是删除记录但是表还在

null值既不是空值也不是0 所以使用 is null 和is not null
null会被忽略计算

创建表的时候可以在定义数据类型
id int not null

select * from world where name is null 

SQL随堂练习:
在这里插入图片描述

SELECT 性别,sum(历史成功借款金额) 总成功借款金额,sum(历史成功借款次数) 总成功借款次数 
FROM 拍拍贷.LC
group by 性别

结果显示
在这里插入图片描述

select 初始评级,sum(历史逾期还款期数) 总逾期次数 from 拍拍贷.LC
group by 初始评级

在这里插入图片描述

关于使用Navicat和python进行数据库的创建和插入
首先安装Mysql数据库,使用Navicat进行连接,可以直接在Navicat类似可视化的创建数据库(点点点),当然也可以用mysql进行创建。

sql = "
create database school;#创建school的数据库


use school;#使用数据库


CREATE TABLE IF NOT EXISTS `school_teacher`(  #创建school_teacher的表
   `id` INT UNSIGNED AUTO_INCREMENT,      #定义id为无符号型,自增
   `name` VARCHAR(100) NOT NULL, #定义name为字符型(所允许保存的最大长度为100)(最大长度255)  不允许为空
   `zhuanye` VARCHAR(40) NOT NULL,#定义name为字符型(所允许保存的最大长度为40)(最大长度255)  不允许为空
   `submission_date` DATE, #获取日期
   PRIMARY KEY ( `id` )#设置id为主键
)
ENGINE=InnoDB DEFAULT #设置数据库引擎
CHARSET=utf8;#设置编码方式
"

insert into school_teacher(id,name,zhuanye,date)value("xiaoming","dianxin",now()) #插入数据,由于id可以自增,因此可以不设置

注:创建 MySql 的表时,表名和字段名外面的符号 ` 不是单引号,而是英文输入法状态下的反单引号,也就是键盘左上角 esc 按键下面的那一个 ~ 按键

关于使用python进行数据库(Mysql)的操作主要使用python的pymysql包(如果数据库是SQL Serve则使用户pymssql在这不座介绍)
其中比较常用的方法列出,更全的方法可参考官方文档或者谷歌
.connect(
host =
user =
password =
database =
port =
charset = “utf-8”
)#连接数据库

connection对象支持的方法:
.cursor()使用该连接并返回游标
.commit()提交当前事务
.close()关闭连接

cursor对象支持的方法:
.execute(sql)执行一个数据库的命令
.fetchall()获取结果集中的所有行 (获取的是一个元祖)
.close()
cursor对象属性
.description 获取列名

desc = cursor.description
print("%s %3s" % (desc[0][0], desc[1][0]))
import pymysql
conn = pymysql.connect(
host = 'lochost',
user = 'sa',
password = 'admin',
database = "school"
port = 3306
charset = "utf-8"
)
cur = conn.cursor()
name = "xiaoming"
age = 18
gender = "male"
project = "math"
sql = 'insert into teacher(name,age.gender,project)value("%s",%s,"%s","%s")'%
(name,age,gender,project)
sql = 'update teacher set gender = "female" where name ='xiaoming''
cur.execute(sql)
conn.commit()
cur.close()
conn.close()

以上sql代码中如果外部传入数据进去,查询需要是字符型的话需要添加转移符 "

a = "20200807"
b = "车载产品线"
# c = (a,b)
sql = """update inform.d_xuqiu
         set 需求来源 = \"%s\"
         where 需求编号 = \"%s\"
            """%(a,b)

将数据库和Web项目部署在服务器Tomcat
首先要在Linux服务器上面装一个MysqlLinux安装mysql的方法,然后数据通过Navicat传输上去,
具体可以参考服务器到部署Web项目到Tomcat

mysql在表的某一位置增加一列、删除一列、修改列名

如果想在一个已经建好的表中添加一列,可以用以下代码:

alter table 表名 add column 列名 varchar(20) not null;

这条语句会向已有的表中加入一列,这一列在表的最后一列位置。如果我们希望添加在指定的一列,可以用:

alter table 表名 add column 列名 varchar(20) not null after user1;

注意,上面这个命令的意思是说添加addr列到user1这一列后面。如果想添加到第一列的话,可以用:

alter table 表名 add column 列名 varchar(20) not null first;


将表yusheng中,列名def改为unit

alter table yusheng change  def unit char;


将表yusheng中,列名def的列删除

alter table yusheng drop column def ;

复制tablecreate table 新表名(
select ID,name,number,numberid
from 要复制的表名);


查看表的各种数据类型
describe `student`


查看表的已存数据
select * from 表名 (select id,name,number,numberid from 表名)


添加数据
insert into 表名 (ID,name,number,numberid) values(1,'Logic',220,1),(2,'HTML',160,1),(3,'Java OOP',230,1);


删除数据
delete from 表名 where 条件;


修改数据
update 表名 set numberid=2 where 条件


降序排列
select id,name,number,numberid from 表名 order by id desc;


添加别名
select id(列名) '别名' ,(列名) as '别名' from 表名;

查询某个数据库里所有的表
1.查询所有数据库
show databases;

2.查询指定数据库中所有表名
select table_name from information_schema.tables where table_name='database_name' and table_type='base table';

3.查询指定表中的所有字段名
select column_name from information_schema.columns where table_schema='database_name' and table_name='table_name';

4.查询指定表中的所有字段名和字段类型
select column_name,data_type from information_schema.columns where table_schema='database_name' and table_name='table_name';


<think>好的,我现在要帮助用户了解MySQL的高级用法和技巧。首先,我需要回想一下用户提供的系统级指令,确保回答符合格式要求,比如行内数学表达式用$...$,独立公式用$$...$$,并且正确使用中文。另外,用户要求生成相关问题,并在引用处添加标识。 用户明确提到想学习MySQL高级用法,所以我要从索引优化、事务并发控制、存储引擎、备份恢复、性能调优等方面入手。需要参考用户提供的引用内容,特别是引用[1]和[2]提到了MySQL的最佳实践和在线备份机制,可能涉及并发、缓冲池效率等高级主题。 首先,索引优化部分,可以讲B+树结构,联合索引的最左匹配原则,以及覆盖索引。这里可能需要用数学公式说明索引选择性的计算,比如选择性=不同值数/总行数,用$...$格式包裹。 接下来是事务隔离级别,要解释ACID特性,不同隔离级别解决的问题,比如脏读、不可重复读、幻读。这部分可以引用InnoDB的MVCC机制,但用户提供的引用中没有直接提到,可能需要依赖自己的知识,但如果有引用内容相关,比如引用[2]提到并发处理,可以结合说明。 存储引擎对比,需要比较InnoDB和MyISAM的不同,比如事务支持、锁粒度等。这部分用户引用中可能没有直接信息,但引用[1]提到了最佳实践,可能涉及存储引擎的选择建议。 备份恢复方面,用户引用[2]提到了在线备份的实现机制,可以讨论物理备份和逻辑备份的区别,以及如何利用mysqldump或XtraBackup进行热备份。这里需要强调备份时的注意事项,比如锁表问题,可以参考引用[2]中的内容,添加引用标识。 性能调优部分,需要涉及参数调整,比如innodb_buffer_pool_size的设置,连接数配置,以及慢查询日志分析。引用[1]中的最佳实践可能包括这些内容,所以可以引用相关建议。 另外,高级特性如窗口函数、CTE、JSON处理,这些是MySQL 8.0的新功能,用户可能感兴趣。需要给出示例查询,比如使用ROW_NUMBER()的窗口函数,或者JSON_EXTRACT函数,这部分可能需要代码块展示。 生成的相关问题需要围绕这些高级主题展开,比如索引优化策略、事务隔离级别的影响、存储引擎选择、备份工具比较、性能调优参数等。确保每个问题都能引导用户深入学习的某个方面。 最后,检查引用标识是否正确添加,比如在备份部分引用[2],其他部分如果有对应的引用内容也要正确标注。确保没有使用用户未提供的引用,比如引用[3]和[4]是关于Coil和嵌套if语句的,可能MySQL无关,所以可能不需要引用这些。 总结,回答结构要清晰,分点列出各个高级主题,每个主题下有详细说明和示例,最后生成相关问题。同时注意所有格式要求,如代码块使用反引号,数学公式正确应用,引用标识自然添加。</think>### MySQL高级用法技巧详解 #### 1. **索引优化执行计划** - **B+树索引结构** MySQL默认使用B+树索引,其查询复杂度为$O(\log n)$。通过`EXPLAIN`命令可分析查询计划,重点关注`type`(访问类型)和`rows`(预估扫描行数)字段。 **示例**: ```sql EXPLAIN SELECT * FROM users WHERE age > 30; ``` 若发现`type=ALL`(全表扫描),需添加索引: ```sql ALTER TABLE users ADD INDEX idx_age (age); ``` - **联合索引的最左匹配原则** 对于联合索引`(a, b, c)`,仅支持以下查询条件使用索引: - `WHERE a=1` - `WHERE a=1 AND b=2` - `WHERE a=1 AND b=2 AND c=3` 若跳过`a`直接使用`b`或`c`,索引失效[^1]。 - **覆盖索引优化** 当查询字段全部包含在索引中时,无需回表: ```sql SELECT a, b FROM table WHERE c=5; -- 若存在索引(c, a, b) ``` #### 2. **事务并发控制** - **隔离级别问题** MySQL支持四种隔离级别,默认`REPEATABLE READ`。使用以下语句修改: ```sql SET TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` | 隔离级别 | 脏读 | 不可重复读 | 幻读 | |------------------|------|------------|------| | READ UNCOMMITTED | ✔️ | ✔️ | ✔️ | | READ COMMITTED | ✖️ | ✔️ | ✔️ | | REPEATABLE READ | ✖️ | ✖️ | ✔️ | | SERIALIZABLE | ✖️ | ✖️ | ✖️ | - **死锁检测处理** 通过`SHOW ENGINE INNODB STATUS`查看死锁日志,优化事务顺序或使用`SELECT ... FOR UPDATE NOWAIT`。 #### 3. **存储引擎对比** | 特性 | InnoDB | MyISAM | |-------------------|----------------------|----------------| | 事务支持 | ✔️ | ✖️ | | 行级锁 | ✔️ | ✖️(表锁) | | 外键 | ✔️ | ✖️ | | 崩溃恢复 | ACID兼容 | 需手动修复 | | 全文索引 | ✔️(MySQL 5.6+) | ✔️ | #### 4. **在线备份恢复** - **物理备份 vs 逻辑备份** - 物理备份(如`Percona XtraBackup`):直接复制数据文件,速度快,适合大规模数据[^2]。 - 逻辑备份(如`mysqldump`):生成SQL语句,兼容性好但速度慢。 ```bash mysqldump -u root -p --single-transaction database > backup.sql ``` #### 5. **性能调优参数** ```ini # my.cnf配置示例 innodb_buffer_pool_size = 80% of total RAM max_connections = 500 slow_query_log = 1 long_query_time = 1 ``` #### 6. **高级SQL特性** - **窗口函数(MySQL 8.0+)** ```sql SELECT name, salary, ROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC) AS rank FROM employees; ``` - **通用表表达式(CTE)** ```sql WITH cte AS (SELECT * FROM table1 WHERE col1 > 100) SELECT * FROM cte JOIN table2 ON cte.id = table2.id; ``` - **JSON数据处理** ```sql SELECT JSON_EXTRACT(data, '$.user.name') FROM logs WHERE id=1; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值