mysql(五)

2019-11-29  本文已影响0人  Freestyle_0f85

mysql管理命令

mysql> status    #查看数据库的状态(\s)
mysql> exit quit # 退出数据库(\q)
mysql> \c        #终止当前的SQL语句
mysql> help      #查看帮助信息(\h、?、\?)
mysql> source    #导入数据(\.)
mysql> use       #切换数据库(\u)
mysql> tee /tmp/a.log #记录操作日志(\T)
mysql> show slave status\G #将结果展示成key:value的形式

mysqladmin管理命令

#设置密码   password
[root@db01 ~]# mysqladmin -uroot -p1 password '123'
#关闭实例   shutdown
[root@db01 ~]# mysqladmin -uroot -p1 shutdown
#创建数据库  create
[root@db01 ~]# mysqladmin -uroot -p123 create oldboy2
#删除数据库  drop
[root@db01 ~]# mysqladmin -uroot -p123 drop oldboy2
#查看MySQL的参数  variables
[root@db01 ~]# mysqladmin -uroot -p123 variables
#刷新binlog日志   flush-log
[root@db01 ~]# mysqladmin -uroot -p123 flush-log
#重载授权表        reload
[root@db01 ~]# mysqladmin -uroot -p123 reload
#判断MySQL是否存活
[root@db01 ~]# mysqladmin -uroot -p123 ping

清空表数据

删除表信息的方式有两种 :
truncate table table_name;
delete * from table_name;
注 : truncate操作中的table可以省略,delete操作中的*可以省略

truncate、delete 清空表数据的区别 :
1> truncate 是整体删除 (速度较快),delete是逐条删除 (速度较慢)
2> truncate 不写服务器 log,delete 写服务器 log,也就是 truncate 效率比 delete高的原因

什么是sql语句

机构化查询语句
1.DDL(data definition language)
数据定义语言

针对库的DDL

#增(create)
mysql> create database db;
mysql> create schema db1;
mysql> create schema if not exists db1;
mysql> create database db2 charset utf8 collate utf8_general_ci;
#删(drop)
mysql> drop database zls1;
#改(alter)
mysql> alter database zls charset gbk;

##DQL ,查看建库语句(字符集)
mysql> show create database zls;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| zls      | CREATE DATABASE `zls` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+----------------------------------------------------------------+

针对表的DDL

#增
## 数据类型
整型
int         -2^31 ~ 2^31-1
tinyint     -128 ~ 127
字符串类型
char        定长   char(20)       tank
varchar     变长   varchar(20)    tank
枚举类型
enum
日期类型
datetime
timestamp

mysql> create table student(id int,name varchar(20),age tinyint,gender enum('f','m','qls'),cometime datetime);

mysql> desc student;
+----------+---------------------+------+-----+---------+-------+
| Field    | Type                | Null | Key | Default | Extra |
+----------+---------------------+------+-----+---------+-------+
| id       | int(11)             | YES  |     | NULL    |       |
| name     | varchar(20)         | YES  |     | NULL    |       |
| age      | tinyint(4)          | YES  |     | NULL    |       |
| gender   | enum('f','m','qls') | YES  |     | NULL    |       |
| cometime | datetime            | YES  |     | NULL    |       |
+----------+---------------------+------+-----+---------+-------+

##数据约束
1.非空:  not null
2.主键:  primary key
3.自增:  auto_increment
4.无符号: unsigned
5.默认值: default


create table student2(
id int not null primary key auto_increment,
name varchar(20) not null,
age tinyint unsigned not null,
gender enum('f','m'),
cometime datetime default NOW());

create table student4(
id int not null primary key auto_increment comment '学生学号',
name varchar(20) not null comment '学生姓名',
age tinyint unsigned not null comment '学生年龄',
gender enum('f','m') comment '学生性别',
cometime datetime default NOW()) comment '入学时间';

#删
mysql> drop table student3;

