MySQL学习【第06篇】MySQL客户端工具及SQL讲解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_44558760/article/details/88790945

一、客户端命令介绍

1、help

mysql> help
mysql> help contents
mysql> help select
mysql> help create
mysql> help create user
mysql> help status
mysql> help show
......

2、mysql

#MySQL接口自带的命令
\h = help = ?		查看帮助
\G			格式化查看数据(key:value)
\T = tee		记录日志
\c(5.7可以ctrl+c)	结束命令
\s = status             查看状态信息
\. = source             导入SQL数据
\u = use                使用数据库
\q = exit = quit	退出

3、mysqladmin

#查看MySQL存活状态 
[root@db01 ~]# mysqladmin -uroot -p123 ping

#查看MySQL状态信息
[root@db01 ~]# mysqladmin -uroot -p123 status

#关闭MySQL进程
[root@db01 ~]# mysqladmin -uroot -p123 shutdown

#查看MySQL参数
[root@db01 ~]# mysqladmin -uroot -p123 variables

#删除数据库
[root@db01 ~]# mysqladmin -uroot -p123 drop DATABASE(库名)

#创建数据库
[root@db01 ~]# mysqladmin -uroot -p123 create DATABASE(库名)

#重载授权表
[root@db01 ~]# mysqladmin -uroot -p123 reload

#刷新日志
[root@db01 ~]# mysqladmin -uroot -p123 flush-log

#刷新缓存主机
[root@db01 ~]# mysqladmin -uroot -p123 reload

#修改口令
[root@db01 ~]# mysqladmin -uroot -p123 password

4、mysqldump

#备份数据库和表的内容
mysqldump -u root -p --databases 数据库1 数据库2 > xxx.sql

5、source

#在MySQL中处理输入文件,如果这些文件包含SQL语句则称为:

#导入sql(批处理文件)
1)mysql> source /data/mysql/world.sql 

2)mysql> \. /data/mysql/world.sql 

3)[root@db02 ~]# mysql</data/mysql/world.sql  #使用非交互式(脚本文件,会自动创建库)

二、SQL语句

1、SQL概述

1)什么是SQL?

结构化的查询语句

2)SQL的种类?

1、DDL:数据定义语言
库对象:库名字、库属性
开发规范:库名小写

2、DCL:数据控制语言
针对权限进行控制

3、DML:数据操作语言
操作表的数据行信息

4、DQL:数据查询语言
select:基础用法

2、DDL:数据定义语言

Data Definition Language

1)创建库:create database/schema

#创建oldboy数据库
mysql> create database oldboy;

#创建OLDBOY数据库(区分大小写)
mysql> create database OLDBOY;

#查看数据库
mysql> show databases;

#查看oldboy的创建语句(DQL)
mysql> show create database oldboy;

#查看创建数据库语句帮助
mysql> help create database

#创建lhl数据库添加属性
mysql> create database lhl charset utf8;

2)删除库:drop database

#删除test数据库
mysql> drop database test;

3)修改定义库:alter database

#修改oldboy数据库属性
mysql> alter database oldboy charset gbk;

#查看oldboy的创建语句(DQL)
mysql> show create database oldboy;

4)表对象:列名、列属性、约束

创建表

创建表:create table (开发做)
#查看创建表语句帮助
mysql> help create table

#创建表
mysql> create table student(
sid INT,
sname VARCHAR(20),
sage TINYINT,
sgender ENUM('m','f'),
cometime DATETIME);


数据类型
int: 整数 -2的31次方 ~ 2的31次方 -1
varchar:字符类型 (变长)
char: 字符类型 (定长)
tinyint: 整数 -128 ~ 128
enum: 枚举类型
datetime: 时间类型 年月日时分秒

创建表其他属性

#创建表加其他属性
mysql> create table student(
sid INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sname VARCHAR(20) NOT NULL COMMENT '学生姓名',
sage TINYINT UNSIGNED COMMENT '学生年龄',
sgender ENUM('m','f')  NOT NULL DEFAULT 'm' COMMENT '学生性别',
cometime DATETIME NOT NULL COMMENT '入学时间') charset utf8 engine innodb;

#查看表
mysql> show tables;

#查看表中列的定义信息
mysql> desc student;

#查看建表语句
mysql> show create table student;

#删除表
mysql> drop table student;



数据属性
not null: 非空
primary key: 主键(唯一且非空的)
auto_increment: 自增(此列必须是:primary key或者unique key)
unique key: 单独的唯一的
default: 默认值
unsigned: 非负数
comment: 注释

修改表定义

修改表定义:alter table (开发做)

#修改表名
mysql> alter table student rename stu;

