MySQL的常规操作
登录:mysql -uslp_linux -p 或 mysql -uroot -p (-h localhost)
密码:123
退出:exit
mysql设置外部访问权限时,除了把端口号改为0.0.0.0,以外,执行一下命令赋予权限:
开启服务:
net start mysql
关闭服务:
net stop mysql
>grant all privileges on *.* to '用户名'@'%' identified by '密码’with grant option;
>(或>grant all privileges on *.* to 用户名@%;)
将数据读取到内存,立即生效: >flush privileges(更改配置(用户权限)之后,必须运行此命令生效)
用户
创建用户: #允许hule用户在本地登录
>create user 'hule'@'localhost' identified by '123456';
#允许10.0.122.*网段使用hule用户登录
>create user 'hule'@'10.0.122.%' identified by '123456';
#允许用户在任何地方登录
>create user 'hule'@'%' identified by '123456';
>create user hule identified by '123456';
查看当前用户: >select user();
查看所有用户(需要root用户):>use mysql;
>select user,host from user;
删除用户: >drop user '用户名'@'IP地址';
修改密码; >set password for root@localhost = password('123');
授权管理:需要root用户
查看权限:show grants for ‘用户名’@‘IP地址’;
授权:grant 权限 on 数据库.表 to ‘用户名’@‘IP地址’;
#只能对axf数据库下的t1表进行查看和插入操作
>grant select,insert on axf.t1 to 'hule'@'%';
#只能对axf数据库下的所有表进行查看和插入操作
>grant select,insert on axf.* to 'hule'@'%';
#添加对axf数据库下所有表,添加grant以外的所有权限
>grant all privileges on test.* to hhh;
#添加对所有数据库下所有表,添加grant以外的所有权限
>grant all privileges on *.* to hhh;
#添加对所有数据库下所有表,添加包括grant的所有权限
>grant all privileges on *.* to hhh WITH GRANT OPTION
#权限说明:详情见《权限说明.txt》
#取消授权:
>revoke 权限 on 数据库.表 from '用户名'@'IP地址';
#更改用户可登录ip地址
>use mysql;
>update user set host='localhost' where user='root';
数据库
创建数据库:
#utf-8:
>create database 数据库名 charset utf8;
#gbk:
>create database 数据库名 default charset gbk;
>create database mydatabase;
显示所有数据库: >show databases;
修改数据库:alter database mydatabase charset gbk;(通常不修改)
删除数据库: >drop database 数据库名
查看当前选择的数据库: >select database();
查找记录: >select * from mysql.user;
切换工作数据库: >use 数据库名;
表
显示当前数据库中的所有表: >show tables;
【增】
创建表:CREATE TABLE table_name (column_name column_type);
示例: >create table stu(
id int not null auto_increment primary key,
name char(20) unique,
age int,
class_id int,
foreign key(class_id) references grade(id)
);
修改表: >alter table student modify name char(20) unique;
#如果想在一个已经建好的表中添加一列,可以用以下代码:
alter table 表名 add column 列名 varchar(20) not null;
>alter table student add column info2 varchar(100);
插入数据:
a、全列插入
格式:insert into 表名 values(...);
示例:insert into student values(0,"tom",19,1,"北京",0);
b、缺省插入
格式:insert into 表名(file1file2,……) values(值1,值2,……); 或插入多行
insert into 表名(file1file2,……) values(值1,值2,……),(值1,值2,……),...;
示例:insert into student(name,age,address) values("lilei",19,"上海");
c、同时插入多条数据
格式:insert into 表名 values(...),(...),……
示例:insert into student values(0,"hanmeimei",18,0,"北京",0),
【删】
格式:delete from 表名 where 条件;
示例:delete from student where id=4;
注意:没有条件是全部删除,慎用
删除一列: >alter table 表名 drop column 字段(列名);
【改】
格式:update 表名 set 列1=值1,列2=值2,…… where 条件;
示例:update student set age=16 where id=7;
注意:没有条件是全部列都修改,慎用
【查】
说明:查询表中的全部数据
格式:select * from 表名;
示例: select * from student;
select name, age from student;
select name as a, age from student;
1.条件查询
语法
select * from 表名 where 条件
a.比较运算符
等于 | = |
---|---|
大于 | > |
小于 | < |
大于等于 | >= |
小于等于 | <= |
不等于 | !=或<> |
示例:
select * from student where id>8;
注意:
SQL 条件语句是经常用到 不等于!=
的筛选条件,此时要注意此条件会将字段为null的数据也当做满足不等于的条件而将数据筛选掉。
只需将SQL 改为 :
select * from A where B1 != 1 or B1 is null ;
即可,不过目前我使用的方法还是:
select * from A where IFNULL(B1,'') != 1;
b.逻辑运算符
and | 并且 |
---|---|
or | 或者 |
not | 非 |
c.模糊查询
like
%表示任意多个任意字符
_表示一个任意字符
示例: select * from student where name like "习%";
select * from student where name like "习_";
d.范围查询
in 表示在一个非连续的范围内
between...and... 表示在一个连续的范围内
示例: select * from student where id in (8,10,12);
select * from student where id between 6 and 8;
e. 空判断
注意:null与""是不同
判断空:is null
判断非空: is not null
示例: select * from student where address is null;
select * from student where address is not null;
f.优先级
小括号,not 比较运算符,逻辑运算符
and比or优先级高,如果同时出现并希望先选or,需要结合()来使用
示例:select * from student where address is null and (name like "% li" or age = 18);
2、聚合
a、count(*) 表示计算总行数,括号中可以写*和列名
b、max(列) 表示求此列的最大值
c、min(列) 表示求此列的最小值
d、sum(列) 表示求此列的和
e、avg(列) 表示求此列的平均值
示例: #查询学生总数
select count(*) from student;
#查询女生的编号最大值
select max(id) from student where gender=0;
#查询女生的编号最小值
select min(id) from student where gender=0;
#查询所有学生的年龄和
select sum(age) from student;
#查询所有学生的年龄平均值
select avg(age) from student;
3、分页
语法:select * from 表名 limit start,count;
示例: select * from student limit 0,3;
select * from student limit 3,3;
select * from student where gender=1 limit 0,3;
4、关联
分类:
1、表A inner join 表B(自关联):
表A与表B匹配的行会出现在结果集中
2、表A left join 表B(左关联):
表A与表B匹配的行会出现在结果集中,外加表A中独有的数据,未对应的数据使用null填充
3、表A right join 表B(右关联):
表A与表B匹配的行会出现在结果集中,外加表B中独有的数据,未对应的数据使用null填充
示例:
关联查询:
>select students.name,class.name from class inner join students on class.id=students.classid;
>select students.name,class.name from class left join students on class.id=students.classid;
>select students.name,class.name from students right join class on class.id=students.classid;
5.分组
按照字段分组,表示此字段相同的数据会被放到一个集合中.分组后,只能查询出相同的数据列,对于有差异的数据列无法显示在结果集中,可以对分组后的数据进行统计,做聚合运算.
语法: select 列1,列2,聚合…… from 表名 group by 列1,列2,列3,……;
示例: #查询男女生总数
select gender,count(*) from student group by gender;
select name,gender,count(*) from student group by gender,age;
select max(age),sex from stu group by sex;
分组后的数据筛选:
where与having的区别:
1、where是对from后面指定的表进行筛选,属于对原始数据的筛选
2、having是对group by的结果进行筛选
语法:
select 列1,列2,聚合…… from 表名 group by 列1,列2,列3,…… having 列1,……聚合……;
示例:select max(age),sex from stu group by sex having max(age)>26;
6.排序
语法:select * from 表名 order by 列1 asc|desc,列2 asc|desc , ……;
说明:
a、将数据按照列1进行排序,如果某些列1的值相同,则按照列2进行排序
b、默认按照从小到大的顺序排序
c、asc升序
d、desc降序
示例:#将没有被删除的数据按年龄排序
select * from student where isDelete=0 order by age desc;
select * from student where isDelete=0 order by age desc, id desc;