⼀、数据库基本概念
数据库是存放数据的仓库。它的存储空间很⼤,可以存放百万条、千万条、上亿条
数据。但是数据库并不是随意地将数据进⾏存放,是有⼀定的规则的,否则查询的
效率会很低。
常⻅的数据库:
MySQL简介
MySQL最早是由瑞典的MySQL AB公司开发的⼀个开放源码的关系数据库管理系
统,该公司于2008年被昇阳微系统公司(Sun Microsystems)收购。在2009年,
甲⻣⽂公司(Oracle)收购昇阳微系统公司,因此在这之后MySQL成为了Oracle
旗下产品。
MySQL在过去由于性能⾼、成本低、可靠性好,已经成为最流⾏的开源数据库,
因此被⼴泛地应⽤于中⼩型⽹站开发。随着MySQL的不断成熟,它也逐渐被应⽤
于更多⼤规模⽹站和应⽤,⽐如维基百科、⾕歌(Google)、脸书
(Facebook)、淘宝⽹等⽹站都使⽤了MySQL来提供数据持久化服务。
甲⻣⽂公司收购后昇阳微系统公司,⼤幅调涨MySQL商业版的售价,且甲⻣⽂公
司不再⽀持另⼀个⾃由软件项⽬OpenSolaris的发展,因此导致⾃由软件社区对于
Oracle是否还会持续⽀持MySQL社区版(MySQL的各个发⾏版本中唯⼀免费的版
本)有所担忧,MySQL的创始⼈⻨克尔·维德纽斯以MySQL为基础,成⽴分⽀计
划MariaDB(以他⼥⼉的名字命名的数据库)。有许多原来使⽤MySQL数据库的
公司(例如:维基百科)已经陆续完成了从MySQL数据库到MariaDB数据库的迁
移
sudo apt-get install -y mysql-server mysql-client
#⾸次安装MySQL,可以使⽤下⾯的命令来找到默认的初始密码。
cat /var/log/mysqld.log | grep password
在实际开发中,为了⽅便⽤户操作,可以选择图形化的客户端⼯具来连接MySQL
服务器,包括:
MySQL Workbench(官⽅提供的⼯具)
Navicat for MySQL(界⾯简单优雅,功能直观强⼤)
SQLyog for MySQL(强⼤的MySQL数据库管理员⼯具)
⼆、SQL
基本可分为:
数据定义语⾔DDL (create、drop)
数据操作语⾔DML(insert、delete、update)
数据查询语⾔DQL(select、where、group by、order by 、limit)
数据控制语⾔DCL(grant、revoke)
事务处理语⾔TPL(commit、rolback)
三、操作数据库
命令:
mysql -h服务器地址 -u⽤户名 -p #不要再p后⾯直接跟密码
如果要远程连接mysql数据库,需要以下步骤:
1.通过mysql -u⽤户名 -p登录mysql数据库
2.创建⼀个新⽤户来远程连接
create user 'python'@'%' identified by '123'
GRANT ALL PRIVILEGES ON *.* TO 'python'@'%' IDENTIFIED BY
'123' WITH GRANT OPTION;
3.执⾏命令:flush privileges;
4.退出mysql,到/etc/mysql/mysql.conf.d下,编辑mysqld.cnf
找到 “bind-address = 127.0.0.1” , 这⼀⾏要注释掉,只需在前⾯加个
#
5.重启mysql服务
sudo service mysql restart | start | stop #重启、启动、停⽌
或者:sudo /etc/init.d/mysql restart | start | stop
6.如果开启了防⽕墙,请添加3306端⼝
sudo ufw allow 3306
#忘记mysql密码:
1.到/etc/mysql/mysqld.conf.d/,编辑mysqld.conf
sudo vim mysqld.conf
2.到[mysqld]下
添加:skip-grant-tables
保存退出
3.重启mysql服务:
sudo service mysql restart | stop | start
#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;
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 缺省,默认值
五、数据类型
#是⾃定义类型,可以多选⼀,实际上存的值是1,2,3...
alter table user add sex enum('男','⼥') default '男';
insert into user(name,password,sex)
values('tom','132','男');
values('tom','132',1);
类似复选框,可以存多个值
alter table student add hobby set('看电影','玩游戏','敲代码','烫 头')
insert into users(uid,hobby) values(22,1+2+4+8)
insert into users(uid,hobby) values(22,1|2|4|8)
insert into users(uid,hobby) values(22,'看电影,玩游戏,敲代码')
0001
0010
-------
0011
六、数据操作
1. 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;
2.update
update 表名 set 字段1=值1,字段2=值2... where 条件 #不加where修改的是所
有的记录
3. 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)
将结果集分组统计,规则:
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 是针对分组进⾏过滤
查询⼩结
mysql> show variables like 'character%'; #查看字符集
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |需要修改
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |需要修改
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
修改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 \G
下⾯的表格对MySQL⼏种常⽤的数据引擎进⾏了简单的对⽐。
通过上⾯的⽐较我们可以了解到,InnoDB是唯⼀能够⽀持外键、事务以及⾏
锁的存储引擎,所以我们之前说它更适合互联⽹应⽤,⽽且它也是较新的
MySQL版本中默认使⽤的存储引擎