mysql的基本使用2019.12.23

坚强是说给别人听的谎言 提交于 2020-01-30 00:41:48

MYSQL

linux安装mysql

linux的mysql下载地址
下载安装
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum update
yum install mysql-server
权限设置
chown mysql:mysql -R /var/lib/mysql
初始化mysql
mysql --initialize
启动mysql
systemctl start mysql
停止mysql
systemctl stop mysql
查看mysql运行状态
systemctl status mysql
验证mysql安装
mysqladmin --version
查看mysql的所有的数据库
show databases;
连接mysql
mysql -u root -p
卸载mysql
安装前检测系统是否自带mysql
rpm -qa | grep mysql
普通卸载删除mysql
rpm -e mysql
强力卸载删除,如果使用上面命令删除提示依赖其他文件,则使用这个命令对其强行删除
rpm -e --nodeps mysql
默认root用户密码为空,设置mysql密码
[root@host]# mysqladmin -u root password "new_password";

windows安装mysql

windows的mysql下载地址
配置
下载完成后,解压后在解压的根目录下创建my.ini配置文件

[client]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
# 设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=C:\\web\\mysql-8.0.11
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错# datadir=C:\\web\\sqldata
# 允许最大连接数
max_connections=20
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎default-storage-engine=INNODB

初始化,会显示密码
mysqld --initialize --console
安装mysql
mysqld install
启动
net start mysql
注意,如果mysql5.7需要初始化data目录
进入\bin
cd C:\web\mysql-8.0.11\bin
再次初始化
mysqld --initialize-insecure
初始化后再启动mysql
net start mysql
登录mysql,然后输入密码
mysql -u root -p

mysql管理

windows启动
cd c:/mysql/bin
mysql --console
windows关闭
mysqladmin -uroot shutdown


linux检测mysql是否启动
ps -ef | grep mysql
linux如果mysql已启动,输出mysql进程运行列表,如果mysql未启动,使用以下命令启动
cd /usr/bin
./mysqld_safe &
linux关闭目前运行的mysql服务器
cd /usr/bin
./mysqladmin -u root -p shutdown
Enter password: ******


添加mysql用户qifen/ljl123123

root@host# mysql -u root -p
Enter password:*******
mysql> use mysql;
Database changed

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
    -> ON TUTORIALS.*
    -> TO 'qifen'@'localhost'
    -> IDENTIFIED BY 'ljl123123';

linux下/etc/my.cnf文件配置
一般情况不需要修改,该文件默认配置:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

[mysql.server]
user=mysql
basedir=/var/lib

[safe_mysqld]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

列出所有数据库列表
show databases;
指定使用数据库
use 数据库名
Database changed
列出当前数据库所有表
show tables;
显示表的属性,属性类型,主键信息,是否为null,默认值等信息
show columns from 表名;
显示表的详细信息
show index from 表名;
显示数据库中所有表的信息
show table status from 数据库名;
MariaDB数据库
mariadb完全兼容mysql包括命令行和api,是mysql的替代品,主要是开源社区在维护,采用GPL授权许可,防止mysql闭源
MariaDB相关命令
systemctl start mariadb #启动mariadb
systemctl stop mariadb #停止mariadb
systemctl restart mariadb #重启mariadb
systemctl enable mariadb #设置开机启动

mysql操作数据库

创建数据库
create database 数据库名;
删除数据库
drop database 数据库名;
mysql数据类型:数值,日期/时间,字符串(字符)
数值类型