#添加列和列定义
mysql> alter table stu add age int;

#添加多个列
mysql> alter table stu add test varchar(20),add qq int;

#指定位置进行添加列(表首)
mysql> alter table stu add classid varchar(20) first;

#指定位置进行添加列(指定列)
mysql> alter table stu add phone int after age;

#删除指定的列及定义
mysql> alter table stu drop test;

#修改列及定义(列属性)
mysql> alter table stu modify sid varchar(20);

#修改列及定义(列名及属性)
mysql> alter table stu change phone telphone char(20);

3、DCL:数据控制语言

Data Control Language

1)grant

#授权[email protected]用户所有权限(非超级管理员,没有创建权限)
mysql> grant all on *.* to lhl@'localhost' identified by 'oldboy123';

#怎么去授权一个超级管理员呢?
mysql> grant all on *.* to lhl@'localhost' identified by '123456' with grant option;

#其他参数(扩展)
max_queries_per_hour:一个用户每小时可发出的查询数量
max_updates_per_hour:一个用户每小时可发出的更新数量
max_connections_per_hour:一个用户每小时可连接到服务器的次数
max_user_connections:允许同时连接数量

#创建lhl用户只允许同时两个终端连接
mysql> grant all on *.* to lhl@'%' identified by '123456' with max_user_connections 2;

2)revoke

#收回select权限
mysql>  revoke select on *.* from lhl@'localhost';

#查看权限
mysql> show grants for lhl@'localhost';

#得出ALL的所有权限
SELECT ,INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE

4、DML:数据操作语言

Data Manipulation Language

1)insert

mysql> desc stu;
+----------+---------------------+------+-----+---------+-------+
| Field    | Type                | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| classid  | varchar(20)         | YES  |     | NULL    |       |
| sid      | varchar(20)         | NO   | PRI |         |       |
| sname    | varchar(20)         | NO   |     | NULL    |       |
| sage     | tinyint(3) unsigned | YES  |     | NULL    |       |
| sgender  | enum('m','f')       | NO   |     | m       |       |
| cometime | datetime            | NO   |     | NULL    |       |
| age      | int(11)             | YES  |     | NULL    |       |
| telphone | char(20)            | YES  |     | NULL    |       |
| qq       | int(11)             | YES  |     | NULL    |       |
+----------+---------------------+------+-----+---------+-------+
9 rows in set (0.00 sec)

#基础用法,插入数据(每一列都需要添加)
mysql> insert into stu values(每一列的值都需要一一对应填写)
mysql> insert into stu values(2,3,'lhl',30,'f',NOW(),10,11,11);

#规范用法,插入数据(默认的值可以不用填写)
mysql> insert into stu(每一列都需要添加)values(默认的值可以不用填写)
mysql> insert into stu(classid,sid.sname,sage,sgender,comtime,age,telphone,qq) values('lhl',30,'f',NOW());

#插入多条数据
mysql> insert into stu(每一列都需要添加)values(默认的值可以不用填写),values(默认的值可以不用填写);
mysql> insert into stu(classid,sid.sname,sage,sgender,comtime,age,telphone,qq) values('lhl',30,'f',NOW()),('lhl',30,'f',NOW());

2)update

#不规范
mysql> update student set sgender='f';

#规范update修改
mysql> update student set sgender='f' where sid=1;

#如果非要全表修改
mysql> update student set sgender='f' where 1=1;

3)delete

#不规范
mysql> delete from student;

#规范删除(危险)
mysql> delete from student where sid=3;

#DDL删除表
mysql> truncate table student;

4)伪删除

#使用update代替delete

1)额外添加一个状态列
mysql> alter table student add status enum(1,0) default 1;

2)使用update
mysql> update student set status='0' where sid=1;

3)应用查询存在的数据
mysql> select * from student where status=1;

5、DQL:数据查询语言

1)select基础

#常用用法(查询city表中的某两列)
mysql> select countrycode,district from city;

#查询单列
mysql> select countrycode from city;

#行级查询(ID从2开始,显示5行)
mysql> select countrycode,district from city limit 2;
mysql> select id,countrycode,district from city limit 2,5;

#条件查询
mysql> select name,population from city where countrycode='CHN';

#多条件查询
mysql> select name,population from city where countrycode='CHN' and district='heilongjiang';

#模糊查询
mysql> select name,population,countrycode from city where countrycode like '%H%' limit 10;

#排序查询(顺序)
mysql> select id,name,population,countrycode from city order by countrycode limit 10;

#排序查询(倒叙)
mysql> select id,name,population,countrycode from city order by countrycode desc limit 10;

#范围查询(>,<,>=,<=,<>[不等于])
mysql> select * from city where population>=1410000;

