引言
写写学习笔记,绝大多数的内容都可以在这篇教程中看到,这里只补充可能会经常翻阅的内容~
常用指令
可能会经常翻,所以放前面来了~
mysql –u用户名 [–h主机名或者IP地址,-P端口号] –p密码 #该命令是在命令行窗口下执行,而不是MySQL的命令行
mysqladmin -uroot -p password #修改密码
USE test;#选择数据库
CREATE DATABASE test;#创建一个已知不存在的数据库
为了不产生错误,在创建数据库的时候可以加上一些简单的逻辑判断,判断数据库是否存在,不存在也不产生错误。会产生一个警告
CREATE DATABASE if not exists test;
使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库。所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库。
mysqladmin -uroot -p create test
删除数据库
删除一个已经确定存在的数据库
DROP DATABASE test2;
删除一个不确定存在的数据库
drop database if exists test2;
管理工具删除
mysqladmin -uroot -p drop test
查看存储引擎
SHOW VARIABLES LIKE '%storage_engine%';
创建table
-- 如果数据库中存在user_accounts表,就把它从数据库中drop掉
DROP TABLE IF EXISTS `user_accounts`;
CREATE TABLE `user_accounts` (
`id` int(100) unsigned NOT NULL AUTO_INCREMENT primary key,
`password` varchar(32) NOT NULL DEFAULT '' COMMENT '用户密码',
`reset_password` tinyint(32) NOT NULL DEFAULT 0 COMMENT '用户类型:0-不需要重置密码;1-需要重置密码',
`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机',
`create_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`update_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
-- 创建唯一索引,不允许重复
UNIQUE INDEX idx_user_mobile(`mobile`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
COMMENT='用户表信息';
需要注意的是,在我用的版本5.5.xx中,current_timestamp在一个表中是不能有第二的,这个大坑让我排了很久…..
数据类型的属性解释
NULL
:数据列可包含NULL值;NOT NULL
:数据列不允许包含NULL值;DEFAULT
:默认值;PRIMARY KEY
:主键;AUTO_INCREMENT
:自动递增,适用于整数类型;UNSIGNED
:是指数值类型只能为正数;CHARACTER SET name
:指定一个字符集;COMMENT
:对表或者字段说明;
增删改查
SELECT
SELECT
语法 语句用于从表中选取数据。也就是查看数据
SELECT 列名称1, 列名称2, ... FROM 表名称;
SELECT * FROM 表名称;
-- 从 Customers 表中选择 CustomerName 和 City 列:
SELECT CustomerName, City FROM Customers;
-- 从 Customers 表中选择所有列:
SELECT * FROM Customers;
-- 表 station 取个别名叫 s,表 station 中不包含 字段 id=13 或者 14 的,并且 id 不等于 4 的 查询出来,只显示 id
SELECT s.id from station s WHERE id in (13,14) and id not in (4);
-- 从表 users 选取 id=3 的数据,并只拉一条数据(据说能优化性能)
SELECT * FROM users where id=3 limit 1
-- 结果集中会自动去重复数据
SELECT DISTINCT Company FROM Orders
-- 表 Persons 字段 Id_P 等于 Orders 字段 Id_P 的值,
-- 结果集显示 Persons表的 LastName、FirstName字段,Orders表的OrderNo字段
SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p, Orders o WHERE p.Id_P = o.Id_P
-- gbk 和 utf8 中英文混合排序最简单的办法
-- ci是 case insensitive, 即 “大小写不敏感”
SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using gbk) collate gbk_chinese_ci;
SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using utf8) collate utf8_unicode_ci;
UPDATE
Update
语法 语句用于修改表中的数据。
UPDATE 表名称 SET 列名称1 = 值1, 列名称2 = 值2, ... WHERE 条件;
-- update语句设置字段值为另一个结果取出来的字段
UPDATE user set name = (SELECT name from user1 WHERE user1 .id = 1 )
WHERE id = (SELECT id from user2 WHERE user2 .name='小苏');
-- 更新表 orders 中 id=1 的那一行数据更新它的 title 字段
UPDATE `orders` set title='这里是标题' WHERE id=1;
INSERT
INSERT
语法 用于向表格中插入新的行。
INSERT INTO 表名称 (列名称1, 列名称2, 列名称3, ...) VALUES (值1, 值2, 值3, ...);
INSERT INTO 表名称 VALUES (值1, 值2, 值3, ...);
-- 向表 Persons 插入一条字段 LastName = JSLite 字段 Address = shanghai
INSERT INTO Persons (LastName, Address) VALUES ('JSLite', 'shanghai');
-- 向表 meeting 插入 字段 a=1 和字段 b=2
INSERT INTO meeting SET a=1,b=2;
--
-- SQL实现将一个表的数据插入到另外一个表的代码
-- 如果只希望导入指定字段,可以用这种方法:
-- INSERT INTO 目标表 (字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 来源表;
INSERT INTO orders (user_account_id, title) SELECT m.user_id, m.title FROM meeting m where m.id=1;
-- 向表 charger 插入一条数据,已存在就对表 charger 更新 `type`,`update_at` 字段;
INSERT INTO `charger` (`id`,`type`,`create_at`,`update_at`) VALUES (3,2,'2017-05-18 11:06:17','2017-05-18 11:06:17') ON DUPLICATE KEY UPDATE `id`=VALUES(`id`), `type`=VALUES(`type`), `update_at`=VALUES(`update_at`);
DELETE
DELETE
语法 语句用于删除表中的现有记录
DELETE FROM 表名称 WHERE 条件;
```— 在不删除table_name表的情况下删除所有的行,清空表。
DELETE FROM table_name
— 或者
DELETE * FROM table_name
— 删除 Person 表字段 LastName = ‘JSLite’
DELETE FROM Person WHERE LastName = ‘JSLite’
— 删除 表meeting id 为2和3的两条数据
DELETE from meeting where id in (2,3);
#### WHERE ####
`WHERE` 语法 用于仅提取满足指定条件的记录
SELECT 列名称, 列名称, … FROM 表名称 WHERE 条件1;
— 从表 Persons 中选出 Year 字段大于 1965 的数据
SELECT FROM Persons WHERE Year>1965
— 从 Customers 表中选择 Country = Mexico 的所有数据:
SELECT FROM Customers WHERE Country=’Mexico’;
— 从 Customers 表中选择 CustomerID = 1 的所有数据:
SELECT * FROM Customers WHERE CustomerID=1;
### AND, OR 和 NOT ###
就和不同and or not 没啥区别
### ORDER BY ###
`ORDER BY` 语法 用于按升序或降序对结果集进行排序
默认按 `ASC` 升序对记录进行排序。要按降序对记录进行排序,请使用 `DESC` 关键字
[不会点这里](https://wangchujiang.com/mysql-tutorial/21-minutes-MySQL-basic-entry.html#order-by)
### GROUP BY ###
暂时没搞懂~
`GROUP BY` 语法 将具有相同值的行分组到汇总行中
SELECT 列名称(s)
FROM 表名称
WHERE 条件
GROUP BY 列名称(s)
ORDER BY 列名称(s);
### IN ###
`IN 语法` 是多个 OR 条件的简写
### UNION ###
`UNION` 语法 操作符用于合并两个或多个 SELECT 语句的结果集
SELECT 列名称(s) FROM 表名称1
UNION
SELECT 列名称(s) FROM 表名称2;
### BETWEEN ###
每错,就是between and
SELECT 列名称(s) FROM 表名称 WHERE 列名称 BETWEEN 值1 AND 值2;
### AS ###
`AS 语法` 用于为表或表中的列(字段)提供临时名称(别名)。
SELECT 列名称 AS 别名 FROM 表名称;
SELECT 列名称(s) FROM 表名称 AS 别名;
### JOIN ###
`JOIN` 子句用于根据两个或多个表之间的相关列组合来自两个或多个表的行
`JOIN`: 如果表中有至少一个匹配,则返回行
`INNER JOIN`:在表中存在至少一个匹配时,`INNER JOIN` 关键字返回行。
`LEFT JOIN`: 即使右表中没有匹配,也从左表返回所有的行
`RIGHT JOIN`: 即使左表中没有匹配,也从右表返回所有的行
`FULL JOIN`: 只要其中一个表中存在匹配,就返回行(MySQL 是不支持的,通过 `LEFT JOIN + UNION + RIGHT JOIN` 的方式 来实现)
#### INNER JOIN ####
SELECT 列名称(s)
FROM 表1
INNER JOIN 表2
ON 表1.列名称 = 表2.列名称;
#### LEFT JOIN ####
`LEFT JOIN` 语法 返回左表 (表1) 中的所有记录,以及右表 (表2) 中的匹配记录
SELECT 列名称(s)
FROM 表1
LEFT JOIN 表2
ON 表1.列名称 = 表2.列名称;
#### RIGHT JOIN ####
`RIGHT JOIN` 语法 返回右表 (表2) 中的所有记录,以及左表 (表1) 中的匹配记录
SELECT 列名称(s)
FROM 表1
RIGHT JOIN 表2
ON 表1.列名称 = 表2.列名称;
#### FULL OUTER JOIN ####
`FULL OUTER JOIN` 语法 当左(表1)或右(表2)表记录中存在匹配时,关键字返回所有记录
### SQL 函数 ###
感觉很少用到,不懂看[这个](https://wangchujiang.com/mysql-tutorial/21-minutes-MySQL-basic-entry.html#sql-%E5%87%BD%E6%95%B0)
## MyCli替代MySQL的mysql命令行工具 ##
根据我看的教程,非常对剑mycli,所以就准备将mysql命令行工具改为mysql
### 安装python3 ###
centos7自带了python2,下面贴一个安装python3的指令
wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz
tar -xvJf Python-3.7.2.tar.xz
mkdir /usr/local/python3
cd Python-3.7.2
./configure —prefix=/usr/local/python3 —enable-optimizations —with-ssl
make && make install
ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
### 安装mycli ###
安装pip,然后用pip安装mycli
yum install -y python-pip python-devel libffi-devel openssl-devel
pip3 install —upgrade pip
pip3 install —ignore-installed mycli
pip3 install pymysql
配置将安装好的mycli拷贝到 /bin/
cp /usr/local/python3/bin/mycli /bin/
启用mycli
mycli —version
mycli -uroot -proot
```