Mysql

#back-end/mysql

MySQL

启动myslq

service mysql start

初始化MySQL

mysql_secure_installation

往下一直Y 直到人家谢谢你 初始化完成

Thanks for using MariaDB!

登录MySQL

mysql -u root -p

这里密码为空,直接回车就可登入

创建数据库

这里是root用户,可以使用mysqladmin来创建database

mysqladmin -u root -p create tutorials
create database tutorials

创建完成后show databases

MariaDB [mysql]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| joeybase |
| joeychamber |
| mysql |
| performance_schema |
| turorials |
+--------------------+
6 rows in set (0.000 sec)

使用root登录后

CREATE DATABASE IF NOT EXISTS SPACE DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

该命令的作用

  • 如果数据库不存在则创建,存在则不创建

  • 创建SPACE数据库,并设定编码集为utf8


删除数据库

mysqladmin -u root -p drop joeychamber
drop databse joeychamber

再来show一遍

MariaDB [mysql]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| joeybase |
| mysql |
| performance_schema |
| turorials |
+--------------------+
5 rows in set (0.000 sec)

FLOAT和DOUBLE差异

(单精度与双精度有什么区别)

最本质的区别:

单精度(float)在 32 位机器上用4个字节来存储的
双精度(double)是用8个字节来存储的,由于存储位不同,他们能表示的数值的范围就不同,也就是能准确表示的数的位数就不同

1、所占的内存不同

单精度浮点数占用4个字节(32位)存储空间来存储一个浮点数,包括符号位1位,阶码8位,尾数23位
而双精度浮点数使用 8个字节(64位)存储空间来存储一个浮点数,包括符号位1位,阶码11位,尾数52位

2、所存的数值范围不同

单精度浮点数的数值范围为-3.4E38~3.4E38,而双精度浮点数可以表示的数字的绝对值范围大约是:-2.23E308 ~ 1.79E308
E表示10的多少次方,如3.4E38指的是3.4乘以1038次方

3、十进制下的位数不同

单精度浮点数最多有7位十进制有效数字,如果某个数的有效数字位数超过7位,当把它定义为单精度变量时,超出的部分会自动四舍五入
双精度浮点数可以表示十进制的15或16位有效数字,超出的部分也会自动四舍五入

创建/删除表

create/drop table table_name
MariaDB [mysql]> create table joey_tbl(
-> joey_id int not null auto_increment,
-> joey_title varchar(100) not null,
-> joey_author varchar(40) not null,
-> submission_date date,
-> primary key(joey_id)
-> );
Query OK, 0 rows affected (0.023 sec)

插入数据

insert into table_name(field1,f2,f3...)
values
(values1,v2,v3...);

如果数据是字符型,必须使用单引号( ‘ )或者双引号( “ )

MariaDB [mysql]> insert into joey_tbl
-> (joey_title,joey_author,submission_date)
-> values
-> ("joey","Eggy","3/28");

Query OK, 1 row affected (0.000 sec)

查询语句SELECT

select _column,_column from _table [where Clause] [limit N][offset M]
  • **select * ** : 返回所有记录
  • limit N : 返回 N 条记录
  • offset M : 跳过 M 条记录, 默认 M=0, 单独使用似乎不起作用
  • limit N,M : 相当于 limit M offset N , 从第 N 条记录开始, 返回 M 条记录
MariaDB [mysql]> select * from joey_tbl; #读取数据表
+---------+------------+-------------+-----------------+
| joey_id | joey_title | joey_author | submission_date |
+---------+------------+-------------+-----------------+
| 1 | joey | Eggy | 2020-03-28 |
+---------+------------+-------------+-----------------+
1 row in set (0.000 sec)

limit 应用

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET

mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15   

//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行

//换句话说,LIMIT n 等价于 LIMIT 0,n。

WHERE子句

SELECT field1, field2,...fieldN FROM table_name1,table_name2... [WHERE condition1 [AND [OR]] condition2.....
  • 查询语句中你可以使用一个或者多个表,表之间使用逗号**,** 分割,并使用WHERE语句来设定查询条件。
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以使用 AND 或者 OR 指定>=1个条件。
  • WHERE 可运用于 SQL 的 DELETE 或者 UPDATE 命令。
  • WHERE 类似于 if 条件,根据 MySQL 表中的字段值来读取指定的数据
MariaDB [mysql]> select * from joey_tbl where joey_title="JOEY";
+---------+------------+-------------+-----------------+
| joey_id | joey_title | joey_author | submission_date |
+---------+------------+-------------+-----------------+
| 1 | joey | Eggy | 2000-03-28 |
+---------+------------+-------------+-----------------+
1 row in set (0.000 sec)

特殊条件

空值判断:is null

select * from joey_tbl where country is null;
#查询joey_tbl表country列中的空值

between and

select * from joey_tbl where id between 1 and 5;
#查询joey_tbl表中id列1到5的值

in

select * from joey_tbl where id in (1,3,5)
#查询joey_tbl表id列等于1,3,5的值

更新/删除

UPDATE

用来修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作

#update 表名称 set 列名称=新值 where 更新条件;
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE clause]
MariaDB [mysql]> update joey_tbl set submission_date="2020-03-28" where joey_id=1;
Query OK, 1 row affected (0.005 sec)
Rows matched: 1 Changed: 1 Warnings: 0