类型 范围 用途
TINYINT (-128,127) 小整数值
SMALLINT (-32 768,32 767) 大整数值
MEDIUNMINT (-8 388 608,8 388 607) 大整数值
INT或INTEGER (-2 147 483 648,2 147 483 647) 大整数值
BIGINT (-9 223 372 036 854 775 808,9 223 372 036 854 775 807) 极大数值
FLOAT (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 单精度浮点数值
DOUBLE (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2,依赖于M和D的值 小数值

日期和时间类型

类型 范围 格式 用途
DATE 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1901/2155 YYYY 年份值
DATATIME 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65 535字节 边长字符串
TINYBLOB 0-255字节 不超过255个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

创建表
create table 表名 (列名1 类型1,列名2 类型2);
案例:

CREATE TABLE IF NOT EXISTS `表名`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `title` VARCHAR(100) NOT NULL,
   `author` VARCHAR(40) NOT NULL,
   `date` DATE,
   PRIMARY KEY ( `id` ))ENGINE=InnoDB DEFAULT CHARSET=utf8;

1. 如果你不想字段为null,就可以设置属性为not null
2. auto_increment定义为自增属性,一般用于主键,数值会自动加1
3. primary key定义列为主键,可使用多个列来定义主键,以逗号分开
4. engine设置存储引擎,charset设置编码

drop删除表语句
drop table 表名;
insert插入记录语句
insert into 表名 (字段1,字段2) values("字段值1","字段值2");
查看表中所有数据
select * from 表名;
where查询记录语句
select 字段1,字段2 from 表名1,表名2 where 条件1 and/or 条件2;

1. 查询中可使用一个或多个表,表之间用逗号分隔,并使用where语句来设置查询条件
2. 使用and或者or指定一个或多个条件
3. where子句也可以运行sql的delete或者update命令
4. where子句类似程序语言中的if条件,根据mysql表中的字段来读取指定的数据

操作符列表,可用于where子句中,下面实例中假定A=10,B=20

操作符 描述 案例
= 等号,检测两个值是否相等,如果相等就返回ture (A=B)返回false
!= 不等于,检测两个值是否相等,如果不相等返回true (A!=B)返回true
> 大于号,检测左边的值是否大于右边的值,是返回true (A>B)返回true
< 小于号,检测左边的值是否小于右边的值,如果是返回true (A<B)返回false
>= 大于等于号,检测左边的值是否大于等于右边的值,如果是返回true (A>=B)返回false
<= 小于等于号,检测左边的值是否小于等于右边的值,如果是返回true (A<=B)返回true

案例:select * from user where binary name='DUCK'其中binary是区别大小写的,删掉binary是不区分大小写的
delete删除记录语句
delete from 表名 where 条件;
例子:

mysql> use duck;
Database changed
mysql> DELETE FROM user WHERE id=3;
Query OK, 1 row affected (0.23 sec)

like模糊查询语句
select 字段1,字段2 from 表名 where 字段1 like and/or 字段2="字段值";

1. like语句中使用%字符来表示任意字符
2. 如果没有使用%,like语句和=的效果相同
3. where语句中可指定任何条件,包括like语句
4. like通常和%一同使用,类似于一个元字符的搜索
5. 可以使用and或者or指定一个或者多个条件
6. 可以在delete或者update命令中使用where…like语句来指定条件

案例(获取user表name字段以fen结尾的记录)

mysql> use duck;
Database changed
mysql> SELECT * FROM user WHERE name LIKE '%fen';
+----+-------+--------+-----------+
| id | pass | name | date |
+----+-------+--------+-----------+
| 3 | 123456 | qifen | 2015-05-01 |
| 4 | 123456 | fenfen | 2016-03-06 |
+----+-------+--------+-----------+
2 rows in set (0.01 sec)

union操作符

union操作符用于连接两个以上的select语句的结果组合到一个结果集合中多个select语句会删除重复的数据
语法:
select 列名1,列名2 from 表名 where 条件 union [all|distinct] select 列名1,列名2 from 表名 where 条件;

1. 删掉结果集合中重复的数据,默认情况下unicn操作符已经删除了重复的数据,所以distinct修饰符对结果无影响
2. 返回所有结果集,包含重复数据

案例1(列出Websites和apps表相同的country字段,并且不去重)

SELECT country FROM Websites
UNION DISTINCT
SELECT country FROM apps
ORDER BY country;

案例2(从Websites和apps表中选取所有的country列等于CN的数据,并且重复)

SELECT country, name
FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name
FROM apps
WHERE country='CN'
ORDER BY country;

mysql排序
select 字段1,字段2 from 表名1,表名2 order by 字段1 [ASC [DESC][默认 ASC]],字段2 [ASC [DESC][默认 ASC]]

1. 可以使用任何字段来作为排序的条件,从而返回排序后的查询结果
2. 可以设置多个字段来排序
3. 使用ASC或DESC关键字来设置查询结果是按升序或降序排列,默认升序

案例(根据id字段升序和降序)

SELECT * from user ORDER BY id ASC;
SELECT * from user ORDER BY id DESC;

group by语句

语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数

SELECT 列名, function(列名) FROM 表名 WHERE 条件 GROUP BY 列名;
案例(将数据表按名字经行分组,并统计每条记录的个数)

mysql>SELECT name, COUNT(*) FROM  user GROUP BY name;
+--------+----------+
| name   | COUNT(*) |
+--------+----------+
|小丽 |        1 |
| 小明 |        3 |
| 小王 |        2 |
+--------+----------+
3 rows in set (0.01 sec)

多表查询join关键字

inner join(内连接,等值连接)获取两个表中字段匹配关系的记录,inner join(也可以省略 inner 使用 join,效果一样)
left join(左连接)获取左表所有记录,即使右表没有对应匹配的记录
right join (右连接)用于获取右表所有记录,即使左表没有对应匹配的记录

inner join例子

连接两个有相同字段的表来读取所有author字段

mysql>select a.id,a.author,b.count from table1 a inner join table2 b on a.author = b.author;

+----------+------------+----------+
| a.id | a.author | b.count |
+----------+------------+----------+
| 1 | 七分 | 10 |
| 2 | 七分 | 10 |
| 3 | qifen | 20 |
| 4 | qifen | 20 |
+----------+------------+----------+

left join例子

以left_table为左表,right_table为右表,该语句会读取左边的数据表left_table的所有选取的字段数据,即便在右侧表right_table中 没有对应的author字段值

mysql>select a.id,a.author,b.count from left_table a left join right_table b on a.author =b.author;
+----------+------------+----------+
| a.id | a.author | b.count |
+----------+------------+----------+
| 1 | 七分 | 10 |
| 2 | 七分 | 10 |
| 3 | qifen | 20 |
| 4 | qifen | 20 |
| 5 | DK | NULL | 
+----------+------------+----------+

right join例子

以left_table为左表,right_table为右表,该语句会读取右边的数据表right_table的所有选取的字段数据,即便在左侧表left_table中没有对应的author字段值

mysql>select a.id,a.author,b.count from right_table a right join left_table b on a.author =b.author;
+----------+------------+----------+
| a.id | a.author | b.count |
+----------+------------+----------+
| 1 | 七分 | 10 |
| 2 | 七分 | 10 |
| 3 | qifen | 20 |
| 4 | qifen | 20 | 
| NULL | NULL | 22 |
+----------+------------+----------+

null值处理

1. IS NULL: 当列的值是 NULL,此运算符返回 true
2. IS NOT NULL: 当列的值不为 NULL, 运算符返回 true
3. <=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true
4. NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false,mysql中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符

案例

#查看user表中nickname为null的记录
SELECT * FROM user WHERE nickname IS NULL;
#查看user表中nickname不为null的记录
SELECT * FROM user WHERE nickname IS NOT NULL;

mysql正则表达式

MySQL中使用 REGEXP 操作符来进行正则表达式匹配

模式 描述
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
[…] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^…] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。
p1 p2
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

