• 学习笔记总结,比较多, 建议直接 ctrl + f 快速查询关键词。
  • 本文中可能有少量叠词,请多多包涵。
连接数据库

命令:

mysql -h服务器器地址 -u⽤用户名 -p #不要再p后面直接跟密码

数据库操作命令:
#1.查看库
show databases;
#2. 创建库
create database 数据库名 default charset=utf8;# 数据库名不要纯数
字,不要用汉字
#3. 删除库
drop database 数据库名;
#4. 选中库
use 数据库名;
#5. 查看表
show tables;
#6.查看数据库创建语句句
show create database 数据库名
#7.查看选中的数据库
select database()
#8 修改数据库字符集
alter database student default charset=utf8;

注意事项:
每条命令结束必须使用; 或者 \g 结束
退出mysql使用命令quit或exit


创建表:
create table [if not exists] 表名(
列名1 类型 [限制],
列名2 类型 [限制],
...
列列名n 类型 [限制] #最后⼀列列没有逗号
) [engine=myisam | innodb][ default charset=utf8];
primary key 主键 不允许有重复值,不允许为空
auto_increment ⾃增⻓,只对int型主键起作⽤
#复合主键
mysql> create table grade(
sid int ,
cid int,
score float,
primary key(sid,cid));

删除表

drop table 表名;

复制表结构

create table 表名 like 其他表名;

查看表结构

desc 表名;

查看建表语句

show create table 表名;

修改表

#### 修改字段类型
alter table 表名 modify 字段名 类型 [限制]

#增加字段
alter table 表名 add [column] 字段名 类型 [限制];

#删除字段
alter table 表名 drop [column] 字段名;

修改字段名和类型
alter table 表名 change [column] 旧字段名 新字段名 类型 [限制];

#修改表名
alter table 表名 rename 新表名
alter table 表名 [engine=myisam] [default charset=utf8];

#### 可以通过first、 after指定插⼊位置
alter table student add sno varchar(3) not null after sid; //在
sid列后插⼊入

alter table student add sid int primary key auto_increment
first;//在第⼀列插⼊

字段限制

primary key 不不允许空值,唯⼀一
not null ⾮非空
unique 唯⼀一
default 缺省,默认值

数据类型

char 和 varchar 的区别:

  • char的执行行效率高于varchar , varchar 相对于 char 节省存储空间
    如果使用char 传入的数据的长度 小于指定的长度的时候 存储的实际长度
    不不够的会拿空格来填充
  • 如果使用 varchar 传入的数据的长度 小于指定的长度的时候 存储的实际长度 为传进来的数据的长度

日期时间型

mysql 基础 教程 mysql实用教程_sql

枚举enum

#是⾃定义类型,可以多选一,实际上存的值是1, 2, 3...
alter table user add sex enum('男','⼥女女') default '男';

集合 set

