SQL命令和SQL语句

Mysql客户端命令

\q:exit   退出

所有的SQL语句都是以分号结束的.

\c:clear   中断不想执行的SQL语句

\G:格式化显示查询的结果(key:value)

\T:tee  记录日志

\u:use 切换数据库

\h:help 查看帮助信息

\s:status  查看当前库详细信息

\ .:source 导入SQL文件中的数据

Mysql常用命令行

#登录mysql:(#注意不要把密码写到命令行)

mysql -uroot -p

-S  指定socket文件位置    
mysql -uroot -p -S /application/mysql/tmp/mysql.sock 

注:
如果是编译安装的mysql,可以省略-S 
如果其他方式呢,加上-S 

-h  指定链接的地址
mysql -uroot -p -h 10.0.0.51 

-P  指定链接的端口号

mysql -uroot -p -h 10.0.0.51  -P 3307

-e  免交互式执行mysql内部命令

mysql -uroot -p -e "select user,host,password from mysql.user;"

<  导入SQL脚本到mysql中

mysql -uroot -p </root/world.sql

mysqladmin命令

1.修改密码,设置密码:password
mysqladmin -uroot -p旧密码 password '新密码'

2.关闭MySQL服务:shutdown
mysqladmin -uroot -p密码 -S socket文件 shutdown

3.库外建库:create
mysqladmin -uroot -p密码 create zls

mysql -uroot -p123 -e 'create database zls2'

4.库外删除数据库:drop
[root@db01 ~]# mysqladmin -uroot -p123 drop zls1
Do you really want to drop the 'zls1' database [y/N] y
Database "zls1" dropped

5.查看配置文件所有的默认参数:variables
mysqladmin -uroot -p123 variables

6.检测MySQL进程是否存活:ping
mysqladmin -uroot -p123 ping

7.查看数据库 慢查询,负载信息:status
mysqladmin -uroot -p123 status

8.重载授权表,刷新缓存主机:reload
mysqladmin -uroot -p123 reload

9.刷新binlog日志
mysqladmin -uroot -p123 flush-log

SQL语句:

​ DDL:数据定义语言

​ 库对象:库名字,库属性

​ 开发规范:库名小写

1.针对库的操作:
建库:
create database bgx;
create schema long;
create database if not exists long;
create database if not exists huan collate utf8_general_ci charset utf8;
删库:
drop database long;
修改库:
alter database huan charset utf8;
2.针对表的操作:
建表:
    create table huan(id int);
    create table huan2( id int, name varchar(10), gender enum('m','f','oldtian'));
        
    create table huan( 
    id int, 
    name varchar(10), 
    age tinyint, 
    gender enum('f','m'), 
    cometime datetime);
表名:student
        sid
        sname
        sage
        sgender
        scometime

    数据类型
    int:        整数 -2^31 ~ 2^31 -1
    tinyint:    最小整数 -128 ~ 127
    varchar:    字符类型 (变长)
    char:       字符类型 (定长)
    enum:       枚举类型
    datetime:  时间类型 年月日时分秒
数据属性:
        not null:           非空
        primary key:        主键(唯一且非空的)
        auto_increment:     自增(此列必须是:primary key或者unique key)
        unique key:         单独的唯一的
        default:            默认值
        unsigned:           无符号,非负数
        comment:            注释
修改表:
    添加字段:
#添加字段(默认添加到最后)
alter table student add 字段 varchar(10);
#在表头添加字段
alter table student add 字段 varchar(10) first;
#在指定字段之后添加字段
alter table student add 字段 varchar(10) after 字段;
#添加多个字段
alter table student add xiejun varchar(10),add lixin varchar(20);
#删除字段
alter table student drop xiejun;        
#修改字段的数据类型:(只能支持单个修改,不支持多个)
alter table student modify 字段 int;          
#修改字段名:
alter table student change lixin xiewang int;           
#修改字段名和数据类型
alter table student change xiewang lixin char(10);          
#修改表名
alter table student rename stu;

DCL:数据控制语言 control

grant
grant:
            grant all on *.* to root@'%' identified by '123';
            max_queries_per_hour:一个用户每小时可发出的查询数量
            max_updates_per_hour:一个用户每小时可发出的更新数量
            max_connections_per_hour:一个用户每小时可连接到服务器的次数
            max_user_connections:允许同时连接数量
revoke:
        revoke select on *.* from root@'%';

DML:数据操作语言

grant insert,update,delete,select
insert
insert:插入数据
    #不规范写法
mysql> insert into huan values(1,'wu',18,'f',now());
    
    #规范写法,插入一条数据
mysql> insert into huan(name,age,gender) values('ding',28,'m');
    
    #规范写法,插入多条数据
mysql> insert into huan(name,age,gender) values('long',18,'f'),('liu',84,'f');
update
update:修改数据
    #危险,整列全都修改成f
    update test.huan set gender='f';
    
    注意:使用update时,必须要接条件(where)
    update test.huan set gender='m' where id=7;
    
    #就是修改整列内容
    update test.huan set name='oldboy' where 1=1;
delete
delete:删除数据
#危险,删除整张表的数据
delete from test.huan;
注意:使用delete时,必须接条件(where)
delete from test.huan where id=13;

#就是修改整表内容
delete from test.huan where 1=1;

删除列(字段):
alter table test.huan drop name;
使用update代替delete做伪删除:
    1.添加一个状态列(一段),表示该行数据的状态
    alter table test.huan add status enum('0','1') default '1';
    
    2.如何删除数据?
    update test.huan set status='0' where id=9;
    
    3.如何查询数据?
    select * from test.huan where status='1';