select * from joey_tbl;
+---------+------------+-------------+-----------------+
| joey_id | joey_title | joey_author | submission_date |
+---------+------------+-------------+-----------------+
| 1 | joey | Eggy | 2020-03-28 |
+---------+------------+-------------+-----------------+
1 row in set (0.000 sec)

DELETE

#DELETE FROM 表名称 where 删除条件;
DELETE FROM table_name [WHERE Clause]
select * from joey_tbl;
+---------+------------+-------------+-----------------+
| joey_id | joey_title | joey_author | submission_date |
+---------+------------+-------------+-----------------+
| 1 | joey | Eggy | 2020-03-28 |
+---------+------------+-------------+-----------------+

MariaDB [mysql]> DELETE from joey_tbl where joey_id=1;
Query OK, 1 row affected (0.001 sec)

MariaDB [mysql]> select * from joey_tbl;
Empty set (0.000 sec)

LIKE子句

SELECT field1, field2,...fieldN FROM table_name WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'

%:多个字符

_ :1个字符

M%:模糊查询信息为M开头的

%M%:查询包含M的所有内容

%M_:查询

MariaDB [mysql]> select * from joey_tbl;
+---------+------------+-------------+-----------------+
| joey_id | joey_title | joey_author | submission_date |
+---------+------------+-------------+-----------------+
| 2 | JOEY | EGGY | 2022-03-28 |
| 3 | JOEY | EGGY | 2022-03-28 |
| 4 | JOEY | EGGY | 2022-03-28 |
| 5 | JOEY | EGGY.com | 2022-03-28 |
| 6 | JOEY | JOEY.com | 2022-03-28 |
+---------+------------+-------------+-----------------+
5 rows in set (0.000 sec)

#SQL LIKE 子句中使用百分号 % 字符来表示任意字符
#如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的

MariaDB [mysql]> select * from joey_tbl where joey_author like '%com';
+---------+------------+-------------+-----------------+
| joey_id | joey_title | joey_author | submission_date |
+---------+------------+-------------+-----------------+
| 5 | JOEY | EGGY.com | 2022-03-28 |
| 6 | JOEY | JOEY.com | 2022-03-28 |
+---------+------------+-------------+-----------------+
2 rows in set (0.000 sec)

UNION

UNION 语句:查询不同表中相同列中的数据(不包括重复数据)

ALL:返回所有结果(包括重复数据)

DISTINCT:删除重复数据(默认UNION已经删除了重复数据)

#这是"joey_game"表的数据
MariaDB [mysql]> select * from joey_game;
+----+-------------------+-------+---------+
| id | name | value | country |
+----+-------------------+-------+---------+
| 1 | Apex Legend | free | USA |
| 2 | League of Legend | free | USA |
| 3 | Rainbow six Siege | $30 | USA |
+----+-------------------+-------+---------+
#这是"Eggy_game"表的数据
MariaDB [mysql]> select * from Eggy_game;
+----+---------------------+-------+---------+
| id | name | value | country |
+----+---------------------+-------+---------+
| 1 | Dying light | $40 | USA |
| 2 | Oxygen Not Included | $30 | USA |
| 3 | Elden Ring | free | USA |
+----+---------------------+-------+---------+
#union
MariaDB [mysql]> select value from joey_game
-> union
-> select value from Eggy_game
-> order by value;

+-------+
| value |
+-------+
| $30 |
| $40 |
| free |
+-------+

#union all
MariaDB [mysql]> select value from joey_game
-> union all
-> select value from Eggy_game
-> order by value;

+-------+
| value |
+-------+
| $30 |
| $30 |
| $40 |
| free |
| free |
| free |
+-------+

ORDER BY

order by就是对结果排序

select * from joey_game order by id asc,game desc 
#默认升序,asc可省,desc降序,不写明ASC DESC的时候,默认是ASC

ORDER BY 多列的时候,先按照第一个column name排序,在按照第二个column name排序

GROUP BY

GROUP BY 用于将结果集根据指定的一个或多个列进行分组。常与聚合函数配合使用,以便对每组数据进行统计。

SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition
GROUP BY column1;
#这个查询根据 country 列将客户分组,并统计每个国家的客户数量。
SELECT country, COUNT(*) AS customer_count
FROM customers
GROUP BY country;

按多个列分组

#此查询按 country 和 city 的组合进行分组,并计算每个国家和城市的客户数量
SELECT country, city, COUNT(*) AS customer_count
FROM customers
GROUP BY country, city;

JOIN

  • INNER JOIN(内连接,或等值连接): 获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接): 获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 获取右表所有记录,即使左表没有对应匹配的记录。

INNER JOIN

