普及MySQL一些知识
默认监听端口号 3306
进程名 mysqld
所有者/组 mysql/mysql
数据传输协议 TCP
数据库目录 /var/lib/mysql/
服务名 mysqld(5.1) mysql(5.6)
主配置文件 /etc/my.cnf
MySQL的安装
1)安装系统自带的mysql 提供mysql服务
[root@stu ~]# yum -y install mysql-server 或 rpm -q mysql-server
[root@stu ~]# service mysqld status
mysqld 已停
[root@stu ~]# /etc/init.d/mysqld status
mysqld 已停
[root@stu ~]# /etc/init.d/mysqld start
[root@stu ~]# /etc/init.d/mysqld status
mysqld (pid 2965) 正在运行...
[root@stu ~]# netstat -utnalp | grep :3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2965/mysqld
[root@stu ~]# chkconfig --list mysqld
mysqld 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
[root@stu ~]# chkconfig mysqld on
[root@stu ~]# chkconfig --list mysqld
mysqld 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
查看mysql数据库是否运行的3种方法:
[root@stu ~]# ps aux | grep mysqld
[root@stu ~]# /etc/init.d/mysqld status
[root@stu ~]# netstat -utnalp | grep :3306
连接数据库服务器时
默认在没有授权的情况下,只允许数据库管理员root从本机登录且没有密码
[root@stu ~]# mysql -hlocalhost -uroot -p
Enter password:
........
mysql>quit
2)安装官网下载的mysql提供mysql服务
[root@stu ~]# /etc/init.d/mysqld stop
[root@stu ~]# rm -rf /etc/my.cnf
[root@stu ~]# rm -rf /var/lib/mysql/*
[root@stu ~]# rpm -q mysql-server mysql
[root@stu ~]# rpm -e --nodeps mysql-server mysql
[root@stu ~]# tar -xvf MySQL-5.6.rpm.tar
[root@stu ~]# rpm -Uvh MySQL-*.rpm
[root@stu ~]# rpm -qa | grep -i mysql
[root@stu ~]# chkconfig --list mysql
mysql 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@stu ~]# /etc/init.d/mysql start
Starting MySQL. SUCCESS!
[root@stu ~]# netstat -untlap | grep :3306
tcp 0 0 :::3306 :::* LISTEN 5823/mysqld
[root@stu ~]# mysql -hlocalhost -uroot -p
Enter password:
ERROR 1045 (28000): Access denied for user
'root'@'localhost' (using password: NO)
[root@stu ~]# cat /root/.mysql_secret
# The random password set for the root user at Thu Nov
17 03:49:34 2016 (local time): 0un0P7ci
[root@stu ~]# mysql -hlocalhost -uroot -p0un0P7ci
mysql> set password for root@"localhost"=password("123");
........
mysql>quit
[root@stu ~]# mysql -hlocalhost -uroot -p123
mysql> quit
[root@stu ~]# tar -xf MySQL-5.6.rpm.tar -C /usr/local
[root@stu ~]# ls
[root@stu ~]# cd /usr/local/
[root@stu local]# rpm -qa|grep mysql
mysql-libs-5.1.73-5.el6_6.x86_64
[root@stu local]# rpm -e mysql-libs-5.1.73-5.el6_6.x86_64(报错)
[root@stu local]# rpm -ef mysql-libs-5.1.73-5.el6_6.x86_64 --nodeps
[root@stu local]# rpm -ivh MySQL-server-5.6.15-1.el6.x86_64.rpm
[root@stu local]# rpm -ivh MySQL-client-5.6.15-1.el6.x86_64.rpm
[root@stu local]# service mysql start
Starting MySQL. SUCCESS!
[root@stu local]# mysql -u root -p
[root@stu local]# mysql -u root -p
[root@stu local]# cat /root/.mysql_secret
*# The random password set for the root user at Thu Nov
17 03:49:34 2016 (local time): lGa0H7zv
[root@stu local]# mysql -hlocalhost -uroot -plGa0H7zv
mysql> set password for root@"localhost"=password("123");
........
mysql>quit
[root@stu local]# mysql -hlocalhost -uroot -p123
3)源码安装MySQL
安装MySQL所需的依赖包
[root@stu ~]# yum -y install make gcc-c++ cmake bison-devel ncurses-devel
[root@stu ~]# yum -y install autoconf
MySQL源码编译安装
[root@stu ~]# wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.20.tar.gz
[root@stu ~]# tar xvf mysql-5.6.20.tar.gz
[root@stu ~]# cd mysql-5.6.20
[root@stu ~]# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1\
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLE_DOWNLOADS=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
[root@stu ~]# make && make install
配置MySQL
- 设置权限
- 使用下面的命令查看是否有mysql用户及用户组
[root@stu ~]# cat /etc/passwd * 查看用户列表
[root@stu ~]# cat /etc/group * 查看用户组列表如果没有就创建
[root@stu ~]# groupadd mysql
[root@stu ~]# useradd -g mysql mysql * 修改/usr/local/mysql权限
[root@stu ~]# chown -R mysql:mysql /usr/local/mysql * 修改/usr/local/mysql权限
数据初始化
[root@stu ~]# cd /usr/local/mysql
[root@stu ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/mysql/data --user=mysql
[root@stu ~]# cp support-files/mysql.server /etc/init.d/mysql
[root@stu ~]# chkconfig mysql on
[root@stu ~]# service mysql start
将MySQL加入到path路径中来
[root@stu ~]# vim /etc/profile
export PATH=/usr/local/mysql/bin:$PATH
[root@stu ~]# source /etc/profile
执行下面的命令修改root密码
[root@stu ~]# mysql -uroot
enter password:
mysql> SET PASSWORD = PASSWORD('123456'); //密码就是123456
修改数据库用户的密码
- 修改数据库管理员root从本机访问数据库服务的密码(得知道当前的登录密码是多少,新密码才能设置成功)
- 方法一
[root@stu ~]# mysqladmin -hlocalhost -uroot -p password "新密码"
Enter password: (输入原密码)
。。。。。。
mysql> quit
[root@stu ~]# mysql -hlocalhost -uroot -p "新密码"
- 方法二
[root@stu ~]# mysql -hlocalhost -uroot -p
Enter password:
mysql> set password for root@"localhost"=password("123");
........
mysql> quit
所有的增加的命令
1).创建数据库、表
查看所有库
mysql> show databases;
创建一个库
mysql> create database liuys;
切换库
mysql> use liuys;
创建一个表
mysql> create table liuys.stuinfo(name char(10) , age int(2));
创建一个主键的可自动增长非负的字段的表
mysql> create table liuys.t13(id int(2) zerofill unsigned primary key auto_increment, name char(10),money float(7,2));
创建一个时间等特定字段的表
mysql> create table t16(
name char(10),
age tinyint(2) zerofill unsigned primary key auto_increment,
money float(7,2),
s_year year,
birthday date,
up_class time,
meeting datetime
);
创建含datetime 与 timestamp 的当未给TIMESTAMP字段赋值时,自动以当前系统时间赋值,而DATETIME字段默认赋值为 NULL的表
create table t17(
meeting datetime,
time2 timestamp
);
创建含enum(值1,值2,值N) 只能在列举的范围内选择一个值set(值1,值2,值N) 能在列举的范围内选择一个或多个值,以及浮点数的表
create table t21(
name char(10),
age tinyint(2) unsigned,
pay float(7,2),
birthday date,
sex enum("boy","girl","no"),
likes set("book","film","game","it")
);
create table t24(
name char(10) not null ,
age tinyint(2) unsigned default 24 ,
pay float(7,2) ,
birthday date ,
sex enum("boy","girl","no") default "boy" ,
likes set("book","film","game","it") default
"film,game"
);
添加一个auto_increment初始值的表
create table t32(
stu_id int(2) zerofill primary key auto_increment,
name char(10)
)AUTO_INCREMENT=2;
#指定第一条的编号从多少开始
2).添加表数据
添加单条数据
mysql> insert into liuys.stuinfo values("jim",21);
同时添加多条数据
mysql> insert into liuys.stuinfo values("tom",21),("jack",22);
同时向特定字段添加多条数据
mysql> insert into liuys.stuinfo(name) values("tony"),("jeanks");
添加其中年份可以使用2位数字给YEAR类型的字段赋值的数据,例如:
01-69 20XX
70-99 19XX
mysql> insert into t16 values ("zhangbaoli",21,20000,1998,20161221,083000,20161218203000);
建表时创建主键
- 创建主键 primary key
- 一个表里只能有一个主键,字段值不允许重复且不允许赋null值;若多个字段做主键叫复合主键,复合主键必须一起创建(字段的值不允许同时相同)。和auto_increment连用,让字段的值自动增长 字段的值自加1后给当前字段赋值
- 通常把表中能够唯一定位一条记录的字段设置为主键字段。
create table t26(
stu_id char(9),
name char(10),
age int(2),
primary key(stu_id)
);
在已有表里创建主键
mysql> alter table 27 add primary key(email);
创建外键 foreign key
- 1 表的存储引擎必须是innodb
- 2 字段的类型要一致
- 3 被参考的字段必须是key 的一种(primary key)
创建父表并插入数据
mysql> create table jfb(
jfb_id int(2) primary key auto_increment,
name char(10)
)engine=innodb;
insert into jfb(name) values("alic"),("bob");
创建子表
create table bjb(
bjb_id int(2),
name char(10),
foreign key(bjb_id) references jfb(jfb_id) on update
cascade on delete cascade
)engine=innodb;
所有的删除命令
删除字段名
mysql> alter table t24 drop chengj ,
## mysql> drop stu_id;
删除主键
mysql> alter table t27 add primary key(stu_id);
删除表结构
mysql> drop table 表名
删除外键:
mysql> alter table bjb drop foreign key bjb_ibfk_1;
2).删除表记录(以行为删除单位)
- 删除与条件匹配的记录
- delete from 库名.表名 where 条件;
mysql> delete from userdb.user where name is null;
- 删除所有记录。
- delete from 库名.表名;
mysql> delete from db2016.user;
所有的修改命令
1).改名字
修改字段名
mysql> alter table t24 change mail email varchar(25) not null default "[email protected]";
修改表名
mysql> alter table t24 rename sutinfo;
3).修改表结构
添加至字段之首
mysql> alter table t24 add mail varchar(30) default "[email protected]" first;
添加至指定字段后面
mysql> alter table t24 add id int(2) after email;
一次添加多个字段
mysql> alter table t24
add mail varchar(30) default "[email protected]",
add chengj tinyint(2) not null default 60 after name,
add stu_id char(9) first;
3).修改表数据
更新记录字段的值 update
- 批量更新:
- update 库名.表名 set 字段名1=值,字段名2="值",字段名N=值;
mysql> update userdb.user set mysql=95,age=18;
- 修改复合条件记录字段的值
mysql> update userdb.user set homedir="/student" , name="admin" where id=1;
mysql> update userdb.user set name="" where name="bin";
mysql> select id,name,shell from userdb.user where name="daemon";
mysql> update userdb.user set shell=null where name="daemon";
4).修改字段类型
- 若修改的类型与已经存储的数据有冲突,不允许修改
修改字段约束条件
mysql> alter table t24 modify mail char(12) not null default "[email protected]";
所有的查看的命令
1).查看建表过程
mysql> show create table 表名;
2).查看表结构
mysql> desc userdb.user;
3).查看建库的过程
mysql> show create database liuys;
4).查看表中复合条件记录指定字段的值
- select 字段名列表 from 库名.表名 where 条件表达式;
mysql> select name,shell,homedir from userdb.user where name="root";
5).数值比较 (字段必须是数值类型)字段名 符号 值
- = != > >= < <=
mysql> select id,name , shell ,uid from userdb.user where uid=100;
mysql> select id,name from userdb.user where id<=10;
6).字符比较 (字段必须是数值类型)字段名 符号 "值"
= !=
mysql> select name from userdb.user where name="daemon";
mysql> select name from userdb.user where name!="root";
7).范围内匹配
- between...and.... 在...之间
- in (值列表) 在...里...
- not in (值列表) 不在...里...
mysql> seletc name,uid from userdb.user where uid between 10 and 20;
mysql> select name,uid from userdb.user where uid between 1 and 5;
mysql> select name from userdb.user where name in ("bin","mysql","lucy");
mysql> select id,name from userdb.user where id in (10,21,15);
mysql> select name,shell from userdb.user where shell in ("halt","shutdown");
mysql> select name,shell from userdb.user where shell not in ("halt","shutdown");
8).匹配空 is null 匹配非空 is not null
mysql> insert into userdb.user(id,name) values(45,null),(46,NULL),(47,"null"),(48,"");
mysql> select id,name from userdb.user where name is null;
mysql> select id,name from userdb.user where gid is null;
mysql> select id,name from userdb.user where name is not null;
mysql> select id,name from userdb.user where name="";
mysql> select id,name from userdb.user where name="null";
9).逻辑比较
- (2个或2个以上查询条件时使用逻辑比较)
- 逻辑与 and 多个条件必须同时成立
- 逻辑或 or 多个条件时某一个条件成立就可以
- 逻辑非 ! 取反
mysql> select id,name,uid,shell from userdb.user where name="root" and uid=10;
mysql> select id,name,uid,shell from userdb.user where name="root" or uid=10;
mysql> select name,uid,homedir from userdb.user where name ("bob","root","daemon") and uid<=10 and shell="/bin/bash";
* ( ) 提高优先级
mysql> select name,uid from userdb.user where name="root" or name="bin" and uid=1;
mysql> select name,uid from userdb.user where (name="root" or name="bin") and uid=3;
10).模糊查询
mysql> select name from userdb.user where name like '___';
mysql> select name from userdb.user where name like '%a%';
mysql> insert into userdb.user(name)values("a"),("");
mysql> select name from userdb.user where name like 'a%';
mysql> select name from userdb.user where name like '%a';
mysql> select name from userdb.user where name like '_a_';
mysql> select name from userdb.user where name like '%';
11). 正则匹配
- 字段名 regexp '正则表达式';
- ^ $ . * [0-9] 0123456789
mysql> insert into userdb.user(name)values("jim"),("j9im"),("7jim"),("ji3m"),("jim5");
mysql> select name from userdb.user where name regexp '[0-9]';
mysql> select name from userdb.user where name regexp '^a.*c$';
mysql> select name,uid from userdb.user where uid regexp '^..$';
mysql> select name,uid from userdb.user where uid regexp '..';
12).数学计算 + - * / %
mysql> select name,uid,gid,id+gid as zh from userdb.user where name="root";
mysql> alter table userdb.user add age tinyint(2) default 23 after name;
mysql> select name,age from userdb.user where name="root";
mysql> select name,age,2016-age as s_year from userdb.user where name="root";
mysql> select name,age,uid,gid,(uid+gid)/2 as pjz,2016-age as s_year from userdb.user where name="root";
13).聚集函数
- count(字段名) 统计字段值的个数
- max(字段名) 获取字段的最大值
- min(字段名) 获取字段的最小值
- avg(字段名) 获取字段的平均值
- sum(字段名) 统计字段的和
mysql> select count(id) from userdb.user;
mysql> select count(id) as 总记录数 ,count(name) as 总用户数 from userdb.user;
mysql> alter table userdb.user add mysql tinyint(2) default 60 after age;
mysql> alter table userdb.user add mysql tinyint(2) default 60 after age;
mysql> select avg(mysql) from userdb.user;
mysql> select sum(mysql) from userdb.user;
mysql> select max(gid) from userdb.user;
mysql> select min(uid) from userdb.user;
mysql> select min(uid) from userdb.user where shell="/bin/bash";
13).查询结果分组
- sql查询命令 group by 字段名;
mysql> select shell from userdb.user group by shell;
mysql> select shell from userdb.user where uid<500 group by shell;
mysql> select 部门 from 员工表信息表 where 性别="女" group by 部门;
- DISTINCT查询时不显示字段的重复值。(相同的值 只显示第1次出现的)
mysql> select distinct shell from userdb.user;
mysql> select distinct gid from userdb.user;
14).查询结果排序
- sql查询 order by 字段名 排序方式;
- asc 默认 升序
- desc 降序
mysql> select * from userdb.user order by id desc;
mysql> select name,uid,homedir from userdb.user where uid >=10 and uid<=20 order by uid;
mysql> select name,age,mysql from 成绩表 where 工作经验="是" order by mysql desc;
15).在查询结果里过滤数据
- sql查询 having 条件表达式;
mysql> select name from userdb.user where shell!="/bin/bash" having name in ("rsync","apache",lucy);
mysql> select id,name from userdb.user where name is not null having id=42;
16). 限制显示查询记录的条目
- 默认会把复合查询条件的记录全部显示出来
- sql查询 limit 数字1,数字2;
- 数字1 表示从查询结果的第几条记录开始显示
- 数字2 表示显示几条记录
mysql> select * from userdb.user where id<=10;
mysql> select * from userdb.user where id<=10 limit 0,2 ;
mysql> select * from userdb.user where uid>500 order by uid desc limit 1;
mysql> select * from 员工信息表 where 性别="女" order by 工资 desc limit 1;
17).复制表(快速创建一个新表 把表备份一下)
- 源表的字段的key属性不会被复制给新表。
- create table 新表名 sql查询;
复制所有内容
- create table 新表名 select * from 表名;
mysql> create table user2 select * from user;
18).怎么显示登录的用户名和客户端地址
mysql > select user();
19). 登录用查看自己的访问权限?
mysql > show grants;
复制部分内容
- create table 新表名 select 字段名列表 from 表名 where 条件;
mysql> create table user3 select name,uid,homedir from userdb.user where uid<=5;
只复制表结构
- create table 新表名 select * from 表名 where 不成立的条件;
mysql> create table user4 select * from userdb.user where 1 = 2 ;
18).嵌套查询
- 把内层查询结果作为外层查询的查询条件
- select 字段名列表 from 表名 where 条件 (select 字段名列表 from 表名) ;
mysql> insert into userdb.user(name,mysql) values("lilei",81),("hanmeimei",59),("jerry",92),("lili",100);
mysql> select avg(mysql) from userdb.user;
mysql> select name,mysql from userdb.user where mysql > ( select avg(mysql) from userdb.user );
mysql> select name,mysql from userdb.user where mysql < ( select avg(mysql) from userdb.user ) having name="lili";
mysql> select min(uid) from userdb.user;
mysql> select name ,uid from userdb.user where uid=0;
mysql> select name ,uid from userdb.user where uid=(select min(uid) from userdb.user);
mysql> select name from userdb.user where name in (select user from mysql.user where host="localhost");
mysql> select name from bjb where name in (select name from jfb where class="nsd1608" and 学费="yes");
19).多表查询
- select 字段名列表 from 表名1 ,表名2,表名n;
- select 字段名列表 from 表名1 ,表名2,表名n where 条件表达式;
mysql> create table t41 select name,uid from userdb.user limit 3;
mysql> select * from t41;
mysql> create table t42 select name,homedir,shell from userdb.user limit 4;
mysql> select * from t41;
mysql> select * from t41 , t42;
mysql> select t41.name,t42.name,t42.homedir from t41 , t42;
mysql> select t41.name,t42.name,t42.homedir from t41,t42 where t41.name=t42.name;
mysql> select * from t41 , t42 where t41.name=t42.name;
mysql> select * from t43 left join t44 on
- 连接查询
- 左连接left jion ... on 条件
- 查询时以左边的表为主显示查询结果
- 右连接right jion ... on 条件
- 查询时以左边的表为主显示查询结果
mysql> create table t43 select name,uid,shell from userdb.user limit 3;
mysql> select * from t43;
mysql> create table t44 select name,uid,shell from userdb.user limit 5;
mysql> select * from t43 left join t44 on t43.name=t44.name;
mysql> select * from t43 right join t44 on t43.name=t44.name;
数据的导入与导出
数据导入 : 把系统文件的内容存储到数据库的表里
- mysql> LOAD DATA INFILE '文件名' INTO TABLE 表名 FIELDS TERMINATED BY '分隔符' LINES TERMINATED BY '\n';
- 把系统用户信息存储到 userdb库下的user表里/etc/passwd
- 用户名:密码占位符:uid:gid:描述信息:家目录:shell
mysql> create database userdb;
mysql> create table userdb.user(
name char(25),
password char(1),
uid smallint(2),
gid smallint(2),
comment varchar(50),
homedir varchar(50),
shell varchar(50),
index(name)
);
* 查看表结构
mysql> desc userdb.user;
mysql> select * from userdb.user;
* 导入数据
mysql> LOAD DATA INFILE "/etc/passwd" INTO TABLE userdb.user FIELDS TERMINATED BY ":";
mysql> mysql> select * from userdb.user;
mysql> alter table userdb.user add id int(2)
zerofill primary key auto_increment first;
select * from userdb.user;
数据导出: 把数据库表里记录存储到系统文件里
语法格式:
- SQL查询命令 INTO OUTFILE "文件名";
- SQL查询命令 INTO OUTFILE "目录名/文件名" fields terminated by "符号" lines terminated by "符号";
mysql> use userdb;
mysql> select * from userdb.user into outfile "a.txt";
[root@stu ~]# mkdir /mydatadir
[root@stu ~]# chown mysql /mydatadir
mysql> select * from userdb.user where id=3 into outfile "/mydatadir/b.txt";
mysql> select host,user from mysql.user into outfile "/mydatadir/mysql-user2.txt" fields terminated by "###";