DQL:数据查询语言

select:查询数据(awk)
    #查看表中所有内容(危险)
    select * from test.huan;
    
    #如果要查询所有数据的总量,使用count
    select count(*) from test.huan;
    
    #查看某几列中的内容
    select gender,age from test.huan;

    #查询,接多条件
    select gender,age from test.huan where age=18 and gender='f';
    
    mysql> use world

    mysql> show tables;
    +-----------------+
    | Tables_in_world |
    +-----------------+
    | city            |     城市
    | country         |     国家
    | countrylanguage |     国家语言
    +-----------------+
    #查看city表中所有的内容
    select * from city;
    #查询city表中的字段(表结构)
    desc city;

    order by :排序
    #按照人口数量排序(升序)
    select * from city order by population;
    
    #按照人口数量排序(降序)
    select * from city order by population desc;

    #按照人口数量排序,前十的(limit)
    select * from city order by population limit 10;
    
    #按照步长60查找数据(翻页)
    select * from world.city limit 60,60
    
    where接条件: > < = , >= <= (!= <>  不等于),like ,and,or
    
    =:精确查询
    > < = , >= <= != :范围查询
    like:模糊查询
    
    #模糊查询
    select * from world.city where countrycode like '%H%';

    #or
    select * from world.city where countrycode='CHN' or countrycode='USA';
    
    #in
    select * from world.city where countrycode in ('CHN','USA');
                                               not in
    #union all (联合查询)
    select * from world.city where countrycode='USA' union all select * from world.city where countrycode='CHN';
#select高级用法,多表联查
查看人口超过100万人口的城市,国家名国家代码,国土面积

mysql> select city.name,city.countrycode,country.name,country.SurfaceArea
    -> from city join country
    -> on city.countrycode=country.code
    -> where city.population > 1000000
    order by city.population
    desc limit 10,10;
 #传统方式多表连查
    select city.name,city.population,country.name 
    from city,country 
    where city.countrycode=country.code 
    and city.population 1000000;
    ORDER BY population;
 
#select 内连接(用的最多,最好用)
#查询龙在曾的课程里获得的分数
select student.sno,student.sname,student.sage,student.class,
teacher.depart,teacher.prof,
score.mark,teacher.tname,
course.cname
from score  
join student on score.sno=student.sno
join course on score.cno=course.cno
join teacher on course.tno=teacher.tno
where student.sname='龙'
and teacher.tname='曾';
 
#union all (联合查询),速度更快 union all 
        select * from world.city where countrycode='USA' union all select * from world.city where countrycode='CHN';

聚合函数:GROUP BY + 聚合函数 (COUNT(),MAX(),MIN(),AVG(),SUM())

(1) COUNT(),统计数量
  统计city表中城市的个数.
  SELECT COUNT(*) FROM city;
  使用* 是直接查找主键,因为count是直接查主键的
 (2)统计一下各个国家的城市个数     (原理是以国家的名字来分,一个相同的国家名就+1)
 (还有一种想法是,数个数,所以使用count(name),然后什么什么的,加上group by,就是形容词就是放在group by 后面)
 mysql> select countrycode,count(name) as a from city group by countrycode order by a desc limit 10;
+-------------+-----+
| countrycode | a   |
+-------------+-----+
| CHN         | 363 |
| IND         | 341 |
| USA         | 274 |
| BRA         | 250 |
| JPN         | 248 |
| RUS         | 189 |
| MEX         | 173 |
| PHL         | 136 |
| DEU         |  93 |
| IDN         |  85 |
+-------------+-----+
 
 (3)统计一下中国 , 各省的 人口 总和(SUM()).
 SELECT district, SUM(population) 
 FROM city  
 WHERE countrycode='chn' 
 GROUP BY district;
 
 mysql> select District,sum(population) from city  where countrycode='chn' group by district; ####group by 一定要放在最后面
 
 (4)统计 每个国家的人口总数
 SELECT countrycode,SUM(population) 
 FROM city
 GROUP BY countrycode;

外链接

#左连接
mysql> select teacher.tname,course.cname 
    -> from teacher 
    -> left join course 
    -> on teacher.tno=course.tno
    -> and teacher.tname='曾';
+-------+-----------+
| tname | cname     |
+-------+-----------+
| 曾    | 数据库    |
| 田    | NULL      |
| 徐    | NULL      |
+-------+-----------+
3 rows in set (0.00 sec)
 
#右连接
mysql> select teacher.tname,course.cname 
    -> from teacher 
    -> right join course 
    -> on teacher.tno=course.tno
    -> and teacher.tname='曾';
+-------+-----------+
| tname | cname     |
+-------+-----------+
| 曾    | 数据库    |
| NULL  | 架构      |
| NULL  | 计算机    |
+-------+-----------+
 

子查询(不推荐,效率太低)

mysql> select name from country where code=(select countrycode from city where population<100);
+----------+
| name     |
+----------+
| Pitcairn |
+----------+
1 row in set (0.00 sec
{1}
我们可以用多表联查来搞定
mysql> select c.name
from country as c 
join city as t 
on c.code=t.countrycode
where t.population < 100 ;
+----------+
| name     |
+----------+
| Pitcairn |
+----------+
1 row in set (0.01 sec)
 

视图

一个视图就是一个查询方法
create view test as
sql语句

然后形成一个视图
下次可以直接查看 select * from test (test就是一个视图了,可以看成一张正常的表)

猜你喜欢

转载自www.cnblogs.com/longren/p/11200018.html