#范围查询OR语句
mysql> select * from city where countrycode='CHN' or countrycode='USA';

#范围查询IN语句
mysql> select * from city where countrycode in ('CHN','USA');

2)select深入

集合:交集、并集、差集

#根据两张表的内容查出张三的成绩
[zhang3,li4,wang5]

[50,70,80]

t1:
id 1 2 3
name zhang3 li4 wang5

t2:
id 1 2 3
score 50 70 80

范式: 减少数据冗余,防止产生一致性问题,把一个表作为一个原子,把一张表拆到不能再拆为止。(开发阶段设计规范)

1)创建t1表
mysql> create table t1(id int not null primary key auto_increment,name varchar(20) not null);

2)创建t2表
mysql> create table t2(id int not null primary key auto_increment,score int not null default 0);

3)查看t1和t2表
mysql> select * from t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | zhang3 |
|  2 | li4    |
|  3 | wang5  |
+----+--------+
3 rows in set (0.00 sec)

mysql> select * from t2;
+----+-------+
| id | score |
+----+-------+
|  1 |    50 |
|  2 |    70 |
|  3 |    80 |
+----+-------+
3 rows in set (0.00 sec)

4)查出张三的成绩
mysql> select t1.name,t2.score from t1,t2 where t1.id=t2.id and t1.name='zhang3';
+--------+-------+
| name   | score |
+--------+-------+
| zhang3 |    50 |
+--------+-------+
1 row in set (0.00 sec)

3)传统连接(只能内连接,取交集)

#世界上小于100人的人口城市是哪个国家的?

mysql> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 rows in set (0.00 sec)

国家人口数量:country.population
城市名:city.name
国家名:country.name
语言:countrylanguage.language

select city.name,city.countrycode,country.name 
from city,country 
where city.countrycode=country.code 
and city.population<100; 

4)NATURAL JOIN(自连接的表要有共同的列名字)

SELECT city.name,city.countrycode ,countrylanguage.language ,city.population
FROM  city NATURAL  JOIN  countrylanguage 
WHERE population > 1000000
ORDER BY population;

5)企业中多表连接查询(内连接)

select city.name,city.countrycode,country.name 
from city join country on city.countrycode=country.code 
where city.population<100;

建议:使用join语句时,小表在前,大表在后。

6)外连接

select city.name,city.countrycode,country.name 
from city left join country 
on city.countrycode=country.code 
and city.population<100;

7)UNION(合并查询)

#范围查询OR语句
mysql> select * from city where countrycode='CHN' or countrycode='USA';
#范围查询IN语句
mysql> select * from city where countrycode in ('CHN','USA');
替换为:
mysql> select * from city where countrycode='CHN' 
union  all
select * from city where countrycode='USA' limit 10

union:去重复合并
union all :不去重复
使用情况:union<union all

三、字符集

1、什么是字符集?
字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

2、MySQL数据库的字符集
1)字符集(CHARACTER)character
2)校对规则(COLLATION)collation

3、MySQL中常见的字符集
1)UTF8
2)LATIN1
3)GBK

4、常见校对规则
1)ci:大小写不敏感
2)cs或bin:大小写敏感

5、查看字符集和校对规则
1)mysql> show charset;         #查看字符集
2)mysql> show collation;       #查看校对规则

6、字符集设置

1)操作系统级别

CentOS 6.X
[root@db01 ~]# source /etc/sysconfig/i18n
[root@db01 ~]# echo $LANG
zh_CN.UTF-8

CentOS 7.X
[root@db02 ~]# cat /etc/locale.conf
LANG="en_US.UTF-8"

2)操作系统客户端级别(SSH)

3)MySQL实例级别

1、在编译安装时候就指定如下服务器端字符集。
cmake . 
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \

2、在配置文件中设置字符集
character-set-server=utf8

4)建库级别

mysql> create database oldboy charset utf8 default collate = utf8_general_ci;

5)建表级别

mysql>  CREATE TABLE 'test'(
'id' int(4) NOT NULL AUTO_INCREMENT,
'name' char(20) NOT NULL,
PRIMARY KEY ('id')
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

7、解决乱码问题

#1. 修改配置文件
[mysqld]
default-character-set=utf8 
[client]
default-character-set=utf8 
[mysql]
default-character-set=utf8

#mysql5.5以上:修改方式有所改动
    [mysqld]
    character-set-server=utf8
    collation-server=utf8_general_ci
    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8

#2. 重启服务
#3. 查看修改结果:
\s
show variables like '%char%'

永久解决编码问题

 show variables like 'char%';  查看编码 

猜你喜欢

转载自blog.csdn.net/weixin_44558760/article/details/88790945