#改
1.插入字段
mysql> alter table stu add qiandao varchar(10);
2.在最前面插入字段
mysql> alter table stu add sb varchar(10) first;
3.将字段插入到某个字段的后面
mysql> alter table stu add wpw varchar(10) after qls;
4.删除字段
mysql> alter table stu drop wpw;
5.修改字段属性
mysql> alter table stu modify qls int;
6.修改字段名字,也可以修改属性
mysql> alter table stu change qls myj varchar(5);
7.修改表名
mysql> alter table stu rename stu3;

2.DML
数据操作语言

#插入数据 insert
1.不规范
mysql> insert into student4 values(1,'qiandao',84,'m',NOW());
2.规范写法
mysql> insert into student4(name,age,gender) values('qiandao',84,'m');
3.插入多条数据
mysql> insert into student4(name,age,gender) values('qiandao',84,'m'),('qiudao',73,'f');
4.利用表数据插入表数据
mysql> insert into student select * from student4;
#修改数据  update
1.不规范
mysql> update student set gender='m';
2.规范
mysql> update student set gender='m' where name='qiandao';
3.就算修改整列内容,也要加条件
mysql> update student set age=100 where 1=1;
#删除数据  delete
1.不规范
mysql> delete from test.student;
2.规范
mysql> delete from student4 where id=1;
3.规范
mysql> delete from student4 where 1=1;

使用updata代替delele做伪删除

# 1.添加状态列
mysql> alter table student4 add state enum('0','1') default '1';
# 2.使用update删除数据
mysql> update student4 set state='0' where id=7;
# 3.查询数据
mysql> select * from student4 where state='1';

3.DCL
数据控制语句

#查看用户权限
show grants for  root@'%';
#grant
grant all on *.* to root1@'%' identified by '123' with grant option;

grant all privileges on *.* to root@'%' identified by '123' with grant option;

#其他参数(扩展)
max_queries_per_hour:一个用户每小时可发出的查询数量
max_updates_per_hour:一个用户每小时可发出的更新数量
max_connetions_per_hour:一个用户每小时可连接到服务器的次数
max_user_connetions:允许同时连接数量

#给开发开权限
grant select() on ku.biao to dev1@'%' identified by '123' with max_queries_per_hour 1 max_updates_per_hour 1 max_connections_per_hour 1 max_user_connections 1;

#revoke
mysql> revoke select on *.* from root1@'%';

4.DQL
数据查询语句
select:基础用法

#导入数据
[root@db01 ~]# mysql < world.sql
mysql> show tables from world;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+

#使用count()函数
mysql> select count(*) from test.city_1;
#函数:
max()
min()
sum()
avg()
count()
distinct()

#查询所有数据
mysql> select * from world.city;

#where
mysql> select * from world.city where id=1;

#范围查询> 、 < 、<>
mysql> select * from world.city where id<10;
mysql> select * from city where countrycode='CHN' or countrycode='USA';
mysql> select * from city where countrycode in ('CHN','USA');

#联合查询
mysql> select * from city where countrycode='CHN' union all select * from city where countrycode='USA';

#limit
mysql> select * from test.city_1 where countrycode in ('CHN','USA') limit 120,60;
limit 10:取前10行
limit 10,20:取10行后面20行

#排序order by
升序
mysql> select * from world.city where countrycode='CHN' order by population;
降序
mysql> select * from world.city where countrycode='CHN' order by population desc;

#分组 group by
#此时此刻,我想吟诗一首
1.遇到统计想函数
2.形容词前groupby
3.函数中央是名词
4.列名select后添加

#统计世界上每个国家的总人口数
sum(population)
group by countrycode

select countrycode,sum(population) from world.city group by countrycode;

#统计中国各个省的人口数量(练习)
sum(population)
group by district

select district,sum(population)  from world.city where countrycode='CHN' group by district order by sum(population);

#别名
select district as 省 ,sum(population) as 总人口数 from world.city where countrycode='CHN' group by 省 order by 总人口数;

#统计每个国家的城市数量(练习)
count(name)
group by countrycode
select countrycode,count(district) from world.city group by countrycode;

#统计每个国家的省数量(练习)
mysql> select countrycode,count(distinct(district)) from world.city group by countrycode;

