MySQL基础知识

对MySQL基础内容的整理,包括配置及遇到的问题,SQL基本操作语句。

作者 jooop 日期 2016-10-22
MySQL基础知识

MySQL基本配置及问题

一、MySQL配置

1.下载解压
2.将mysql目录下bin设置到Path
3.在mysql目录下新建文本文档,改名为my.ini,按照下面内容配置my.ini

[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
basedir="D:\mysql-5.7.16-winx64"
datadir="D:\mysql-5.7.16-winx64\data"
port=3306
server_id=1
[WinMySQLadmin]
Server=D:\mysql-5.7.16-winx64\bin\mysqld.exe

  • 其中:
    以下内容改为自己的mysql放置目录。

    basedir="D:\mysql-5.7.16-winx64"
    datadir="D:\mysql-5.7.16-winx64\data"
    Server=D:\mysql-5.7.16-winx64\bin\mysqld.exe
  • 注:使用其他编辑器编写该文件时使用UTF-8无BOM格式编码。不然后面命令会报错Found option without preceding group in config file。

4.安装MySQL服务:打开cmd命令提示符, 执行命令:mysqld --install安装服务,提示”Service successfully installed.”表示成功;

5.执行mysqld.exe --initialize 命令,创建data

6.启动:net start MySQL

7.卸载方法:
(1). sc delete MySQL卸载服务
(2). 清除path下的文件路径
(3). 清除注册表文件。

二、登陆MySQL

mysql -u root -p
--提示输入密码,初始默认为空,进入后可以修改密码
mysql>set password =password('你的密码');
mysql>flush privileges;

三、解决MySQL 5.7密码忘记

  1. 在任务管理器中结束mysqld.exe进程,确保mysql服务器端已结束运行。
  2. 打开cmd命令提示符,进入mysql.exe所在的文件夹(例如:D:\mysql-5.7.16-winx64\bin)
  3. 输入命令 mysqld --skip-grant-tables 回车,此时就跳过了mysql的用户验证。
  4. 此时该窗口命令行无法操作,打开一个新的命令行,直接输入mysql,不需要带任何登录参数直接回车登陆上数据库。
  5. 输入show databases;可以看到所有数据库说明成功登陆.
  6. 输入 use mysql;选择mysql数据库。
  7. 输入update MySQL.user set authentication_string=password('root') where user='root' ;修改密码。
  8. 重新打开dos再次登陆后若提示ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
    输入命令,重新设置密码即可解决。SET PASSWORD = PASSWORD('123456');

常用命令

一、对数据库的操作

1.增删查改数据库

--1.查看所有的数据库
mysql> show databases;
--2.查看当前使用的哪个数据库,如下为null的话表示没有使用。
-mysql> select database();
+------------+
| database() |
+------------+
| NULL |
+------------+
--3.创建名为mydb的数据库
mysql> create database mydb;
--4.查看mydb的编码格式。(默认编码格式在my.ini文件中配置,此处默认配置编码为utf-8)
mysql> show create database mydb;
+----------+---------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------+
| mydb | CREATE DATABASE `mydb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
--5.选择使用mydb数据库
mysql> use mydb;
Database changed
--6.查看当前的数据库包含什么表
mysql> SHOW TABLES;
--7.删除数据库mydb
mysql> drop database mydb;

2.备份与恢复数据库

注:
备份操作需要在dos命令行下执行。
恢复操作需要在mysql控制台操作。

--1.备份数据库
--新打开一个dos窗口,不要登录数据库
--(下面命令为将mydb数据库备份到D盘mydb1.sql中)
mysqldump -u root -p mydb > D:/mydb1.sql
--2.恢复数据库
--进到mysql控制台,创建一个新的空的数据库,使用它,进行回复操作
--(下面命令为新建mydb2数据库,选择使用mydb2,将d盘下mydb1.sql中文件恢复至mydb2中)
mysql> create database mydb2;
mysql> use mydb2;
mysql> source d:/mydb1.sql

mysql显示中文乱码问题:

  1. show variables like 'char%';查看字符编码集。
  2. 若都为utf8,查看当前控制台字符集格式(win下dos一般为GBK)。
  3. 设置返回字符集格式为utf8set character_set_results=gbk;

二、对表的操作

1.创建表

create table 表名(
列名 列的数据类型,
......
)character set 字符集名称 //不写默认按数据库字符集类型
--eg:
create table users(
id int,
name varchar(64),
pwd varchar(64),
birthday date);

2.修改表结构

--查看数据表的结构
desc 表名;
--或者
show columns from 表名;
--添加新的列
alter table 表名 add 列名 数据类型
--修改列的类型和大小
alter table 表名 modify 列名 新的数据类型
--修改列名、类型和大小
alter table 表名 change column 原列名 新列名 新的数据类型;
--删除某列
alter table 表名 drop 列名
--修改表名
rename table 原表名 to 新表名
--修改表的字符集
alter table 表名 character set 字符集名;
--查看创建表时所用的指令
show create table 表名

desc表时key栏的解释

使用MySQL数据库desc 表名时,我们看到Key那一栏,可能会有4种值,即 ‘ ‘,’PRI’,’UNI’,’MUL’。

  • 如果Key是空的,那么该列值的可以重复,表示该列没有索引,或者是一个非唯一的复合索引的非前导列;
  • 如果Key是PRI,那么该列是主键的组成部分;
  • 如果Key是UNI,那么该列是一个唯一值索引的第一列(前导列),并别不能含有空值(NULL);
  • 如果Key是MUL,那么该列的值可以重复,该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL。
  • 如果对于一个列的定义,同时满足上述4种情况的多种,比如一个列既是PRI,又是UNI,那么”desc 表名”的时候,显示的Key值按照优先级来显示 PRI->UNI->MUL。那么此时,显示PRI。
  • 一个唯一性索引列可以显示为PRI,并且该列不能含有空值,同时该表没有主键。
  • 一个唯一性索引列可以显示为MUL,如果多列构成了一个唯一性复合索引,因为虽然索引的多列组合是唯一的,比如ID+NAME是唯一的,但是没一个单独的列依然可以有重复的值,只要ID+NAME是唯一的即可。

三、CRUD语句

1.Insert

insert into 表名 (列名.....) values (值....);

  • 插入的数据应与字段的数据类型相同。
  • 数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
  • 字符和日期型数据应包含在单引号中。
  • 插入空值,不指定或insert into table value(null)
  • 在values中列出的数据位置必须与被加入的列的排列位置相对应。
    eg:

    create table test (id int ,name varchar(64));
    insert into test (id,name) values(3,’aaa’);
    insert into test (name,id) values(’aaa’,3);
  • 若values全部对应写出,则可省略列名。

2.Update

update 表名 set 列名=表达式 ... where 条件

  • UPDATE语法可以用新值更新原有表行中的各列。
  • SET子句指示要修改哪些列和要给予哪些值。
  • WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。

3.Delete

delele from 表名 where 条件;

  • 若不使用where子句,将删除表中所有数据。
    所有要小心使用.
  • Delete语句不能删除某一列的值(可使用update)
  • 使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。
  • 同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。
  • 删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,truncate table 表名,可以删除表的记录,速度快,但不能回滚。

mysql中事务的特殊说明:

(1). mysql 控制台是默认自动提交事务(dml)
(2). 要在控制台使用事务应:
set autocommit=false;
savepoint 保存点
//操作…
rollback to 保存点

4.Select

select [distinct] 列名....(可运算) from 表名 where 条件;

  • Select 指定查询哪些列的数据。
  • column指定列名。
  • 号代表查询所有列。
    `select
    from 表名;`
  • From指定查询哪张表。
  • DISTINCT可选,指显示结果时,是否剔除重复数据
    select distinct 列名 from 表名
  • 列可参与运算
    select 列名1+列名2+... from 表名 whrer 条件
  • 列名可用as显示别名
    select 列名 as '别名' from 表名 where 条件

(1).where子句中常用的运算符

enter image description here

(2).order by 子句

select 列名1+列名2+... as '别名' from 表名 where 条件 order by '别名' desc;
对查询结果排序
最后加:
asc升序(默认)
desc降序

分页查找:

select * from 表名 where 条件 limit 起始行 输出行数

  • 起始行从0开始计算。
  • 输出行数表示从起始行开始输出多少行的数据。

5.其他函数

(1).count

select count(*)|count(列名) from 表名 where 条件;
返回满足条件的某一列(行)的总数

(2).sum

select sum(列名){,sum列名} from 表名 where 条件;
对满足条件列的数值求和,返回该列中各行的数值的总和

  • sum仅对数值列有效
  • 对多列求和不能缺少“,”,eg:select sum(列名),sum(列名),sum(列名) from 表名;
  • 对多个列求总和,eg:select sum(列名1+列名2+...) from 表名;

(3).avg

select avg(列名){,avg列名} from 表名 where 条件;
返回满足where条件的一列的平均值

  • 条件、用法同sum。
  • 若某一行数值为“null”,则该行不参与平均;若为“0”则参与平均

(4).max/min

select max(列名) from 表名 where 条件;
返回满足where条件的一列的最大值

(5).group by

select 列名 from 表名 group by 待分组列名
对group by子句中的列进行分组

(6).having

select 列名 from 表名 group by 待分组列名 having 条件

  • having和where均可实现过滤,但having和以使用合计函数,通常跟在group by后,作用于组。
  • 顺序:group by ……having……order by……

(7).日期和时间函数

enter image description here

select current_date() from dual;//得到当前日期
select date(now()) from dual//得到当前日
select * from 表名 where date_add(日期数据的列名, interval 2 hour) >= now()//得到日期数据的列名下,距今两个小时内的数据

  • where date_add(日期/date/datetime/timestamp, interval 数字 type)
    type类型可以是:microsecond;second;minute;hour;day;week;month;quarter;year

(8).字符串函数

enter image description here
select charset(列名) from 表名//查看某列所用的字符集格式


四、定义表的约束

1、主键约束

primary key:

  • 主键:用于唯一标识一条记录的约束,一张表最多只能有一个主键,不能为null,不允许为空,不允*许重复。
  • 用法:创建表时写在要设为主键的列的定义后,不需要分隔符。
  • 删除主键:alter table tablename drop primary key;

2、主键自动增长

auto_increment

  • 用法:同上。

3、唯一约束

unique

  • 表的某列的值不能重复,可以为null(null可重复),表中可以有多个unique。

4、非空约束

not null

  • MySQL中列的值默认可以为空,若不允许其为空则需not null说明

5、外键约束

foreign key

  • 先建主表,在建从表
  • 用法:
    • 在创建从表时,定义:
      constraint 外键名称 foreign key(从表的外键列名) references 主表名(从表要指向的列)
    • 从表只能指向主表的主键列或者unique。
    • 外键列的数据类型和主表列的数据类型要一样。
    • 外键的值要么为null;要么需要在主表列中存在。
    • 外键可以指向本表的主键/unique列。
    • 外键名前缀:fk,主键名前缀:pk

MySQL的数据类型

一、数值型

1.bit(m)

m默认为 1 最大 64

2.tinyint [unsigned]

如果是有符号则表示 -128 到 127 ,如果是无符号 0-255
eg:
create table test3(num tinyint) – -128 到 127
create table test4(num tinyint unsigned) 0 — 255

3.smallint

samllint 是两个字节表示的.
带符号是 负的2的15次方 到 2的15次方-1 ,无符号 2的16方 -1

4.其它的数值类型

enter image description here

5.float

FLOAT[(M,D)] [UNSIGNED] 是定长
m:表示有效位。d:表示小数点有几位。
eg:
create table test5( num float);
create table test6(num float(5,1));

6.double

其用法和float 类似,只是表示的范围更大,也是定长

7.numeric(m,d)

用于表示小数,或者整数
eg:
create table test7 (num numeric); //这样其实就是可以存放整数.
create table test8 (num numeric(5,2));//这样就可以表示 有效为5,小数点有两位的数

二、字符串型

一览图:

enter image description here

常用的有

1.char(m)

m 范围是 0-255, 定长.
char(10) 若存放 ‘abc’ 字串,实际在表示 ‘abc        ’;
eg:
create table test11 (name char(20));

2.varchar(m)

m 表示大小 ,范围 0-65535, 变长
varchar(20) 若存放 ‘abc’ 字串,实际在表示 ‘abc’;
建议:
若表的某列长度固定,比如 产品编号..学号. .. 而且在 255内,应当使用char
若长度不能取得,或者长度 大于255 小于 65535 则使用varchar

3.text

该类型可以表示更大的字串.

三、日期类型

1.date

日期 (年-月-日)
create table test12(birthday date);
对于date 只保存 年-月-日

2.datetime

日期时间类型
create table test13(hiredate datetime);

3.timestamp

邮戳: 该类型可以保存 年-月-日 : 时:分:秒
和datetime 最大的区别:当 update 某条记录的时候,该列值自动更新
create table test14 (name varchar(64) , sal float, hiredate1 timestamp, hiredate2 datetime);


参考文章:

Mysql命令desc:获取数据表结构
21分钟 MySQL 入门教程
韩顺平MySQL视频讲解