SELECT column1, column2, ...
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;

测试实例数据

mysql> use RUNOOB;
Database changed
mysql> SELECT * FROM tcount_tbl;
+---------------+--------------+
| runoob_author | runoob_count |
+---------------+--------------+
| 菜鸟教程 | 10 |
| RUNOOB.COM | 20 |
| Google | 22 |
+---------------+--------------+
3 rows in set (0.01 sec)

mysql> SELECT * from runoob_tbl;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 1 | 学习 PHP | 菜鸟教程 | 2017-04-12 |
| 2 | 学习 MySQL | 菜鸟教程 | 2017-04-12 |
| 3 | 学习 Java | RUNOOB.COM | 2015-05-01 |
| 4 | 学习 Python | RUNOOB.COM | 2016-03-06 |
| 5 | 学习 C | FK | 2017-04-05 |
+-----------+---------------+---------------+-----------------+
5 rows in set (0.01 sec)
#连接以上两张表来读取runoob_tbl表中所有runoob_author字段在tcount_tbl表对应的runoob_count字段值
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
+-------------+-----------------+----------------+
4 rows in set (0.00 sec)

inner join

LEFT JOIN

LEFT JOIN 返回左表中的所有行,即使右表中没有匹配的行。如果右表没有匹配数据,结果中对应的列将显示 NULL。

mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
| 5 | FK | NULL |
+-------------+-----------------+----------------+
5 rows in set (0.01 sec)

left join

RIGHT JOIN

RIGHT JOIN 会返回右表中的所有行,即使左表中没有匹配行。

mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+-------------+-----------------+----------------+
| a.runoob_id | a.runoob_author | b.runoob_count |
+-------------+-----------------+----------------+
| 1 | 菜鸟教程 | 10 |
| 2 | 菜鸟教程 | 10 |
| 3 | RUNOOB.COM | 20 |
| 4 | RUNOOB.COM | 20 |
| NULL | NULL | 22 |
+-------------+-----------------+----------------+
5 rows in set (0.01 sec)

right join

ALTER

ALTER 命令允许你添加、修改或删除数据库对象,并且可以用于更改表的列定义、添加约束、创建和删除索引等操作。

添加列 (ADD COLUMN)

ALTER TABLE table_name
ADD COLUMN new_column_name datatype;

删除列 (DROP COLUMN)

ALTER TABLE table_name
DROP COLUMN column_name;

修改列的数据类型 (MODIFY COLUMN)

ALTER TABLE table_name
MODIFY COLUMN column_name new_datatype;

修改列名 (CHANGE COLUMN)

ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;

添加约束 (ADD CONSTRAINT)

可以使用 ALTER TABLE 来为表添加约束,例如 PRIMARY KEY、UNIQUE、FOREIGN KEY 等。

ALTER TABLE table_name
ADD CONSTRAINT constraint_name constraint_type (column_name);

添加 PRIMARY KEY

ALTER TABLE table_name
ADD PRIMARY KEY (column_name);

添加 FOREIGN KEY

ALTER TABLE child_table
ADD CONSTRAINT fk_name
FOREIGN KEY (column_name)
REFERENCES parent_table (column_name);

修改表名

ALTER TABLE old_table_name
RENAME TO new_table_name;

正则表达式

The REGEXP Operator

正则表达式速查表

量词

字符 含义
? {0,1}
+ {1,}
* {0,}
{n,m} n-m次
{n,} n次或更多
{n} n次

预定义类

字符 等价类
. [^\n]
\d [0-9]
\s [ \f\n\r\t\v]
\S [^ \f\n\r\t\v]
\w [a-zA-Z_0-9]
\W [^a-zA-Z_0-9]

边界

并没有实际匹配任何字符,只是单纯匹配边界

字符 含义
^ 开始
$ 结尾
\b 单词开始或结束
\B 非单词开始或结束
#匹配地址中包含 “Trail” 的所有记录。
SELECT * FROM customers WHERE address REGEXP 'Trail';
#匹配地址中包含 “Trail” 或 “Avenue” 的记录。
SELECT * FROM customers WHERE address REGEXP 'Trail|Avenue';

INDEX

索引是一种数据结构,用于加快数据库查询的速度和性能。

创建索引 (CREATE INDEX)

CREATE INDEX index_name ON table_name (column1, column2, ...);

唯一索引 (UNIQUE INDEX)

# 唯一索引确保索引中的值是唯一的,不允许有重复值。
CREATE UNIQUE INDEX index_name ON table_name (column1, column2, ...);

唯一组合索引

#为多个列创建唯一索引,确保这些列的组合值在表中是唯一的。
CREATE UNIQUE INDEX idx_unique_customer ON customers (email, phone_number);

删除索引 (DROP INDEX)

DROP INDEX index_name ON table_name;

创建组合索引(多列索引)

#组合索引是指为多个列创建一个索引。组合索引可以加速针对多个列的查询。
CREATE INDEX index_name ON table_name (column1, column2);

显示索引信息

SHOW INDEXES FROM table_name;