数据库(mysql)基本使用命令大全
1、查看数据库及表属性:
1)查看所有数据库
SHOW DATABASES;
2)选择使用的数据库
USE <DATABASE_NAME>
3)查看当前数据库下面的表
SHOW TABLES;
4)选择使用的表
USE <TABLE_NAME>
5)查看表结构
DESC <TABLE_NAME>
6)查看数据库编码
SHOW VARIABLES LIKE 'CHARACTER_SET_DATABASE'
7)查看表编码
SHOW CREATE TABLE <TABLE_NAME>
8)查看表属性
SHOW TABLE STATUS FROM <table_name>
2、用户操作:
1)创建用户
create user 'test'@'localhost(127.0.0.1)' identified by '12345678'; 本地使用
create user 'test'@'%' identified by '12345678'; 任意IP使用
2)删除用户
drop uesr 'test'@'IP地址'
3)赋予权限
grant insert, create, update on db.test to 'test'@'IP地址';
grant all on *.* to 'test'@'ip地址 // 赋予除了grant 外的所有权限
4)查看权限
show grants for 'test'@'IP地址''
5)取消权限
revoke all on *.* from 'test'@'ip地址'
3、数据库操作
1)修改数据库密码
set password for root@localhost='12345678'
2)创建/删除数据库并制定编码
CREATE DATABASE <数据库名> character set utf8
drop database <数据库名>
3)修改数据库编码
ALTER DATABASE <database_name> DEFAULT CHARACTER SET UTF8 COLLATE utf8_bin
4、表操作
1)创建表并制定编码
create table <table name>(name varchar(50) not null comment '姓名', price double not null) ENGINE=InnoDB default charset=utf8
create table test(id int(5) not null auto_increment, dt date default null comment '日期', hour tinyint(2) default 0 comment '小时', primary key(id), unique key dt_hour(dt, hour)) engine=InnoDB auto_increment=1 default charset=utf8 comment='测试数据'
InnoDB支持事物,原子性操作。即在同一个事物中操作数据库,要么全成功,要么全失败。
2)修改表编码
ALTER TABLE <table_name> DEFAULT CHARACTER SET UTF8 COLLATE utf8_bin
3)修改表名
ALTER TABLE <table_name> RENAME <new_name>
4)复制表
复制表结构:
create table table1 like <tablename>
create table tb1 select * from tb2 where 1=2
复制表数据
insert into table1 select * from <tablename>
5、字段操作
1)添加列
ALTER TABLE <table_name> ADD COLUMN <column_name> <column_type>
alter table test add name varchar(30) not null, add age(3) int not null default(23);
alter table test add gender enum("male", "female") default "female" first;
2)修改列类型
ALTER TABLE <table_name> change<column_name> <column_type>
3)修改列名
ALTER TABLE <table_name> CHANGE COLUMN <column_name> <new_column_name> <new_column_type>
4)删除字段
alter table test drop gender;
5)添加外键
ALTER TABLE<表名> add constraint <外键名> foreign key <字段名> reference <外表表明>(<字段名>) ON DELETE CASECADE ON UPDATE CASECADE
ON DELETE CASECADE ON UPDATE CASECADE:它告诉数据库在主表记录删除时,该怎么做
CASECADE:主表和从表保证一致性,删除主表记录,从表记录自动删除
SET NULL:将删除有关的记录设置为NULL值
RESTRICT:不允许删除(这是默认设置,也是最安全的设置)
NO ACTION:啥也不做
6)删除外键
ALTER TABLE <表名> DROP FOREIGN KEY<外键名>
这里要注意,外键名,不是字段名,所以删除的时候,不能用数据库中的字段名作为删除时候的外键名,否则或报错
7)修改已有字段为联合主键
alter table test add primary key(id,name);
8)删除主键
alter table test drop primaty key;
9)数据库自增
create table test1(name varchar(20) not null, id int not null auto_increment primary key)
create table test2(nid int not null auto_increment, name varchar(20), index(nid)) engine=InnoDB auto_increment=2 default charset=utf8
对于自增列,必须是索引(含主键)
10)修改自增起始值
alter table test auto_increment =10
如果当前自增值已经大于了我们设置的这个值,那么这个值会被忽略。
11)联合主键
create table tb1(id int not null, name varchar(30) not null, primary key(id, varchar))
insert into tb1(id, name) select 1,'jone' union select 1, 'marry';
12)修改主键
alter table test modify id int not null primary key aotu_increment
13)删除主键
alter table test modify id int not null;
14)删除表/数据
drop table tb1 删除表数据及表结构,不支持事物回滚
delete from table 删除表中所有数据,每删除一行就会写入日志,所以是支持事物回滚的。
truncate table 删除速度快于delete,也是删除全部数据,但是不支持事务回滚
速度 drop>truncate>delete
6、数据查询
1)条件查询
select name,age from tb1 where age (not) between 20 and 25;
select name,age as p_age from tb1 where gender="male" and age>20;
2)NULL查询
select * from tb1 where name is (not) NULL
3)ifnull
select ifnull(name, '你猜') as name, age from tb1
当name为null的时候,ifnull函数会取下标为1的值
3)IN 查询
select * from tb1 where age=20 or age=30 or age=40 or age=50;
= select * from tb1 where age in (20,30,40,50);
4)模糊查询(like)
select * from tb1 where name like 'han%'
select * from tb1 where name like 'han_'
select * from tb1 where name like "%/_%" escape '/'
这里用到了三种通配符:
%:匹配任意多个字符
_:匹配任意一个字符(包括中文)
escape '/':'/' 斜线后面的那一个通配符作为不同字符使用,不再作为通配符。其他地方的通配符 仍旧作为通配符使用。
5)分页查询
select * from tb1 limit 10 // 取10条数据
select * from tb1 limit start, num // 从第start条开始取,向后取num条
select * from tb1 limit 10 offset 20 // 从第20条数据开始取,向后取10条
6)结果集排序
select * from tb1 order by id desc, age asc // desc:从大到小 asc:从小到大
select * from tb1 order by id desc limit 10 // 取后10条数据
7)分组查询 group by
分组函数规则:
1)select [聚合函数] 字段名 from <tablename>
[where 查询条件]
[group by 查询条件]
[having过滤条件]
2)出现在select子句中的单独列必须出现在group by子句中作为分组列
3)分组列中可以不出现在select子句中
4)分组列可以出现在select子句中的一个复合表达式中
5)如果group by后面是一个复合表达式,那么在select子句中,它必须整体作为一个表达式的部分才能使用
select year(d) as '年', month(d) as '月', day(d) as '日', date(d) as '日期', count(to_days(d)=to_days(now())) from tb2 group by tb2
8)group_concat()
返回的是一个组的所有值以逗号隔开的字符串
select year(d) as '年', group_concat(d) from tb2 group by year(d)
9)having 子句:对分组结果进行过滤
与where子句的区别:
where子句在分组前过滤; having在分组后过滤
不能在where子句中使用组函数,原因就是组函数只能在分组函数执行完成之后执行
having子句可以单独使用,不用和group by组合
如果有group by函数,则having子句中的列必须出现在group by函数中,或者是select子句的聚合函数。
10)去重复查询 distinct
select distinct * from tb1
7、数据插入
insert into tb1(字段1,字段2...) values(值1,值2...) , (值1,值2...), (值1, 值2)
insert into tb1(字段1,字段2...) select 字段1,字段2 from tb1
insert into tb1(字段1,字段2...) select 值1,值2 union select 值1,值2 union select 值1,值2;
时间插入 now()
create table tb2(d date, t time, dt datetime)
insert into tb2 values(now(), now(), now())
select * from tb2;
8、数据删除
delete from tb1 where ...
9、修改数据
update tb1 set 字段1='值1', 字段2='值2' where ...
10、聚合函数
常用的聚合函数有 count(), sum(), max(), min(), avg()
count():求个数
select count(*) from tb1 //求tb1表行数
select count(name) from tb1 // 求tb1表中name为非null 的行数 (为空的也算一个)
sum():求和
max():求最大值
min():求最小值
avg():求平均值
select sum(price), max(price) as '最贵', min(price) as '最便宜', avg(price) from tb1
11、多表相关查询
1)union:用于合并两个或多个select语句的结果集
使用union的各select语句必须拥有相同数量的列,且列的类型要相同。
union默认是去重的,如果要显示所有数据,需要用union all
union结果集中列名,总是使用第一个select语句的列名
2)JOIN:实现多表联合查询,默认是inner join
多表查询的时候,要注意多变之间的关联,否则会容易引起笛卡尔乘积现象
语法:
select 查询类别
from 表1 别名
join(连接类型) 表2 别名
on 连接条件
【where 筛选条件】
【group 分组】
【having 帅选条件】
【order by 排序列表】
内连接:inner join和等值连接效果是一样的。
join(inner join):返回匹配条件的数据项;连接条件放在on后面,筛选条件放在where后面。
select * from tb1 join tb2 on tb1.t_id = tb2.id
外连接:主要用于查询一个表中有,另一个表中没有的记录。
外连接查询的结果=内连接的结果+主表中有而从表中没有的记录。
如果从表中有和主表匹配的记录,则返回匹配的值
如果从表中没有和主表匹配的记录,则显示null
left join:左边是主表。返回join左侧的所有数据,join后边的表中如果没有匹配的数据,值设为为null
right join:右边是主表。返回join右侧的所有数据,join左侧的表中如果没有匹配的数据,值设为null
如查询没有学生的学校的名字
select sc.name from school sc left join student st on st.school_id = sc.id where st.school_id is null;
3)多表查询规则:
a)烦是可以使用table表名的地方,都可以使用一个(括号)括起来的join语句
select * from ((A join B on A.b_id=B.id) join C on B.id = C.b_id) on A.c_id=C.id
4)直接连表操作
select * from tb1, tb2 where tb1.tid = tb2.id
12、起别名 as或者空格
select s.name '学生名字',s1.name '学校名字' from student s, schools1 where s.school_id=s1.id;
select * from (select name, school_id from student union select name, id from school) as e where e.school_id=2;
13、mysql 运算符
+-*/:数学运算 加 100+100-->200 '100'+100--->200 'abcd'+100--->100 null+100--->null
1)尝试将不是数字的字符串转化为数字
2)转化不了为数字的字符串为0
3)只要有一方为null,则结果为null
14、字符串连接 concat
说明:
char是定长字符串,varchar是变长字符串,char更快,varchar更节省空间,但是对于本身就是定长的如IP等,使用char就会比使用varchar好
创建数据库或者优化的时候,也应该把char放到前面,这样效率更高
参考资源:
https://blog.csdn.net/longting_/article/details/80658105
https://www.cnblogs.com/Jeffding/p/7535192.html
http://www.runoob.com/mysql/mysql-administration.html