正则表达式案例

例1查找name字段中以st为开头的所有数据

mysql> SELECT name FROM user WHERE name REGEXP '^st';

例2查找name字段以ok为结尾的所有数据

mysql> SELECT name FROM user WHERE name REGEXP 'ok$';

例3查找name字段中包含mar字符串的所有数据

mysql> SELECT name FROM user WHERE name REGEXP 'mar';

例4查找name字段中以元音字符开头或以ok字符串结尾的所有数据

mysql> SELECT name FROM user WHERE name REGEXP '^[aeiou]|ok$';

mysql事务

一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事务控制语句

BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认

案例1(事务提交)

mysql> begin;
# 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into user  value(5);
Query OK, 1 rows affected (0.01 sec)
mysql> insert into user value(6);
Query OK, 1 rows affected (0.00 sec)
mysql> commit;
# 提交事务
Query OK, 0 rows affected (0.01 sec)

案例2(事务回滚)

mysql> begin;
# 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into user values(7);
Query OK, 1 rows affected (0.00 sec)
mysql> rollback; 
# 回滚数据,上面的插入语句无数据
Query OK, 0 rows affected (0.00 sec)

alter修改表结构语句

删除表中的age字段

alter table user drop age;

添加age字段到表

alter table user add age int;

first关键字(添加sex字段到第一列)

alter table user add sex int first;

after关键字(添加sex字段到指定字段的后面)

alter table user add sex int after;

modify关键字(把sex字段的类型从int(1)改为char(1)类型)

alter table user modify sex char(1);

change关键字(修改字段名sex char(1)为isex int(1))

alter table user change sex isex int(1);

修改字段默认值(修改字段age为not null且默认值为100)

alter table user modify age int not null default 100;

以上任何alter修改后可用show columns from 表名;查看表结构

设置表的引擎为myisam并查看

#设置表引擎
alter table user engine=myisam;
#查看表状态信息
show table status like 'user';

修改表名user为new_user

alter table user rename to new_user;

mysql复制表

查看创建表的语句并且格式化(\G)

mysql> show create table test \G;
*************************** 1. row ***************************
       Table: test
Create Table: CREATE TABLE `test` (
  `id` int(5) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL,
  `sex` varchar(5) DEFAULT '男',
  KEY `id1` (`sex`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

使用上面的创建表语句创建表,把test中的数据复制到test1表,前提是两个表的字段相同

insert into test1(id,name,sex) select id,name,sex from test;

获取mysql信息

命令 描述
select version(); mysql版本信息
select databse(); 当前数据库(或者返回空)
select user(); 当前用户名
show status; 服务器状态
show variables; 数据库配置变量

设置主键字段自增
修改表为主键并自增

alter table user modify id primary key auto_increment;

修改表主键从100开始自增(主键才能设置自增)

alter table user auto_increment = 100;

数据唯一性
可以设置表中指定字段为primary key(主键)或者unique(唯一)索引来保证数据唯一性

案例1:
设置双主键模式来设置多列数据的唯一性,如果设置双主键,默认值不能为null,所以需要设置not null,设置之后字段无法插入空值和重复值

create table test2(
id int not null not null,
name varchar(10) not null,
sex char(10),
primary key(id,name)
);

案例2:
insert ignore intoinsert into的区别就是前者会忽略插入已经存在的记录,并且不会报错,也不会插入重复的记录

mysql> INSERT IGNORE INTO test (name, sex) VALUES( 'qifen', '男');
    Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)  VALUES( 'duck', '女');
    Query OK, 0 rows affected (0.00 sec)

过滤重复数据
如果你需要读取不重复的数据可以在select语句中使用distinct关键字来过滤重复数据
案例方法1使用distinct关键字

select distinct id,name from test;

案例方法2使用group by语句

select name from test group by (name);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!