文章目录
Mysql 基础
进入命令行操作:
1.登录MySQL
登录本机
mysql -u 用户名 -p
# 也可不用空格
mysql -u用户名 -p
# 例如
mysql -u root -p #先输入,回车
然后提示输入密码,回车即可
登录远程mysql:有主机名和端口号,有时也没有端口号
mysql -h 主机 -P 端口 -u 用户名 -p
#也可不用空格
mysql -h主机 -P端口 -u用户名 -p
然后提示输入密码,回车即可
2.登录docker容器中的mysql
[root@192 ~]# docker exec -it 9325256d2d9b /bin/bash
root@9325256d2d9b:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.30 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
6 rows in set (0.00 sec)
mysql> exit
DDL:数据库模式定义语言,关键字:create
DML:数据操纵语言,关键字:Insert、delete、update
DCL:数据库控制语言 ,关键字:grant、remove
DQL:数据库查询语言,关键字:select
有些版本是上面这个,但目前我认为主要就是三类
参考oracal https://help.aliyun.com/knowledge_detail/158648.html
1.DDL
DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter等。
1.1 数据库操作
1.创建数据库
创建数据库
create database [数据库名] character set [字符编码];
create database [if not exists] 库名;
create database testdb character set utf8;
Query OK, 1 row affected (0.02 sec)
2.删除数据库
删除数据库
drop database [数据库名];
drop databases [if exists] 库名;
mysql> drop database testdb;
Query OK, 0 rows affected (0.14 sec)
3.修改数据库
修改数据库编码
mysql> alter database testdb character set gbk;
Query OK, 1 row affected (0.00 sec)
4.查询数据库
查询数据库创建明细信息
mysql> show create database testdb;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| testdb | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+----------------------------------------------------------------+
1 row in set (0.02 sec)
查询数据库总数
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
6 rows in set (0.03 sec)
show databases like ‘javacode2018';列出javacode2018库信息。
5.使用数据库
操作数据库一定要先指定数据库,不然会有问题
use [数据库名];
1046 - No database selected
mysql> use testdb;
Database changed
1.2 表操作
1.创建表
create table 表名(
字段名1 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名2 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名3 类型[(宽度)] [约束条件] [comment '字段说明']
)[表级别的一些设置];
mysql> create table student (
pid int(20) primary key auto_increment comment '主键',
personname varchar(32) comment '名字',
age int default '0' comment '年龄',
birth datetime comment '生日',
phone varchar(32) unique not null comment '手机号'
);
Query OK, 0 rows affected (0.02 sec)
2.查询表
查看表信息,有两种命令:
1
mysql> show create table student;
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| student | CREATE TABLE `student` (
`pid` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`personname` varchar(32) DEFAULT NULL COMMENT '名字',
`age` int(11) DEFAULT '0' COMMENT '年龄',
`birth` datetime DEFAULT NULL COMMENT '生日',
`phone` varchar(32) NOT NULL COMMENT '手机号',
PRIMARY KEY (`pid`),
UNIQUE KEY `phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.07 sec)
2
mysql> desc student;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| pid | int(20) | NO | PRI | NULL | auto_increment |
| personname | varchar(32) | YES | | NULL | |
| age | int(11) | YES | | 0 | |
| birth | datetime | YES | | NULL | |
| phone | varchar(32) | NO | UNI | NULL | |
+------------+-------------+------+-----+---------+----------------+
5 rows in set (0.06 sec)
3.修改表
1.重命名
mysql> alter table student rename to studentdemo;
Query OK, 0 rows affected (0.37 sec)
或者
格式:
RENAME TABLE 原表名 TO 新表名;
mysql> rename table aaa to user;
Query OK, 0 rows affected (0.38 sec)
2.增加字段
mysql> alter table studentdemo add createtime datetime;
Query OK, 0 rows affected (0.46 sec)
Records: 0 Duplicates: 0 Warnings: 0
3.删除字段
mysql> alter table studentdemo drop createtime;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
4.修改字段
ALTER TABLE 【表名字】 CHANGE 【列名称】【新列名称(这里可以用和原来列同名即可)】
mysql> alter table studentdemo change column personname name varchar(64) NOT NULL COMMENT '名字AA';
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
5.新增表注释
mysql> alter table user COMMENT='个人信息表';
Query OK, 0 rows affected (2.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
4.删除表
DROP TABLE student;
1.3 索引
1.新增索引
示例:给表person的pid创建唯一
CREATE UNIQUE INDEX ind_person_pid ON person(pid);
----------------------------
UNIQUE为索引类型,可替换索引类型为:
UNIQUE|FULLTEXT|SPATIAL,mysql 支持的其他索引类型分别为primary key,非唯一索引(默认)
2.删除索引
示例:删除表person的ind_person_pid索引
DROP INDEX ind_person_pid ON person;
2.DML
DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、udpate 和select 等。
运算符
= 在set后面是赋值, 在where后面是关系运算
2.1 INSERT
三种方式:
mysql> insert into studentdemo values (2, 'dfsa', 2, '2020-12-26 20:44:34', '778');
Query OK, 1 row affected (0.00 sec)
mysql> insert into studentdemo set name = 'aa' , phone = '1234';
Query OK, 1 row affected (0.00 sec)
mysql> insert into studentdemo values (null, 'dfsa', 2, '2020-12-26 20:44:34', '009'),(null, 'dfsa', 2, '2020-12-26 20:44:34', '89');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
2.2 SELECT
函数分类
聚合函数(依赖表) 普通函数(不依赖表)
select count(*) 当所有字段都为null,这条记录才不会统计
分页 limit 起始索引 每页显示数量
模糊查询
联合查询 union all
左右连接
1.HAVING和WHERE的差别
1.WHERE过滤行,而HAVING过滤分组。
2.WHERE在数据分组前进行过滤, HAVING在数据分组后进行过滤。这是一个重要的区别, WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
这条语句中,第一行是使用了聚集函数的基本SELECT,它与前面的例子很相像。 WHERE子句过滤所有prod_price至少为10的
行。然后按vend_id分组数据, HAVING子句过滤计数为2或2以上的分组。如果没有WHERE子句,将会多检索出两行(供应商1002,销售的所有产品价格都在10以下;供应商1001,销售3个产品,但只有一个产品的价格大于等于10):
2.子查询
子查询( subquery) ,即嵌套在其他查询中的查询 。在SELECT语句中,子查询总是从内向外处理。
主要用途:
1.利用子查询进行过滤
虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于(<>)等
2.作为计算字段使用子查询
相关子查询(correlated subquery) 涉及外部查询的子查询
任何时候只要列名可能有多义性,就必须使用这种语法(表名和列名由一个句点分隔)
3.组合查询 UNION
多数SQL查询都只包含从一个或多个表中返回数据的单条SELECT语句。 MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并( union) 或复合查询(compound query)。
有两种基本情况,其中需要使用组合查询:
在单个查询中从不同的表
返回类似结构
的数据
对单个表执行多个查询,按单个查询返回数据
组合查询和多个WHERE条件
多数情况下,组合相同表的两个查询完成的工作与具有多个WHERE子句条件的单条查询完成的工作相同。换句话说,任何具有多个WHERE子句的SELECT语句都可以作为一个组合查询给出,在以下段落中可以看到这一点。这两种技术在不同的查询中性能也不同。因此,应该试一下这两种技术,以确定对特定的查询哪一种性能更好。
在这个简单的例子中,使用UNION可能比使用WHERE子句更为复杂。但对于更复杂的过滤条件,或者从多个表(而不是单个表)中检索数据的情形,使用UNION可能会使处理更简单。
UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔(因此,如果组合4条SELECT语句,将要使用3个UNION关键字)。
UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)。
列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。
如果遵守了这些基本规则或限制,则可以将并用于任何数据检索任务。
UNION从查询结果集中自动去除了重复的行,使用UNION ALL, MySQL不取消重复的行
SELECT语句的输出用ORDER BY子句排序。在用UNION组合查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。对于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一部分的情况,因此不允许使用多条ORDER BY子句。
4.函数
1)聚合函数:
avg() 平均值
count() 行数 括号内可以加*
max() 最大值
min() 最小值
sum() 和
2)字符串函数:
concat(str1,str2,……,strn) 连接
insert(str,pos,len,newstr) 替换:将字符串str从pos位置开始,len个字符长的子串替换为字符串newstr
lower(str) 小写
upper(str) 大写
substring(str,num,len) 查找:返回字符串str的第num个位置开始长度为len的子字符串 (注:下标从1开始)
3)时间日期函数:
curdate() 年-月-日
curtime() 时:分:秒
nuw() 年-月-日 时:分:秒
week(date) 返回日期date为一年中的第几周
month(date) 返回日期date的月份
year(date) 返回日期date的年份
hour(time) 返回时间time的小时值
minute(time) 返回时间time的分钟值
datediff(date1,date2) 返回日期参数date1和date2之间相隔的天数
adddate(date,n) 计算日期参数date加上n天后的日期
4)数学函数:
ceil(x) 向上取整
floor(x) 向下取整
rand() 返回0到1之间的随机数:0.*****……
1.聚合函数
2.文本处理函数
3.日期处理函数
4.数字处理函数
2.3 UPDATE
mysql> update studentdemo set name = 'aa',age = 20 where pid = 2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
2.4 DELETE
mysql> delete from studentdemo;
Query OK, 5 rows affected (0.02 sec)
mysql> truncate table studentdemo;
Query OK, 0 rows affected (0.01 sec)
truncate 删除表时,会把主键对应的序号重置为1,删除数据比delete效率更高
3.DCL
DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke 、commit、rollback等。 DCL 比较简单,主要用于授予或收回访问数据库的权限,以及数据库事务的提交和回滚。
-- 显示数据库中各表的状态 引擎 大小 等
show table status from medchart_context_content;
show create table medchart_context_content.t_content_data;
use information_schema;
-- 查看数据库总占用空间
select concat(round(sum(data_length/1024/1024/1024),2),'GB') as data from tables;
select * from tables;
show engines;
-- 用户权限管理
show grants for data_team;
GRANT ALL PRIVILEGES ON wordpress.* TO 'username'@'localhost' IDENTIFIED BY 'password';
参考
《Mysql 必知必会》