#模糊查询
mysql> select * from world.city where countrycode like '%H%';
mysql> select * from world.city where countrycode like '%H';
mysql> select * from world.city where countrycode like 'H%';

select 高级用法

15396104670598
1.传统连接
世界上,小于100人的城市,在哪个省,属于哪个国家,人口数量是多少?
城市名         省名               国家名               人口数量
city.name     city.district     country.name        city.population


select city.name as 城市名,city.district as 省,country.name as 国家,city.population as 城市人口数量
from city,country
where city.population < 100
and city.countrycode=country.code;


#世界上,小于100人的城市,在哪个省,属于哪个国家,人口数量是多少,说的是什么语言?
城市名      省名            国家名          人口数量             语言
city.name  city.district  country.name  city.population   countrylanguage.language

select city.name,city.district,country.name,city.population,countrylanguage.language
from city,country,countrylanguage
where city.population < 100
and city.countrycode=country.code
and country.code=countrylanguage.countrycode;

2.内连接

#世界上,小于100人的城市,在哪个省,属于哪个国家,人口数量是多少?
select city.name,city.district,country.name,city.population
from city join country
on city.countrycode=country.code
where city.population < 100;

#世界上,小于100人的城市,在哪个省,属于哪个国家,人口数量是多少,说的是什么语言?
A join B on 1 join C on 2 join D on 3

select city.name,city.district,country.name,city.population,countrylanguage.language
from city join country
on city.countrycode=country.code
join countrylanguage
on city.countrycode=countrylanguage.countrycode
where city.population < 100;

3.自连接

#世界上小于100人的城市说的什么语言?
城市名,语言,人口数量
city.name,countrylanguage.language,city.population
NATURAL JOIN

select city.name,countrylanguage.language,city.population
from city natural join countrylanguage
where city.population < 100;

#前提条件:两个表中必须有相同的列名字,并且数据一致

4.外连接

外连接分为左外连接和右外连接
左外连接:
mysql> select city.name,city.countrycode,country.name  from city left join country  on city.countrycode=country.code  and city.population<100 limit 10;
+----------------+-------------+------+
| name           | countrycode | name |
+----------------+-------------+------+
| Kabul          | AFG         | NULL |
| Qandahar       | AFG         | NULL |
| Herat          | AFG         | NULL |
| Mazar-e-Sharif | AFG         | NULL |
| Amsterdam      | NLD         | NULL |
| Rotterdam      | NLD         | NULL |
| Haag           | NLD         | NULL |
| Utrecht        | NLD         | NULL |
| Eindhoven      | NLD         | NULL |
| Tilburg        | NLD         | NULL |
+----------------+-------------+------+

右外连接
mysql> select city.name,city.countrycode,country.name  from city right join country  on city.countrycode=country.code  andd city.population<100 limit 10;
+------+-------------+----------------------+
| name | countrycode | name                 |
+------+-------------+----------------------+
| NULL | NULL        | Aruba                |
| NULL | NULL        | Afghanistan          |
| NULL | NULL        | Angola               |
| NULL | NULL        | Anguilla             |
| NULL | NULL        | Albania              |
| NULL | NULL        | Andorra              |
| NULL | NULL        | Netherlands Antilles |
| NULL | NULL        | United Arab Emirates |
| NULL | NULL        | Argentina            |
| NULL | NULL        | Armenia              |
+------+-------------+----------------------+
这两种连接会把全部的数据显示出来,但是不符合条件的会用null表示,符合调节的显示出来

where和having的区别

1.where是一条一条从磁盘读取,然后进行判断,符合条件放入内存
having是将所有数据读入内存,然后在内存中判断,不符合删除
2.having判断语句可以引用字段的别名(就是as设置的),where则不能使用
3.having可以使用统计函数,where不能使用。having放在group by后面,where在group by前面。
建议:小表在前,大表在后

用int类型插入怎么让数字显示001?
int(3) zerofill
最小位数是3位 不足3位用0填充

上一篇下一篇

猜你喜欢

热点阅读