时间:2021-07-01 10:21:17 帮助过:7人阅读
mysql常用参数:
-u? ? ? ? ? ? ?用户
-p? ? ? ? ? ? ?密码
-h? ? ? ? ? ? ?IP
-P? ? ? ? ? ? ?端口
-S? ? ? ? ? ? ?socket文件
-e? ? ? ? ? ? ?免交互执行命令
<? ? ? ? ? ? ? 导入SQL脚本
例子:
[root@db01 ~]# mysql -uroot -p -e "show databases;"
结构化的查询语言
关系型数据库通用的命令
遵循SQL92的标准(SQL_MODE)
DDL 数据定义语言 ???? create 和 drop
DCL 数据控制语言 grant 和 revoke
DML 数据操作语言 insert update 和 delete
DQL 数据查询语言???? select 和 show
库
库名字
库属性:字符集,排序规则
表
表名
表属性:存储引擎类型,字符集,排序规则
列名
列属性:数据类型,约束,其他属性
数据行
相当于MySQL的密码本(编码表)
show charset;
utf8 : 3个字节
utf8mb4 (建议): 4个字节,支持emoji
mysql> show collation;
对于英文字符串的,大小写的敏感
utf8mb4generalci 大小写不敏感
utf8mb4_bin 大小写敏感(存拼音,日文)
保证数据的正确性和标准性
整数
tinyint : -128~127
int :-231~231-1
浮点数
略
说明:手机号是无法存储到int的。一般是使用char类型来存储收集号
char(100)
定长字符串类型,不管字符串长度多长,都立即分配100个字符长度的存储空间,未占满的空间使用"空格"填充
varchar(100)
变长字符串类型,每次存储数据之前,都要先判断一下长度,按需分配此盘空间.
会单独申请一个字符长度的空间存储字符长度(少于255,如果超过255以上,会占用两个存储空间)
如何选择这两个数据类型?
enum 枚举数据类型
address enum(‘sz‘,‘sh‘,‘bj‘.....)
1 2 3
悬念,以上数据类型可能会影响到索引的性能
datetime
范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。
timestamp
范围为从 1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。
列值不能为空,也是表设计的规范,尽可能将所有的列设置为非空。可以设置默认值为0
unique key :唯一键
列值不能重复
unsigned :无符号
针对数字列,非负数。
其他属性:
key :索引
可以在某列上建立索引,来优化查询
CREATE DATABASE zabbix CHARSET utf8mb4 COLLATE utf8mb4_bin;
SHOW DATABASES;
SHOW CREATE DATABASE zabbix;
DROP DATABASE syxk;
注意: 一定是从小往大了改,比如utf8--->utf8mb4.
目标字符集一定是源字符集的严格超级.
CREATE DATABASE syxk;
SHOW CREATE DATABASE syxk;
ALTER DATABASE syxk CHARSET utf8mb4;
1.库名使用小写字符
2.库名不能以数字开头
3.不能是数据库内部的关键字
4.必须设置字符集.
表名,列名,列属性,表属性
create table stu(
列1 属性(数据类型、约束、其他属性),
列2 属性,
列3 属性
)
PRIMARY KEY : 主键约束,表中只能有一个,非空且唯一.
NOT NULL : 非空约束,不允许空值
UNIQUE KEY : 唯一键约束,不允许重复值
DEFAULT : 一般配合 NOT NULL 一起使用.
UNSIGNED : 无符号,针对数字列,非负数
COMMENT : 注释
AUTO_INCREMENT : 自增长的列
1. 表名小写字母,不能数字开头,
2. 不能是保留字符,使用和业务有关的表名
3. 选择合适的数据类型及长度
4. 每个列设置 NOT NULL + DEFAULT .对于数据0填充,对于字符使用有效字符串填充
5. 没个列设置注释
6. 表必须设置存储引擎和字符集
7. 主键列尽量是无关列数字列,最好是自增长
8. enum类型不要保存数字,只能是字符串类型
CREATE TABLE stu (
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT ‘学号‘,
sname VARCHAR(255) NOT NULL COMMENT ‘姓名‘,
age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT ‘年龄‘,
gender ENUM(‘m‘,‘f‘,‘n‘) NOT NULL DEFAULT ‘n‘ COMMENT ‘性别‘,
intime DATETIME NOT NULL DEFAULT NOW() COMMENT ‘入学时间‘
)ENGINE INNODB CHARSET utf8mb4 COMMENT ‘学生表‘;
SHOW TABLES;
SHOW CREATE TABLE stu;
DESC stu; #查看表结构
CREATE TABLE test LIKE stu;
DROP TABLE test;
1.在stu表中添加qq列
DESC stu;
ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL COMMENT ‘qq号‘;
2.在sname后加微信列
ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT ‘微信号‘ AFTER sname;
3.在id列前加一个新列num
ALTER TABLE stu ADD num INT NOT NULL UNIQUE COMMENT ‘身份证‘ FIRST ;
DESC stu;
4.把刚才添加的列都删掉(危险,生产中禁用操作)
ALTER TABLE stu DROP num;
DESC stu;
ALTER TABLE stu DROP qq;
ALTER TABLE stu DROP wechat;
5.修改sname数据类型的属性
DESC stu;
ALTER TABLE stu MODIFY sname VARCHAR(64) NOT NULL COMMENT ‘姓名‘;
6.将gender 改为 sex 数据类型改为 CHAR 类型 ***
ALTER TABLE stu CHANGE gender sex CHAR(4) NOT NULL COMMENT ‘性别‘;
说明:修改字符集,修改后的字符集一定是原字符集的严格超集
情况1:ALTER 语句是在原有数据的表中增加一个列,是需要对表结构进行更改,如果在生产环境中,这个表有可能是在频繁的访问的,还可能有一堆的业务过来,比如往里面插入行(增删改查),这种在线更改的DDL语句,是会进行锁表操作的。也就是这种语句是不合适在一个繁忙的时刻操作的(一定要避开生产的繁忙时刻) (建议:避开业务繁忙期)
情况 2:若紧急上线。操作流程
方式一:先将表的数据创建一个临时表,就是一模一样的表,copy出来(copy是不会锁表的,等于复制了一份,生成一个临时表)。然后进行临时表的变更,最后对原表进行替换。
方式二:pt-osc (工具)进行在线DDL,解决锁表的时间(另外8.0版本已经解决了这个问题)
?
mysql> grant SELECT,INSERT,UPDATE,DELETE on wordpress.* to wordpress@‘10.0.0.%‘ identified by ‘123‘;
mysql> revoke delete on wordpress.* from ‘wordpress‘@‘10.0.0.%‘;
mysql> show grants for wordpress@‘10.0.0.%‘;
DESC stu;
1.最偷懒
INSERT stu VALUES(1,‘zs‘,18,‘m‘,NOW());
SELECT * FROM stu;
2.最规范
INSERT INTO stu(id,sname,age,sex,intime)
VALUES (2,‘ls‘,19,‘f‘,NOW());
3.针对性的录入数据
INSERT INTO stu(sname,age,sex)
VALUES (‘w5‘,11,‘m‘);
4.一次性录入多行
INSERT INTO stu(sname,age,sex)
VALUES
(‘aa‘,11,‘m‘),
(‘bb‘,12,‘f‘),
(‘cc‘,13,‘m‘);
UPDATE stu SET sname=‘aaa‘;
SELECT * FROM stu;
UPDATE stu SET sname=‘bb‘ WHERE id=6;
DELETE FROM stu;
DELETE FROM stu WHERE id=9;
生产中屏蔽delete功能
使用update替代delete
ALTER TABLE stu ADD isdel TINYINT DEFAULT 0 ;
UPDATE stu SET isdel=1 WHERE id=7;
SELECT * FROM stu WHERE is_del=0;
select
show
mysql> select @@basedir; #查看软件安装目录
mysql> select @@port; #查看当前数据库的端口
mysql> select @@innodb_flush_log_at_trx_commit;
mysql> show variables like ‘innodb%‘; #模糊查询
mysql> select database(); #查看当前的库
mysql> select now(); #查看当前的时间
select 列1,列2 from 表 where 条件 group by 条件 having 条件 order by 条件 limit
select user,count(name) from 表 where 列 group by user having 列 order by 列 limit;
语句顺序即如下:(不能乱)
可以单独使用.但这个顺序不能乱,不然语法错误。
select 列
from 表
where 条件
group by 条件
having 条件
order by 条件
limit
World 数据库
city 城市表
country 国家表
countrylanguage 国家的语言
city表结构 desc city;
ID : 城市序号/ID(1-...)
name : 城市名字
countrycode : 国家代码,例如:CHN,USA
district : 区域: 中国
省
美国
洲
population : 人口数
如何熟悉数据库业务?
select 列,列,列 from 表
例子:
select 列,列,列 from 表 where 过滤条件
查询中国所有的城市名和人口数
SELECT NAME,population FROM city
WHERE countrycode=‘CHN‘;
世界上小于100人的城市名和人口数
SELECT NAME,population FROM city
查询中国人口数量大于1000w的城市名和人口
SELECT NAME,population FROM city
WHERE countrycode=‘CHN‘ AND population>8000000;
查询中国或美国的城市名和人口数
SELECT NAME,population FROM city
WHERE countrycode=‘CHN‘ OR countrycode=‘USA‘;
查询人口数量在500w到600w之间的城市名和人口数
SELECT NAME,population FROM city
WHERE population>5000000 AND population<6000000;
或者:
SELECT NAME,population FROM city
WHERE population BETWEEN 5000000 AND 6000000;
查询一下contrycode中带有CH开头,城市信息
SELECT * FROM city
WHERE countrycode LIKE ‘CH%‘;
注意:不要出现类似于 %CH%,前后都有百分号的语句,因为不走索引,性能极差
如果业务中有大量需求,我们用"ES(数据库)"来替代
例子:
查询中国或美国的城市信息.
SELECT NAME,population FROM city
WHERE countrycode=‘CHN‘ OR countrycode=‘USA‘;
或者:
SELECT NAME,population FROM city
WHERE countrycode IN (‘CHN‘ ,‘USA‘);
作用:根据 by后面的条件进行分组,方便统计,by后面跟一个列或多个列。
常用的聚合函数:
max():最大值
min():最小值
avg():平均值
sum():总和
count():个数
group_concat():该函数返回带有来自一个组的连接的非NULL值的字符串结果。(列转行)
在数据表中1对多是不允许的。如:
name age
张三 14
张三 15
在实际生活中,类似这种重名的现象是有的。但将其转为1行显示,及
name age
张三 14,15
这一种现象是不被允许的,在数据表中都是1对1的关系存储。遇见这类情况就需要使用到聚合函数group_concat().
GROUP BY + 聚合函数公式:
1.遇到统计想函数
2.形容词前 GROUP BY
3.函数中央是名词
4.列名select后添加
GROUP BY将某列中有共同条件的数据行,分成一组,然后在进行聚合函数操作.
例子:
语句顺序:where之后是group之后是having.不能是having之后有group
例子:
1.统计所有国家的总人口数量,将总人口数大于1亿的过滤出来。
SELECT countrycode.SUM(population) FROM city GROUP BY countrycode
HAVING SUM(population)>100000000;
例子:
DESC :从大到小
ASC : 从小到大
例子:
SELECT countrycode,SUM(population) FROM city
GROUP BY countrycode
HAVING SUM(population)>50000000
ORDER BY SUM(population) DESC
LIMIT 3;
SELECT countrycode,SUM(population) FROM city
GROUP BY countrycode
HAVING SUM(population)>50000000
ORDER BY SUM(population) DESC
LIMIT 3,3; #跳过前三行(从第四行开始),一共显示三行。
SELECT countrycode,SUM(population) FROM city
GROUP BY countrycode
HAVING SUM(population)>50000000
ORDER BY SUM(population) DESC
LIMIT 3 OFFSET 3;
LIMIT M,N : 跳过M行,显示一共N行
LIMIT Y OFFSET X: 跳过X行,显示一共Y行