什么是mysql
MySQL是一种开源的关系型数据库管理系统,使用“结构化查询语言(sql)”进行数据库管理。
MySQL由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。
MySQL是最流行的关系型数据库管理系统之一。
MySQL是一种关系型数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的SQL结构化查询语言是用于访问数据库的最常用标准化语言。
MySQL软件采用了双授权政策,分为社区版和企业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
虽然我们可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
使用关系型数据库管理系统来存储和管理大数据量,会让这一切变得更简单。
mysql的标志是一只海豚,如下图
复制代码
mysql的配置文件
1/如果是linux系统
配置文件是/etc目录下的my.cnf文件,在[mysqld]段或者mysql的server配置段进行修改
复制代码
2/如果是windows系统
配置文件是my.ini文件,在[mysqld]段或者mysql的server配置段进行修改
复制代码
3/查询mysql系统配置文件中的参数
我们可以到具体的配置文件中去看,当然也有一些命令,使得我们可以直接看到我们想知道的参数
show variable like '%xxxxssss%';
例如:
show variables like '%secure%';
查看所有含有secure的参数,例如 secure-file-priv 当前的值是什么
复制代码
4/修改配置文件中的参数
set global 参数名=xxx
修改完配置文件之后要重启mysql服务,这样才能生效
复制代码
mysql服务的重启/关闭
service mysql start # 启动
service mysql stop # 停止
service mysql restart # 重启
service mysql status # 查看mysql服务的状态
注意:上面4条命令中,到底是mysql还是mysqld,这个取决于你配置的service的名字,不要太纠结名字。
cp support-files/mysql.server /etc/init.d/mysql (mysql 这个是以后服务启动时的名称)
复制代码
如何登陆mysql数据库
mysql -h host -u user -ppassword -p database -P port
需要注意的是:
# -h参数可以不写,因为默认就是本地的数据库,也就是localhost,-h和host之间必须有空格
# -u参数,指的是用户名,-u与用户名之间必须有空格
# -p参数,指的是密码,与password之间不能有空格,否则报错:Access denied for user xxxx to database
# -P参数,大写的字母P,指的是端口号port,可以不写
# -p参数后面如果有空格,则该参数代表的是数据库名,可以不写
如果同时存在 -p密码 -p 数据库名 需要注意先后顺序 测试发现
正确:
mysql -u root -p mysql -p123456 # 数据库名称在前面,密码在后面
错误:
mysql -u root -p123456 -p mysql
复制代码
修改mysql的登陆密码
<1>首先要知道mysql的密码制定策略,通过 show variables like 'validate_password%'命令查看
复制代码
<2>从上图中可以知道:
密码要求长度是8位,(默认长度就是8位)
密码的验证强度等级是medium(一共有3个等级low,medium,strong);
<3>从上图可以看到,当前要求密码长度是8位,如果不介意就可以不用修改了。
如果想修改,用set global validate_password_length=6
复制代码
<4>可以修改密码的验证强度
通过set global validate_password_policy=LOW; 命令进行修改
<5>最后可以修改mysql的登录密码了
通过ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';命令进行修改。
<6>关于mysql密码策略相关参数的介绍;
validate_password_length: 固定密码的总长度
validate_password_dictionary_file: 指定密码验证的文件路径,可不填写
validate_password_mixed_case_count: 整个密码中至少要包含大/小写字母的总个数;
validate_password_number_count: 整个密码中至少要包含阿拉伯数字的个数;
validate_password_policy: 指定密码的强度验证等级,默认为 MEDIUM;
validate_password_special_char_count: 整个密码中至少要包含特殊字符的个数;
<7> 关于validate_password_policy的取值:
0/LOW:只验证长度;只要长度跟validate_password_length要求的一样即可。
1/MEDIUM:验证长度、数字、大小写、特殊字符;
2/STRONG:验证长度、数字、大小写、特殊字符、字典文件;
复制代码
mysql查看用户
查看所有用户
在MySQL中有一个内置名为mysql的数据库,
这个数据库中存储的是MySQL的一些数据,比如用户、权限信息、存储过程等。
所以我们可以通过如下查询语句来查看所有用户。
mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
mysql> SELECT User, Host, Password FROM mysql.user;
mysql> SELECT DISTINCT User FROM mysql.user;
复制代码
查看当前登陆用户
mysql> SELECT user();
mysql> SELECT current_user();//括号可以不要
复制代码
where语句中的and,or,in, not in
and: and两边的条件必须同时满足
or:or两边的条件满足其中一个就可以
in: 必须是()括号,不能使[]括号,,建议能使用in的就不要使用or,因为in性能更好,也方便理解。
not in : 同上。
注意:
在同时有and和or语句存在情况下,mysql是优先处理and语句的。一般用()来确定处理的顺序和消除歧义。
复制代码
mysql常用命令
<1>登录数据库:
mysql -u xxx -pxxx # -u 用户名 -p 密码
<2>显示所有已经存在的数据库:
show databases;
<3>进入到某个数据库
use db_name;
<4>显示目前所处的数据库中所有已经存在的表:
show tables;
<4>创建新的数据库,同时规定数据库的编码格式
CREATE DATABASE dbname DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
<5>创建数据表,同时规定编码
CREATE TABLE 'author' ('authorid' char(20) NOT NULL,'name' char(20) NOT NULL,'age' char(20) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1;
<6>查看表的全部数据
select * from 表名;
<7>查看某几个字段的数据
select id,name,age,first_dpt_name from 表名;
<8>查看某张表共有哪些字段
show columns from 表名;
<9>在table中插入记录
insert 表名 (id,name) values (007,'xxx')
<10>退出mysql
exit
<11>查看表中某一列的数据类型
SELECT CHARSET(email) FROM tablename;
<11>alter的用法
alter table 旧的表名 rename 新的表名; #修改表名
alter table xxx change column 旧列名 新列名 varchar(30) # 修改列名
alter table xxx add column name varchar(10); #添加列
alter table xxx drop column name; #删除列
alter table xxx modify address char(10) #修改列类型
<12>修改数据库/数据表的编码
更改数据库编码:ALTER DATABASE caitu99 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
更改表编码:ALTER TABLE tbtest CONVERT TO CHARACTER SET utf8mb4 COLLATEutf8mb4_general_ci;
更改表编码:alter table tbtest character set utf8mb4 COLLATE utf8mb4_general_ci;
修改列编码:ALTER TABLE tbtest MODIFY email VARCHAR(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
<13>删除表数据,保留表结构
truncate table kuaishou_spider_df_temp;
<14>删除表中的某些满足条件的行数据
delete from table_name where course_id=4;
<15>修改表中的数据
update table_name set 字段 = xxx # 没有条件,也就是把整张表都修改字段为xxx
update table_name set 字段 = xxx where 字段 = xxx # 有条件修改,也就是把满足条件的行进行修改
update table_name set 字段1 = xxx, 字段2 = xxx where 字段 = xxx # 可以一次性修改多个数据,用逗号隔开
<16>create table table2 select * from table1;
# 创建表2,同时拷贝表1的数据和结构到表2
<17>insert into table2 select * from table1;
# 把表1的数据和结构,拷贝到表2,前提是表2是存在的,不然会报错
<18>show columns from table_name;
# 显示表中的所有字段名称,也可以使用desc tablename命令
<19>只修改列的数据类型,不修改列名
通常可以写成 alter table 表名 modify column 列名 新的列的类型
例如:student表中列sname的类型是char(20),现在要修改为varchar(20),SQL语句如下
alter table student modify column sname varchar(20);
<20>同时修改列名和列的数据类型的方法
通常可以写成 alter table 表名 change column 旧列名 新列名 新的列数据类型
例如:basic_df表中列sname的类型是char(20),现在要修改为stuname varchar(20),
SQL语句如下:
alter table basic_df change column sname stuname varchar(20);
<21> drop truncate delete 三者的区别
drop table 表名
删除表结构,删除表数据,即把表所占用的全部空间都释放掉,一点不留,
是最彻底的删除方式,但是一定要谨慎
truncate table 表名
保留表结构,删除表数据,同时也会把index索引内容删除,但是索引名称会保留,等之后往表中插入数据的时候,索引内容会自动添加上,无需再设置索引。
当表被truncate之后,这个表和索引所占用的空间会恢复到初始大小
该命令是一次性删除表中所有的数据,不会把删除操作记录在日志中,
数据是不能恢复的,执行速度快
delete from 表名
保留表结构,删除表数据,不会对index清空,
DELETE操作不会减少表或索引所占用的空间。
该命令是一行一行的删除数据,同时会把删除操作记录在日志中,日后可以回滚恢复。
但是删除速度比较慢,如果是删除大量数据的话,不建议使用该命令
也就是说:drop是删除表,truncate和delete是删除表中的数据,
另外truncate和delete的区别是:
truncate是一下子删除所有的数据,delete是一条一条的删除数据
<22>desc tablename # 表结构查询,desc 是Describe的缩写
<23> 添加一列,并设置为主键,自增
# 添加列,并设置为主键自增
alter table table_name add id bigint primary key auto_increment;
<24>删除数据库
drop database 数据库名;
<25>修改数据库名称
没有直接修改数据库名称的命令,但是可以间接的实现
可以先创建一个新的数据库,然后把表复制到新的数据库中,最后把原来的数据库删除掉
<26>在数据表中,删除满足一定条件的数据
删除数据是一个需要很谨慎的事情,因此一定要先想清楚之后再操作
delete from table_name where xxxx
如果没有后面的where语句,则整个表的数据都会被删除掉,因此一定要加上where语句
<27>查看mysql命令
1/查看mysql正在执行的进程命令
SELECT * FROM information_schema.PROCESSLIST;
2/查看正在进行的线程命令
show processlist;
3/杀掉某个进程
kill thread_id;
<28>查看表中的索引情况
show index from table_name
复制代码
把服务器中的文件推到数据库中
命令如下:
load data local infile '/root/houzhen03/xxx' into table xxx fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\n';
命令中的参数解释:
<1> fields terminated by ',' # 文件中字段之间用逗号分隔
<2> optionally enclosed by ‘字段包围符’ # 就是value可能是被某中富豪包围着的
<3> lines terminated by '\n' # 行与行之间的分隔符
复制代码
数据库文件的导入/导出
<1> secure_file_priv参数用于限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()传到哪个指定目录。因为 secure_file_priv 参数是只读参数,不能使用set global secure_file_priv=''; 命令
<2> secure-file-priv为NULL时,表示限制mysqld不允许导入或导出。
例如:secure-file-priv为/var/lib/mysql-files/时,表示限制mysqld只能在/var/lib/mysql-files/目录中执行导入导出,其他目录不行。
<3> secure-file-priv没有值时,表示不限制mysqld在任意目录的导入导出。
复制代码
char和varchar的区别
<1> char类型的长度是固定的,varchar的长度是可变的,是可以缩放的
varchar比char更加灵活,但是char比varchar更加高效
<2> 存储字符串'abc',
使用char(10),表示存储的字符将占10个字节(包括7个空字符,会自动填充7个空格)
使用varchar2(10),则表示只占3个字节,10是最大值,当存储的字符<=10时,按照实际的长度存储,如果>10,那么将会被截取
<3> char类型的效率比varchar的效率稍高
<4> 从存储空间的角度讲,因为插入类型数据的长度固定,有时候需要用空格进行占位,所以存储数据时占用更大的空间。而varchar却不会。char是以空间换取时间效率,而varchar是以空间效率为首位的。
<6> char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。
<7>在MySQL中,char、varchar和text类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以(text的最大存储长度是65535,如果value的长度大于这个数,在存储的时候,就会被截取)。数据的检索效率是:char > varchar > text
<8>总结起来,有几点:
知道固定长度的用char
经常变化的字段用varchar
尽量用varchar
超过255字符的只能用varchar或者text
能用varchar的地方不用text
复制代码
bigint和int的区别
汇总:bigint的取值范围要比int的取值范围大
使用bigint,会占用更大的磁盘和内存空间,内存空间毕竟有限,无效的占用会导致更多的数据输入输出,额外增加了IO的压力,对性能是不利的。
因此推荐自增主键时使用int unsigned类型,但不建议使用bigint。
复制代码
在mysql中,like 怎么用?
dataframe = calls.get_data_from_db("select xxx, xxx from table where 等级 like 'A%'", "raw_db")
这里是筛选等级是以A开头的,如果是包含A的,就是‘%A%’,如果是以A结尾的,就是‘%A’
11/遇到问题:sqlalchemy.exc.DataError: (pymysql.err.DataError) (1406, "Data too long for column 'global_network' at row 25")
在插入MySQL的字符太多,此时将MySQL的模式改为非严格模式。
MySQL中运行:mysql> SET @@global.sql_mode= ‘’;
12/ distinct 用法
select distinct 列名 from table; # 查看某列一共有多少值,去重之后
select distinct(列名) from table;
13/ drop table if exists table_name;
# 如果表存在,就删除
复制代码
MySQL的变量分为以下两种
1/系统变量:
配置MySQL服务器的运行环境
系统变量按其作用域的不同可以分为以下两种:
<1>会话(SESSION或LOCAL)级:只影响当前会话
<2>全局(GLOBAL)级:对整个MySQL服务器有效
<3>量同时拥有以上两个级别
MySQL将在建立连接时用全局级变量初始化会话级变量,
但一旦连接建立之后,全局级变量的改变不会影响到会话级变量。
<4>查看系统变量的值
可以通过show vairables语句查看系统变量的值:
show variables like 'log%';
show variables where Variable_name like 'log%' and value='ON';
注意:show variables优先显示会话级变量的值,如果这个值不存在,则显示全局级变量的值,当然你也可以加上GLOBAL或SESSION关键字区别:
show session/local variables;
show global variables;
<5>设置和修改系统变量的值
在MySQL服务器启动时,有以下两种方法设置系统变量的值:
1)命令行参数,如:mysqld --max_connections=200
2)选项文件(my.cnf)
在MySQL服务器启动后,如果需要修改系统变量的值,可以通过SET语句:
SET GLOBAL var_name = value;
SET @@GLOBAL.var_name = value;
SET SESSION var_name = value;
SET @@SESSION.var_name = value;
如果在变量名前没有级别限定符,表示修改会话级变量。
注意:和启动时不一样的是,在运行时设置的变量不允许使用后缀字母'K'、‘M'等,但可以用表达式来达到相同的效果,如:
[sql]
SET GLOBAL read_buffer_size = 2*1024*1024 # 修改全局变量的值
这里一个容易把人搞蒙的地方是:
如果查询时使用的是show variables的话,会发现设置好像并没有生效,
这是因为单纯使用show variables的话就等同于使用的是show session variables,查询的是会话变量,
只有使用show global variables,查询的才是全局变量。
网络上很多人都抱怨说他们set global之后使用show variables查询没有发现改变,原因就在于混淆了会话变量和全局变量,
如果仅仅想修改会话变量的话,可以使用类似set wait_timeout=10;
或者set session wait_timeout=10;这样的语法。
复制代码
2/状态变量
监控MySQL服务器的运行状态,可以用show status查看
状态变量可以使我们及时了解MySQL服务器的运行状况,可以使用show status语句查看。
状态变量和系统变量类似,也分为全局级和会话级,
show status也支持like匹配查询,
和系统变量比较大的不同是:
状态变量只能由MySQL服务器本身设置和修改,
对于用户来说是只读的,不可以通过SET语句设置和修改它们。
SQL:有一个视频文件播放次数表table1
dist_id string '区组ID',fid string '视频文件ID',vv bigint '播放次数,
SQL查询各自区组的播放次数排名前十的视频文件ID(分组取前10)
select dist_id,fid,vv from (
select dist_id,fid,vv,row_number() over(partition by dist_id order by vv desc) as rn from table1) as t where rn <= 10
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END