类似复选框,可以存多个值
alter table student add hobby set('看电影','玩游戏','敲代码','烫
头')

增删改查

insert

写法⼀一: insert into 表名(字段1,字段2...) values(值1,值2...);
省略了字段列表,则按照建表时的字段顺序进⾏行插入,每一列都要给值
写法⼆: insert into 表名 values(值1,值2...);
写法三:插⼊入多个记录
insert into 表名(字段1,字段2...)
values(值1,值2...),
(值1,值2...),
(值1,值2...)....
写法四: insert into 表名(name,age,sex)
select name,age,sex from stars;
insert into histroy_student select * from student;

update

update 表名 set 字段1=值1,字段2=值2... where 条件 #不不加where修改的是所
有的记录

delete

删除表中的数据,⾃增主键的值不不会重新开始
delete from 表名 where 条件; #如果不加条件,会删除表中所有数据,慎重使⽤
alter table 表名 auto_increment = 5 # 设置自增主键开始值
清空表,⾃自增主键的值重新开始编号
truncate
truncate table 表名,清空表中所有记录,等价于delete from 表名;
delete和truncate差别, truncate后,表中自增主键值从1开始

数据查询

基本结构 : select 字段名列表 from 表名

1 基础查询 :

select username,password from user;
select usernname as ⽤用户名, password as 密码 from user; #可以给字段起
别名
select * from user; #查询所有字段,慎用,一般不不建议使⽤用,会导致无法优化
sql语句句
select 2018,username,password from user; #可以有常量量,表达式
select sname,2018-year(sbirthday) from student; #year是mysql的内置函数
select distinct username from user; #去除重复记录 distinct 针对查询结
果去除重复记录,不针对字段

2 条件查询 (where):

关系运算:

  • 关系运算符: > 、 >=、 <、 <=、 =、 !=、 <>、 between and
select username,password from user where uid <10
select username,password from user where uid != 10
select username,password from user where uid between 10 and 20
  • 逻辑运算
    逻辑运算符: and 、 or、 not
select username,password from user where uid < 100 and uid > 20;
select username,password from user where uid > 100 or uid < 20;
  • 集合运算
    集合运算符: in、 not in
select username,password form user where uid in (2,3,4)
select username,password form user where uid not in (2,3,4)
  • 判空
    判空运算: is null、 is not null
select username,password from user where username is null
  • 字符串串的模糊查询(like)
    通配符 _代表一个字符, %代表任意长度字符串串
select * from user where username like '王_';
select * from user where username like '王%';

3 排序(order by)
asc 升序(默认)、 desc 降序

select * from user order by age asc;
select * from user order by age desc;
多字段排序
select name,age from php_user_history order by age desc,name;#
如果在第⼀一列上有相同的值,在具有相同的age的记录上再按name升序排列

4 限制结果集(limit)
limit n # 取前n条记录
limit offset,n #从第offset条开始取,取n条

select * from php_user_history limit 3;
select * from php_user_history limit 4,2;
注意结果集中记录从0开始数数, offset相对于0开始
实现分页必须的技术点
limit (page-1)*num,num

5 集合函数

count统计结果集中记录数
max 最大值
min 最小值
avg 平均值,只针对数值类型统计
sum 求和,只针对数值类型统计
注意,集合函数不能直接使用在where后面的条件里,但可以在子查询中
select count(*) num from user;
select count(distinct age) num from user; //去除重复记录
select * from student where sno = max(sno);//错误

6 分组(group by)
将结果集分组统计,规则:
出现了groub by的查询语句句, select后面的字段只能是集合函数和group by后
面有的字段,不要跟其它字段
对分组进⾏行过滤,可以使用having

select uid, count(*) num from php_forum group by uid;
select uid,title, count(*) num from forum group by uid having
count(*) >=2;
having和where的区别:
where针对原始表进行过滤
having 是针对分组进行过滤

查询小结:
整体顺序不不能颠倒
[]表示可选,可以有也可以没有
select 字段 from 表名 [where 条件][group by ] [having][order by ] [limit]

8 字符集和存储引擎

  • 为了能够正常显示中文,必须把数据库的字符集设置为utf8
修改mysql的配置⽂文件
cd /etc/mysql/mysql.conf.d
sudo cp mysql.cnf mysql.cnf.bak
sudo vim mysql.cnf
在[mysqld]下增加一句:
character_set_server = utf8
保存并重启服务
sudo systemctl restart mysql.service #重启服务
  • 数据库引擎
    可以使⽤用show engines命令查看数据库引擎
show engines \G

mysql 基础 教程 mysql实用教程_mysql_02


通过上面的比较我们可以了了解到, InnoDB是唯⼀一能够支持外键、事务以及行行锁的

存储引擎,所以我们之前说它更适合互联网应用,而且它也是较新的MySQL版本

中默认使用的存储引擎。

  • myisam和innodb的区别
    myisam查询速度快,不支持事务、不支持外键、支持表锁
    innodb增删改效率高,支持事务、⽀支持外键,支持行锁