1、进入数据库
//方法一
shell> mysql -u root -p
Enter password:
//方法二
shell> myqsl -uroot -p"yevhao616"
2、简单命令的使用
//查询库
mysql> show databases;
//删除test这个库
mysql> drop database test;
//创建库
mysql> create database db;
//切换库
mysql> use db;
//查询表
mysql> show tables;
//查询表结构
mysql> show create table new17\G
//创建表
mysql> create table test(id int,name char(10));
//描述表结构
mysql> desc test;
desc 表名;
//插入数据
mysql> insert into test values(1,'jinwen');
// 查看数据
mysql> select * from test;
//删除user表中的数据,但是不删表
mysql> delete from user;
//删除user1这张表
mysql> drop table user1;
//创建表
create table 表名(
字段名1 类型[(宽度)约束条件],
字段名2 类型[(宽度)约束条件],
字段名3 类型[(宽度)约束条件]
)[存储引擎 字符集];
//插入数据
insert into 表名(字段1,字段2...) values(字段值列表...)
//查看表详细结构
show create table 表名;
3、修改表
1)修改表名
alter table 表名 rename 新表名;
mysql> rename table emp to newemp;
2)增加字段
//在最后增加字段
alter table 表名 add 字段名 数据类型 [完整性约束条件...],add 字段名 数据类型 [完整性约束条件...];
mysql> alter table new17 add age int(3) not null default 22,add sex enum('M','W');
//在首行增加字段
alter table 表名 add 字段名 数据类型 [完整性约束条件...] first;
mysql> alter table new17 add aaa int first;
//在某字段后增加字段
alter table 表名 add 字段名 数据类型 [完整性约束条件...] after 字段名;
mysql> alter table new17 add num varchar(10) not null after id;
3)修改字段
//修改数据类型和约束
alter table 表名 modify 字段名 数据类型 [完整性约束条件...];
mysql> alter table new17 modify id smallint;
mysql> alter table new17 modify age int(10) not null primary key auto_increment;
//修改字段名,但不更新数据类型
alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束条件...];
mysql> alter table new17 change id uid smallint;
//修改字段名同时更新字段的数据类型
alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件...];
mysql> alter table new17 change num nnum char(10);
4)添加复合主键
alter table 表名 add primary key(字段名,字段名...);
mysql> alter table service2 add primary key(host_ip,port);
5)删除字段
alter table 表名 drop 字段名;
mysql> alter table new17 drop aaa;
6)修改存储引擎
alter table 表名 旧存储引擎=新存储引擎
mysql> alter table new17 engine=myisam;
7)增加约束(针对已有的主键增加auto_increment)
mysql> alter table new17 modify uid smallint not null auto_increment;
8)增加主键
mysql> alter table new17 modify name varchar(10) not null primary key;
9)增加主键和自动增长
mysql> alter table new17 modify id int primary key auto_increment;
10)删除主键
【因为有依赖关系,所以要先删除自增约束条件,然后再删除主键】
//删除自增约束
mysql> alter table new17 modify id int(11) not null;
//删除主键
mysql> alter table new17 drop primary key;
4、复制表
1 )复制表结构+记录(主键、外键和索引这些key是不会复制的)
mysql> create table new select * from new17;
2)只复制表结构
//条件为假,查不到任何记录
mysql> select * from new where 1=2;
mysql> create taable new1 select * feom new where 1=2;
//连同key都会复制
mysql> create table new2 like new17;
5、删除表
drop table 表名,表名,表名;
//存在就删除,这样就不会报错,使用脚本的时候可以用
drop table if exists new1;
6、更新数据
update 表名 set字段1=值1,字段2=值2... where condition;
mysql> update mysql.user set password='' where user='root';
7、删除数据
delete from 表名 [where condition];
//清空表里的数据,但是保留表结构
mysql> delete from new;
//出于安全考虑将表中没有密码的删掉
mysql> delete from mysql.user where authentication_string='';
mysql> delete from new where id=3 and name='robin';
mysql> delete from new where id=3 or name='robin';
8、单表查询
select col_name1, col_name2, ...from tb_name [select_statement]
1)简单查询
mysql> select * from tutors;
mysql> select Tname,Age from tutors;
//给字段设置别名
mysql> select Tname as 教师,Age as 年龄 from tutors;
//不使用cache直接取数据
mysql> select sql_no_cache * from new1;
//清空query cache后取数据
mysql> reset query cache;
2)避免重复查询
//去掉完全重复的行
mysql> select distinct * from tutors;
//查询有哪些年龄
mysql> select distinct Age from tutors;
3)通过条件查询
mysql> select * from 表名 where 条件;
4)模糊查询
like "通配符表达式"
通配符'%'匹配多个字符
通配符'_'匹配一个字符
mysql> select * from 表名 where Tname like "Y%" or Tname like ''H_";
5)rlike正则表达式
mysql> select * from 表名 where Tname rlike "ao$";
6)按单列排序
mysql> selete * from 表名 order by Age;
mysql> selete * from 表名 order by Age desc;
7)按多列排序
//按照年龄排序降序,年龄相同按照TID降序
mysql> selete * from new1 order by age desc,TID desc;
8)限制查询的记录数
//忽略前n行,共显示m行
limit [n,]m
//从第三个开始取,取三个
mysql> selete * from 表名 limit 2,3;
9)sum求和、avg求平均数、max求最大值、min求最小值、count统计总数
mysql> select sum(salary) from emp;
mysql> select avg(salary) from emp;
mysql> select max(salary) from emp;
mysql> select min(salary) from emp;
mysql> select count() as count from emp;
10)通过四则运算查询(不支持+=)
mysql> selete name,salary12 from emp;
mysql> selete name,salary12 as annual_salary from emp;
mysql> selete name,(salary+1000)12 as annual_salary from emp where name='rose';
11)分组函数
注:group by必须在where之后,分组前过滤;having的用法和where相同,但可以分组后过滤,一般不使用
//显示每个部门有多少人
mysql> select count(*) from emp group by did;
//取出部门人数超过三个的
mysql> select count(*) as num from emp group by did having num >3;
12)外连接
左外连接
特征:以左表为主,显示左表所有数据,右表中没有关联的数据时,显示为NULL
select tb1.col, tb2.col,.... from tb1 left join tb2 on tb1.col=tb2.col
mysql> select students.Name, students.Age, students.Gender, courses.Cname from students left join courses on students.CID2=courses.CID;
右连接
特征:以右表为主,显示右表所有数据,左表中没有关联的数据时,显示为NULL
select tb1.col, tb2.col,.... from tb1 right join tb2 on tb1.col=tb2.col
mysql> select students.Name, students.Age, students.Gender, courses.Cname from courses right join students on students.CID2=courses.CID;
14)嵌套查询
特征:以查询的结果作为另外一个查询的条件、数据源使用
mysql> select * from 表名 where Age > (select AVG(Age) from tutors);
MySQL数据类型
数值类型:
整数类型 tinyint smallint mediumint int bigint
浮点数类型 float 单精度浮点数值(7个有效位) double双精度(15个)
字符串类型: char varchar
时间和日期类型: date time time datetime timestamp year
枚举类型: enum
集合类型: set
属性
unsigned 无符号
primary key 主键
not null 不允许为空
default "值" 设置字段的默认值
auto_increment 自动增长, 必须与主键、不允许为空同时使用
约束条件
unsigned 无符号
zerofill 使用0填充
not null 标识该字段不能为空
default 为该字段设置默认值
unique key (uk) 标识该字段的值是唯一的,是一种索引,可以为空,一个表中可以有多个
primary key (pk) 标识该字段为该表的主键,可以唯一的标识记录
auto_increment 标识该字段的值自动增长,只能用于主键,而且是整数类型
foreign key (fk) 标识该字段为该表的外键,实现表与表之间的关联
on delete cascade 级联删除 又叫同步删除
on update cascade 级联更新 不管是父表还是子表变了,另一个都会跟着变
通过条件查询(where condition)
## 数字操作符:
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
between 5 and 10 在两个值之间
## 逻辑操作符:
and
or
and和or并存时and的优先级高
## 包含和不包含:
in
not in
## 空值或者非空值:
is null 空值
is not null 非空值
【使用in查询的优点:】
1.in的语法更加直观
2.in的计算次序更容易管理(操作符少)
3.in 一般比or执行的更快
4.in的最大优点可以包含其他子句 or不行
## 模糊查询
LIKE "通配符表达式"
通配符’%’匹配多个字符
通配符’_’匹配一个字符
【使用通配符的原则:】
1.尽量少使用通配符,如果其他操作符能做到就不要使用通配符
2.至于使用位置,使用错了得不到想要的结果
mysql 安全机制
1)登录MySQL
/usr/local/mysql/bin/mysql -h localhost -P3306 -uroot -S /tmp/mysql.sock -p"yevhao616" -e 'select user,host from mysql.user'
/usr/local/mysql/bin/mysql -h localhost -P3306 -uroot -p"yevhao616" mysql -e 'select user,host from user'
/usr/local/mysql/bin/mysql -h localhost -P 3306 -u root -p -e 'select * from mysql.user'
注释:
-h 指定主机名
-P MySQL服务器端口
-u 指定用户名
-S 指定套接字文件的存放位置
-p 指定登录密码
-e 接SQL语句
2)创建用户并为用户设置密码
//查看mysql数据库中自带的用户
mysql> select user,host from mysql.user;
//创建用户
mysql> create user robin;
//查询用户
mysql> select user,host,password from mysql.user; 【%表示任意主机】
//创建用户时设置密码
mysql> create user alice@'%' identified by '123';
//修改用户名 [了解]
//默认修改的是其他所有主机的
mysql> rename user zorro to jack;
mysql> rename user zorro@'localhost' to shrek@'%';
mysql> select user,host from mysql.user;
//删除用户
//默认删除的是针对于其他所有用户的
mysql> drop user aaa;
//不是默认的需要指明
mysql> drop user shrek@'localhost';
或者
mysql> delete from mysql.user where user='shrek' and host='%';
//修改用户密码 [了解]
======普通用户修改自己的密码
//password()函数加密
set password for 'zorro'@'%'= password('123');
//修改当前普通用户自己的密码
set password = password('123');
======root用户修改自己的密码
方法一:
mysqladmin -uroot -p"yevhao616" password 'new_password'
方法二:不建议使用,root密码丢失时使用
mysql> select password('123');
//使用函数获得加密的值,更新到指定的字段上
mysql> update mysql.user set authentication_string=password('yevhao616') where user='root';
mysql> flush privileges;
方法三:
mysql> set password= password('yevhao616');
=====root用户修改其他用户的密码
方法一:
set password for 'alice'@'localhost'=password('new_password');
方法二:
update mysql.user set authentication_string=password('456') where user='robin' and host='%';
方法三:
grant select on *.* to robin@'%' identified by 'yevhao616';
MySQL权限管理
1)授权
grant 权限列表 on 库名.表名 to 用户名@'客户端主机' [identified by '密码' with option参数];
2)==权限列表 all 所有权限(不包括授权权限)
注释: 所谓授权权限就是当前主机能不能把自己已有的权限再授权给其他的帐号
==数据库.表名 *.* 所有库下的所有表 全局
web.* web库下的所有表 库级
web.stu_info web库下的stu_info表 表级
SELECT (col1), INSERT (col1,col2) ON mydb.mytbl 列级
==客户端主机 % 所有主机(尽量不要用%授权不安全)
172.16.2.% 192.168.2.0网段的所有主机
172.16.2.168 指定主机
3)取消权限
revoke 权限 on 数据库.表 from '用户'@'IP地址'
4)用户权限的不同范围在mysql库中保存的表不同
//mysql.user表中存储了所有用户的信息
select * from mysql.user\G
//mysql.db表中保存了用户对表的权限
select * from mysql.db\G
//mysql.tables_priv表中保存了用户对表的权限
select * from mysql.table_priv\G
//mysql.columns_priv表中保存了用户队列的权限
select * from mysql.columns_priv\G
关于权限
all privileges 除grant外的所有权限
select 仅查权限
select,insert 查和插入权限
...
usage 无访问权限
alter 使用alter table
alter routine 使用alter procedure和drop procedure
create 使用create table
create routine 使用create procedure
create temporary tables 使用create temporary tables
create user 使用create user、drop user、rename user和revoke all privileges
create view 使用create view
delete 使用delete
drop 使用drop table
execute 使用call和存储过程
file 使用select into outfile 和 load data infile
grant option 使用grant 和 revoke
index 使用index
insert 使用insert
lock tables 使用lock table
process 使用show full processlist
show databases 使用show databases
show view 使用show view
update 使用update
reload 使用flush
shutdown 使用mysqladmin shutdown(关闭MySQL)
super 使用change master、kill、logs、purge、master和set global。还允许mysqladmin调试登陆
replication client 服务器位置的访问
replication slave 由复制从属使用
5)关于数据库和表
对于目标数据库以及内部其他:
数据库名.* 数据库中的所有
数据库名.表 指定数据库中的某张表
数据库名.存储过程 指定数据库中的存储过程
.* 所有数据库
6)关于用户和 IP
用户名@IP地址 用户只能在改IP下才能访问
用户名@192.168.1.% 用户只能在改IP段下才能访问(通配符%表示任意)
用户名@%.shark.com
用户名@% 用户可以再任意IP下访问(默认IP地址为%)
7)刷新
flush privileges
8)创建用户的同时直接授权
grant select on *.* /*设置查询数据的权限在所有的库和表*/
to 'shark_2'@"%" /*指定用户名和来源 ip*/
identified by '123'; /*设置密码*/
网友评论