MYSQL常用基础的命令

1.mysql命令行不能用
1.添加环境变量,分号连接,添加E:\phpStudy\PHPTutorial\MySQL\bin

到末尾,重启cmd

2.cd E:\phpStudy\PHPTutorial\MySQL\bin

mysql基本命令

1.关闭mysql

net stop msyql

2.开启mysql

net start mysql

mysql -h IP -P 3306 -uroot -p123123

数据定义语言,定义了不同的数据段\数据库\表\列\索引等数据库对象.
常用语句包括create\drop\alter等.
1.创建数据库
CREATE DATABASE dbname

例子:create database test1;

2.查看数据库

show databases

3.使用数据库

USE (数据库)

4.删除数据库

drop database (数据库)

5.创建表

mysql> create table (表名)(
-> id int not null primary key auto_increment, 自增属性
-> name char(20),
-> age tinyint(3),
-> banji varchar(10),
-> chengji int,
-> sex tinyint(3)
-> )engine=innodb auto_increment=1 default charset=utf8; /*

auto_increment=1 id意思从几开始自增
Query OK, 0 rows affected (0.08 sec)

6.查看表

1>desc (表名);
mysql> desc user_p;
±--------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±---------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(20) | YES | | NULL | |
| age | tinyint(3) | YES | | NULL | |
| banji | varchar(10) | YES | | NULL | |
| chengji | int(11) | YES | | NULL | |
| sex | tinyint(3) | YES | | NULL | |
±--------±------------±-----±----±--------±---------------+
6 rows in set (0.01 sec)
2>show create table (表名) \G; 更详细表信息

mysql> show create table user_p \G
*************************** 1. row ***************************
Table: user_p
Create Table: CREATE TABLE user_p (
id int(11) NOT NULL AUTO_INCREMENT,
name char(20) DEFAULT NULL,
age tinyint(3) DEFAULT NULL,
banji varchar(10) DEFAULT NULL,
chengji int(11) DEFAULT NULL,
sex tinyint(3) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

7.删除表

drop table (表名);

8.修改表

1>修改表字段类型

alter table (表名) modify[colunm] colunm_definition[first|after col_name]

例如:

修改表test的ename字段定义,将varchar(10)改为varchar(20)

alter table test modify ename varchar(20);
###############
mysql> desc user_p;
±--------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±---------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(20) | YES | | NULL | |
| age | tinyint(3) | YES | | NULL | |
| banji | varchar(10) | YES | | NULL | |
| chengji | int(11) | YES | | NULL | |
| sex | tinyint(3) | YES | | NULL | |
±--------±------------±-----±----±--------±---------------+
6 rows in set (0.01 sec)

mysql> alter table (表名) modify (表属性) char(36);
Query OK, 0 rows affected (0.14 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user_p; 20
±--------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±---------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(36) | YES | | NULL | |
| age | tinyint(3) | YES | | NULL | |
| banji | varchar(10) | YES | | NULL | |
| chengji | int(11) | YES | | NULL | |
| sex | tinyint(3) | YES | | NULL | |
±--------±------------±-----±----±--------±---------------+
6 rows in set (0.01 sec)

2>字段改名
alter table tbname change[colunm] old_col_name column_definition [first|after

col_name]
将age改名为age1,同时修改字段类型为int(4)
alter table (表名) change age age1 int(4);
alter table (表名) change age age int(4); //只修改属性
###############
mysql> alter table user_p change age age1 tinyint(3);
Query OK, 0 rows affected (0.14 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user_p;
±--------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±---------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(36) | YES | | NULL | |
| age1 | tinyint(3) | YES | | NULL | |
| banji | varchar(10) | YES | | NULL | |
| chengji | int(11) | YES | | NULL | |
| sex | tinyint(3) | YES | | NULL | |
±--------±------------±-----±----±--------±---------------+
6 rows in set (0.00 sec)

3>增加表字段

alter table tbname add[column] column_definition [first|after col_name]
例如:
alter table (表) add column age int(3);
###############
mysql> alter table user_p add column phone char(15);
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user_p;
±--------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±---------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(36) | YES | | NULL | |
| age1 | tinyint(3) | YES | | NULL | |
| banji | varchar(10) | YES | | NULL | |
| chengji | int(11) | YES | | NULL | |
| sex | tinyint(3) | YES | | NULL | |
| phone | char(15) | YES | | NULL | |
±--------±------------±-----±----±--------±---------------+
7 rows in set (0.00 sec)

4>删除表字段
alter table tbname drop[column] col_name;
例如:
alter table test drop column age;
#########################
mysql> alter table user_p drop column phone;
Query OK, 0 rows affected (0.14 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user_p;
±--------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±---------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(36) | YES | | NULL | |
| age1 | tinyint(3) | YES | | NULL | |
| banji | varchar(10) | YES | | NULL | |
| chengji | int(11) | YES | | NULL | |
| sex | tinyint(3) | YES | | NULL | |
±--------±------------±-----±----±--------±---------------+
6 rows in set (0.00 sec)

6.修改表名字

alter table tbname rename[to] new_tbname
例子:
alter table test rename test2;
#########################
mysql> alter table user_p rename user_j;
Query OK, 0 rows affected (0.04 sec)

mysql> show tables;
±---------------+
| Tables_in_test |
±---------------+
| cross_a |
| dian_b |
| dian_sex |
| jiangli |
| sex_a |
| sex_b |
| user_a |
| user_b |
| user_j |====user_p
| user_t |
| userpk |
±---------------+
11 rows in set (0.00 sec)

DML(data manipulation language)语句:

数据操纵语句,用于添加\删除\更新和查询数据库记录,并检查数据完整性.

常用语句insert\delete\update和select.

1.插入记录

1>插入一条

insert into tbname(field1,field2…) values(val1,val2…);

例子:

inset into test(ename,info) values(‘小白‘,2);
###################################################
mysql> insert into user_j(name,age1,banji,chengji,sex) values(‘xiaobai’,20,‘php
801’,500,1);
Query OK, 1 row affected (0.05 sec)

mysql> select * from user_j;
±—±--------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±—±--------±-----±--------±--------±-----+
| 1 | xiaobai | 20 | php1801 | 500 | 1 |
±—±--------±-----±--------±--------±-----+
1 row in set (0.00 sec)

2>插入多条

insert into tbname(field1,field2…)
values
(val1,val2…),(val1,val2…),……(val1,val2…);
##############################################
mysql> insert into user_j(name,age1,banji,chengji,sex) values(‘dongjinhua’,15,‘p
hp1803’,800,1),(‘chengguanghao’,38,‘php1803’,50,1);
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from user_j;
±—±--------------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±—±--------------±-----±--------±--------±-----+
| 1 | xiaobai | 20 | php1801 | 500 | 1 |
| 2 | dongjinhua | 15 | php1803 | 800 | 1 |
| 3 | chengguanghao | 38 | php1803 | 50 | 1 |
±—±--------------±-----±--------±--------±-----+
3 rows in set (0.00 sec)

成倍赋值:自己插自己,测试数据用
##########################
mysql> insert into dian_b(name,sex_id) select name,sex_id from dian_b;
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0

mysql> select count(1) from dian_b;
±---------+
| count(1) |
±---------+
| 8 |
±---------+
1 row in set (0.00 sec)

mysql> insert into dian_b(name,sex_id) select name,sex_id from dian_b;
Query OK, 8 rows affected (0.00 sec)
Records: 8 Duplicates: 0 Warnings: 0

2.更新记录

1>更新一个表中的数据

update tbname set field1=value1,field2=val2,… [where condition]

例子:

将表test中的ename为“lisa”的薪资(sal) 从2000改为4000

update test set sal=4000 where ename=’lisa’;
######################################################
mysql> update user_j set banji=‘php1804’ where name=‘dongjinhua’;
Query OK, 2 rows affected (0.04 sec)
Rows matched: 2 Changed: 2 Warnings: 0

mysql> select * from user_j;
±—±--------------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±—±--------------±-----±--------±--------±-----+
| 1 | xiaobai | 20 | php1801 | 500 | 1 |
| 2 | dongjinhua | 15 | php1804 | 800 | 1 |
| 3 | chengguanghao | 38 | php1803 | 50 | 1 |
| 4 | dongjinhua | 15 | php1804 | 800 | 1 |
| 5 | chengguanghao | 38 | php1803 | 50 | 1 |
±—±--------------±-----±--------±--------±-----+
5 rows in set (0.00 sec)

3.删除记录

1>删除一个表中的记录

delete from tbname [where condition]

例子:

delete from test where ename=’xiaobai’;
#####################################
mysql> delete from user_j where id=1;
Query OK, 1 row affected (0.02 sec)

mysql> select * from user_j;
±—±--------------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±—±--------------±-----±--------±--------±-----+
| 2 | dongjinhua | 15 | php1804 | 800 | 1 |
| 3 | chengguanghao | 38 | php1803 | 50 | 1 |
| 4 | dongjinhua | 15 | php1804 | 800 | 1 |
| 5 | chengguanghao | 38 | php1803 | 50 | 1 |
±—±--------------±-----±--------±--------±-----+
4 rows in set (0.00 sec)

2>删除多个表的记录???

delete tb1,tb2…tbn from tb1,tb2…tbn [where condition]

例子:

同时删除表emp和dept中的deptno为3的记录

delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;

备注:

如果from后面的表名用别名,则delete后面也要用相应的别名,否则会提示语法错误.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

保证添加足够的测试数据

mysql基础–查询语句select使用

1.查询不重复记录
select distinct deptno from emp;

############################
mysql> select distinct name from user_j;
±--------------+
| name |
±--------------+
| dongjinhua |
| chengguanghao |
| quhaijing |
| mahuan |
| songjiafei |
| zhangxinlei |
| licheng |
| qihaolong |
| yizihao |
±--------------+
9 rows in set (0.02 sec)

2.条件查询

select * from where deptno=1;

select * from where deptno=1 and sal<2000;

##########################################
mysql> select * from user_j where name=‘dongjinhua’;
±----±-----------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±----±-----------±-----±--------±--------±-----+
| 2 | dongjinhua | 15 | php1804 | 800 | 1 |
| 4 | dongjinhua | 15 | php1804 | 800 | 1 |
| 12 | dongjinhua | 15 | php1804 | 800 | 1 |
| 14 | dongjinhua | 15 | php1804 | 800 | 1 |
| 27 | dongjinhua | 15 | php1804 | 800 | 1 |
| 29 | dongjinhua | 15 | php1804 | 800 | 1 |
| 37 | dongjinhua | 15 | php1804 | 800 | 1 |
| 39 | dongjinhua | 15 | php1804 | 800 | 1 |
| 58 | dongjinhua | 15 | php1804 | 800 | 1 |
| 60 | dongjinhua | 15 | php1804 | 800 | 1 |
| 68 | dongjinhua | 15 | php1804 | 800 | 1 |
| 70 | dongjinhua | 15 | php1804 | 800 | 1 |
| 78 | dongjinhua | 15 | php1804 | 800 | 1 |
| 80 | dongjinhua | 15 | php1804 | 800 | 1 |
| 88 | dongjinhua | 15 | php1804 | 800 | 1 |
| 90 | dongjinhua | 15 | php1804 | 800 | 1 |
| 121 | dongjinhua | 15 | php1804 | 800 | 1 |
| 123 | dongjinhua | 15 | php1804 | 800 | 1 |
| 131 | dongjinhua | 15 | php1804 | 800 | 1 |
| 133 | dongjinhua | 15 | php1804 | 800 | 1 |
。。。。。。。
mysql> insert into user_j(name,age1,banji,chengji,sex) values(‘dongjinhua’,25,‘p
hp1805’,50,2);
Query OK, 1 row affected (0.04 sec)
mysql> select * from user_j where name=‘dongjinhua’ and banji=‘php1805’;
±----±-----------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±----±-----------±-----±--------±--------±-----+
| 504 | dongjinhua | 25 | php1805 | 50 | 2 |
±----±-----------±-----±--------±--------±-----+
1 row in set (0.00 sec)

3.排序和限制

1>常用取出按照某个字段进行排序后的记录结果,用关键字order by.

desc 降序,asc 升序,默认是升序

select * from emp order by sal;
##############################################
mysql> select * from user_j order by chengji limit 9;
±----±-----------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±----±-----------±-----±--------±--------±-----+
| 254 | songjiafei | 68 | php1803 | 30 | 1 |
| 157 | songjiafei | 68 | php1803 | 30 | 1 |
| 334 | songjiafei | 68 | php1803 | 30 | 1 |
| 84 | songjiafei | 68 | php1803 | 30 | 1 |
| 274 | songjiafei | 68 | php1803 | 30 | 1 |
| 33 | songjiafei | 68 | php1803 | 30 | 1 |
| 324 | songjiafei | 68 | php1803 | 30 | 1 |
| 167 | songjiafei | 68 | php1803 | 30 | 1 |
| 314 | songjiafei | 68 | php1803 | 30 | 1 |
±----±-----------±-----±--------±--------±-----+
9 rows in set (0.00 sec)

select * from emp order by sal desc;
###################################
mysql> select distinct name,chengji from user_j order by chengji desc limit 9;
±--------------±--------+
| name | chengji |
±--------------±--------+
| licheng | 2600 |
| dongjinhua | 800 |
| mahuan | 300 |
| yizihao | 260 |
| zhangxinlei | 260 |
| quhaijing | 100 |
| qihaolong | 80 |
| chengguanghao | 50 |
| dongjinhua | 50 |
±--------------±--------+
9 rows in set (0.00 sec)

2>对于排序后相同的字段进行再次排序

select * from emp order by sal, deptno desc;
###############################
mysql> select * from user_j where name=‘dongjinhua’ order by name,banji;
±----±-----------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±----±-----------±-----±--------±--------±-----+
| 400 | dongjinhua | 15 | php1804 | 800 | 1 |
| 318 | dongjinhua | 15 | php1804 | 800 | 1 |
| 310 | dongjinhua | 15 | php1804 | 800 | 1 |
| 308 | dongjinhua | 15 | php1804 | 800 | 1 |
| 300 | dongjinhua | 15 | php1804 | 800 | 1 |
。。。。。。。。
| 141 | dongjinhua | 15 | php1804 | 800 | 1 |
| 133 | dongjinhua | 15 | php1804 | 800 | 1 |
| 131 | dongjinhua | 15 | php1804 | 800 | 1 |
| 123 | dongjinhua | 15 | php1804 | 800 | 1 |
| 504 | dongjinhua | 25 | php1805 | 50 | 2 |
±----±-----------±-----±--------±--------±-----+
65 rows in set (0.00 sec)
mysql> select * from user_j where name=‘dongjinhua’ order by name,banji

desc;
±----±-----------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±----±-----------±-----±--------±--------±-----+
| 504 | dongjinhua | 25 | php1805 | 50 | 2 |
| 320 | dongjinhua | 15 | php1804 | 800 | 1 |
| 318 | dongjinhua | 15 | php1804 | 800 | 1 |
。。。。。。。。
| 131 | dongjinhua | 15 | php1804 | 800 | 1 |
| 123 | dongjinhua | 15 | php1804 | 800 | 1 |
| 2 | dongjinhua | 15 | php1804 | 800 | 1 |
±----±-----------±-----±--------±--------±-----+
65 rows in set (0.00 sec)
3>对于排序后的记录只显示一部分使用limit

select * from tbname……[limit 偏移量,记录行数]

例子:

select * from emp order by sal limit 3;

select * from emp order by sal limit 2,3;从第三条开始

备注:

默认起始偏移量为0,只写记录行数就行!!! limit 0,3 等价 limit 3
######################
mysql> select * from user_j where name=‘dongjinhua’ order by name,banji

desc limit 3;
±----±-----------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±----±-----------±-----±--------±--------±-----+
| 504 | dongjinhua | 25 | php1805 | 50 | 2 |
| 320 | dongjinhua | 15 | php1804 | 800 | 1 |
| 318 | dongjinhua | 15 | php1804 | 800 | 1 |
±----±-----------±-----±--------±--------±-----+
3 rows in set (0.00 sec)

4.聚合

聚合一般用于数据统计

语法:
select [field1,field2…]fun_name
from tbname
[where where_conditon]
[group by field1,field2…[with rollup]]
[having where_condition]

参数说明:
fun_name 表示要做的聚合操作,也就是聚合函数,常用的有sum(求和)\count(*)(记录

数)\max(最大值)\min(最小值).
group by 关键字表示和聚合的字段,比如按照部门分类统计员工数量,group by后就写

部门
with rollup 表示对分类聚合后的结果进行再汇总,记录是上面所有记录的总和。
having 表示对分类后的结果进行条件过滤
备注:
having对聚合后的结果进行过滤,where是在聚合前先进行过滤
有必要的话可以先where后进行聚合操作可以提高效率

group by 对哪个字段进行分组 group by 后边跟哪个字段

1.查看表中所有的记录个数
select count() from user_j;
###################
mysql> select count(
) from user_j;
±---------+
| count(*) |
±---------+
| 322 |
±---------+
1 row in set (0.00 sec)

2.as别名 :当我字段名特别长不好处理,没法处理 或者链接查询时候需要更短的sql

可以使用别名
######################
mysql> select count(*) as jilugeshu from user_j;
±----------+
| jilugeshu |
±----------+
| 322 |
±----------+
1 row in set (0.00 sec)

3.统计每个班有多少人
#################################
mysql> select banji,count() from user_j group by banji;
±--------±---------+
| banji | count(
) |
±--------±---------+
| php1801 | 32 |
| php1802 | 64 |
| php1803 | 128 |
| php1804 | 96 |
| php1805 | 2 |
±--------±---------+
5 rows in set (0.00 sec)

4.既要统计各班人数,又要统计总人数
###########################
mysql> select banji,count() from user_j group by banji with rollup;
±--------±---------+
| banji | count(
) |
±--------±---------+
| php1801 | 32 |
| php1802 | 64 |
| php1803 | 128 |
| php1804 | 96 |
| php1805 | 2 |
| NULL | 322 |
±--------±---------+
6 rows in set (0.01 sec)

5.统计人数大于2的班级
#######################
mysql> select banji,count() from user_j group by banji having count()>2;
±--------±---------+
| banji | count(*) |
±--------±---------+
| php1801 | 32 |
| php1802 | 64 |
| php1803 | 128 |
| php1804 | 96 |
±--------±---------+
4 rows in set (0.00 sec)

sum()求和
max()最大值
min()最小值
avg()平均值

6.统计学校所有同学的成绩总额\最高和最低
##############################
mysql> select sum(chengji),max(chengji),min(chengji) from user_j;
±-------------±-------------±-------------+
| sum(chengji) | max(chengji) | min(chengji) |
±-------------±-------------±-------------+
| 162550 | 2600 | 30 |
±-------------±-------------±-------------+
1 row in set (0.00 sec)

7.求出所有同学的平均成绩
#####################################
mysql> select avg(chengji) from user_j;
±-------------+
| avg(chengji) |
±-------------+
| 504.8137 |
±-------------+
1 row in set (0.00 sec)

8.求出每个班的最高成绩和最低成绩,以及班里的平均分
#################################
mysql> select banji,max(chengji),min(chengji),avg(chengji) from user_j group

by banji;
±--------±-------------±-------------±-------------+
| banji | max(chengji) | min(chengji) | avg(chengji) |
±--------±-------------±-------------±-------------+
| php1801 | 100 | 100 | 100.0000 |
| php1802 | 2600 | 300 | 1450.0000 |
| php1803 | 80 | 30 | 52.5000 |
| php1804 | 800 | 260 | 620.0000 |
| php1805 | 260 | 50 | 155.0000 |
±--------±-------------±-------------±-------------+
5 rows in set (0.00 sec)

9.求出班里人数大于30的班级 最高成绩;
#######################################
mysql> select banji,max(chengji) from user_j group by banji having count(*)

30;
±--------±-------------+
| banji | max(chengji) |
±--------±-------------+
| php1801 | 100 |
| php1802 | 2600 |
| php1803 | 80 |
| php1804 | 800 |
±--------±-------------+
4 rows in set (0.00 sec)

10.得出班里同学最高成绩不小500的 班级
###################################
mysql> select banji from user_j group by banji having max(chengji)>500;
±--------+
| banji |
±--------+
| php1802 |
| php1804 |
±--------+
2 rows in set (0.00 sec)

11.求出班里人数大于30的班级 最高成绩 排除1803班
having对聚合后的结果进行过滤,where是在聚合前先进行过滤
有必要的话可以先where后进行聚合操作可以提高效率
###################################
结合第 9 个来看
mysql> select banji,max(chengji) from user_j where banji!=‘php1803’ group by

banji having count(*)>
0;
±--------±-------------+
| banji | max(chengji) |
±--------±-------------+
| php1801 | 100 |
| php1802 | 2600 |
| php1804 | 800 |
±--------±-------------+
3 rows in set (0.00 sec)

5.表连接

内连接: 只连接匹配的行
左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右

边表中全部匹配的行
右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左

边表中全部匹配的行

效率问题:
1.inner join比left join快
注:inner join 内连接等价于下面的sql: SELECT A.name, B.address FROM A, B

WHERE A.id = B.A_id所以一般要用一般的连接就可以了.

###################################
内连接: 只连接匹配的行
mysql> select * from user_j,sex_b where user_j.sex=sex_b.sex_id limit 30;
±—±--------------±-----±--------±--------±-----±-------±----------+
| id | name | age1 | banji | chengji | sex | sex_id | sex_title |
±—±--------------±-----±--------±--------±-----±-------±----------+
| 2 | dongjinhua | 15 | php1804 | 800 | 1 | 1 | nan |
| 3 | chengguanghao | 38 | php1803 | 50 | 1 | 1 | nan |
| 4 | dongjinhua | 15 | php1804 | 800 | 1 | 1 | nan |
| 5 | chengguanghao | 38 | php1803 | 50 | 1 | 1 | nan |
| 6 | quhaijing | 28 | php1801 | 100 | 2 | 2 | nv |
。。。

注:没有重复字段名的时候可以用*将两张表的所有字段显示出来,没意义,不建议

######################################
内连接: 只连接匹配的行
mysql> select name,banji,age1,chengji,sex_b.sex_title as sex_title from

user_j,sex_b where user_j.sex=sex_b.sex_i
d limit 30;
±--------------±--------±-----±--------±----------+
| name | banji | age1 | chengji | sex_title |
±--------------±--------±-----±--------±----------+
| dongjinhua | php1804 | 15 | 800 | nan |
| chengguanghao | php1803 | 38 | 50 | nan |
| dongjinhua | php1804 | 15 | 800 | nan |
| chengguanghao | php1803 | 38 | 50 | nan |
| quhaijing | php1801 | 28 | 100 | nv |
| mahuan | php1802 | 18 | 300 | nv |
。。。。。。。。。。
注:尽量规范select 字段的 书写方式,在关联查询的时候将字段名标识上表名并且给

予别名

:inner join 内连接等价于下面的sql: SELECT A.name, B.address FROM A, B

WHERE A.id = B.A_id所以一般要用一般的连接就可以了.
######################################
内连接: 只连接匹配的行
mysql> select name,banji,age1,chengji,sex_b.sex_title from user_j inner join

sex_b on user_j.sex=sex
_b.sex_id limit 30;
±--------------±--------±-----±--------±----------+
| name | banji | age1 | chengji | sex_title |
±--------------±--------±-----±--------±----------+
| dongjinhua | php1804 | 15 | 800 | nan |
| chengguanghao | php1803 | 38 | 50 | nan |
| dongjinhua | php1804 | 15 | 800 | nan |
| chengguanghao | php1803 | 38 | 50 | nan |
| quhaijing | php1801 | 28 | 100 | nv |
| mahuan | php1802 | 18 | 300 | nv |
| songjiafei | php1803 | 68 | 30 | nan |
| zhangxinlei | php1804 | 18 | 260 | nan |
| licheng | php1802 | 58 | 2600 | nan |
| qihaolong | php1803 | 38 | 80 | nan |
| dongjinhua | php1804 | 15 | 800 | nan |
| chengguanghao | php1803 | 38 | 50 | nan |
| dongjinhua | php1804 | 15 | 800 | nan |
| chengguanghao | php1803 | 38 | 50 | nan |

######################################
2>左连接:包含所有左边表中的记录甚至是右边表中没有和它匹配的记录
mysql> select * from dian_b;
±—±---------±-------+
| id | name | sex_id |
±—±---------±-------+
| 1 | xiaohong | 1 |
| 2 | xiaobai | 1 |
| 3 | xiaohei | 2 |
| 5 | xiaowu | 5 |

| 30 | xiaohong | 1 |
| 31 | xiaobai | 1 |
| 32 | xiaohei | 2 |
| 33 | xiaowu | 5 |
±—±---------±-------+
32 rows in set (0.00 sec)

mysql> select * from sex_b;
±-------±----------+
| sex_id | sex_title |
±-------±----------+
| 1 | nan |
| 2 | nv |
| 3 | renyao |
| 4 | renshou |
±-------±----------+
4 rows in set (0.00 sec)

mysql> select name,sex_b.sex_title as sex from dian_b left join sex_b on

dian_b.sex_id=sex_b.sex_id

±---------±-----+
| name | sex |
±---------±-----+
| xiaohong | nan |
| xiaobai | nan |
| xiaohei | nv |
| xiaowu | NULL |

| xiaohong | nan |
| xiaobai | nan |
| xiaohei | nv |
| xiaowu | NULL |
±---------±-----+
32 rows in set (0.00 sec)

&&&所有链接中(内,左,右) on dian_b.sex_id=sex_b.sex_id <=> using

(sex_id)
如果两张关联表匹配的两个字段名字相同可以使用using(sex_id)
##########################################
mysql> select name,sex_b.sex_title as sex from dian_b left join sex_b using

(sex_id);
±---------±-----+
| name | sex |
±---------±-----+
| xiaohong | nan |
| xiaobai | nan |
| xiaohei | nv |
| xiaowu | NULL |
| xiaohong | nan |
| xiaobai | nan |
| xiaohei | nv |
| xiaowu | NULL |
| xiaohong | nan |
| xiaobai | nan |
| xiaohei | nv |
。。。。。。。。

6.子查询

某些情况下需要查询的时候,需要的条件是另一个select语句的结果,这时候用子查询.

用于子查询的关键字包括(in|not in|=|!=|exists|not exists)等.
例子:
1>in 条件记录为多个
select * from emp where deptno in(select deptno from dept)
2.= 条件记录为1
select * from emp where deptno=(select deptno from dept where id=1);
备注:

某些情况下表连接可以替代子查询用于优化
############################################
mysql> select distinct user_id from jiangli;
±--------+
| user_id |
±--------+
| 1 |
| 2 |
±--------+
2 rows in set (0.00 sec)

mysql> select * from user_j where id in(1,2);
±—±-----------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±—±-----------±-----±--------±--------±-----+
| 2 | dongjinhua | 15 | php1804 | 800 | 1 |
±—±-----------±-----±--------±--------±-----+
1 row in set (0.00 sec)

mysql> select * from user_j where id in(select distinct user_id from jiangli);
±—±-----------±-----±--------±--------±-----+
| id | name | age1 | banji | chengji | sex |
±—±-----------±-----±--------±--------±-----+
| 2 | dongjinhua | 15 | php1804 | 800 | 1 |
±—±-----------±-----±--------±--------±-----+
1 row in set (0.00 sec)

7.记录联合

有时候需要将两张表的记录查询出来之后合并到一起显示

select deptno from emp
union [all]
select deptno from dept;

union 合并到一起并且进行一次distinct去重
union all 合并到一起显示

user
user1(id:1-100) user2(id:101-200) user3(id:201-300) desc属性相同
#######################
mysql> select name from user_a union select name from user_b;
±----------+
| name |
±----------+
| xiaowang |
| xiaoli |
| xiaozu |
| xiaohuang |
| xiaogao |
| xiaozhou |
| xiaoyang |
| xiaosong |
| xiaozhang |
±----------+
9 rows in set (0.05 sec)
mysql> select name from user_a union all select name from user_b limit 30;
±----------+
| name |
±----------+
| xiaowang |
| xiaoli |
| xiaozu |
| xiaohuang |
| xiaogao |
| xiaozhou |
| xiaoyang |
| xiaosong |
| xiaozhang |
| xiaowang |
| xiaoli |
| xiaozu |
| xiaohuang |
| xiaogao |
| xiaozhou |
| xiaoyang |
| xiaosong |

1.sql打印3遍(理解就可)
2.sql抄写10遍

MySQL数据库命令大全
–数据库操作前的准备
– 创建数据库
– create database python_test_1 charset=utf8;
– 使用数据库
– use python_test_1;
– students表
– create table students(
– id int unsigned primary key auto_increment not null,
– name varchar(20) default ‘’,
– age tinyint unsigned default 0,
– height decimal(5,2),
– gender enum(‘男’,‘女’,‘中性’,‘保密’) default ‘保密’,
– cls_id int unsigned default 0,
– is_delete bit default 0
– );
– classes表
– create table classes (
– id int unsigned auto_increment primary key not null,
– name varchar(30) not null
– );

– 查询练习
– 查询所有字段
– select * from 表名;
select * from students;

– 查询指定字段
– select 列1,列2,… from 表名;
select name,age from students;

– 使用 as 给字段起别名
– select 字段 as 名字… from 表名;
select name as ‘姓名’,age from students;

– select 表名.字段 … from 表名;
select students.name from students;

– 可以通过 as 给表起别名
– select 别名.字段 … from 表名 as 别名;
select * from students as s;
select s.name from students as s;

– 消除重复行(查性别)

– distinct 字段 不要记有个印象
select distinct gender from students;

< >= <= != <>
– 条件查询
– 比较运算符
– select … from 表名 where …
– >
– 查询年纪大于18岁的信息
select * from students where age > 18;

– <
– 查询年纪小于18岁的信息
select * from students where age < 18;
– >=
– <=
– 查询小于等于18岁的信息
select * from students where age <= 18;
– =
– 查询年龄为18岁的所有学生的名字
select * from students where age = 18;

– != 或者 <>
– 查询年龄不为18岁的所有学生的名字
select * from students where age != 18;
– select * from students where age <> 18;
and or not
– 逻辑运算符
– and
– 18和28之间的所以学生信息
select * from students where age > 18 and age < 28;

– 18岁以上的女性
select * from students where age > 18 and gender = ‘女’;

– or
– 18以上或者身高高过180(包含)以上
select * from students where age > 18 or height >= 180;
– not
– 不在 18岁以上的女性 这个范围内的信息
– select * from students where not (age>18 and gender=2);
select * from students where not age > 18 and gender= “女”;
select * from students where not (age > 18 and gender = “女”);

like % _
– 模糊查询(where name like 要查询的数据)
– like
– % 替换任意个
– _ 替换1个
– 查询姓名中 以 “小” 开始的名字
select * from students where name like ‘小%’;
– 查询姓名中 有 “小” 所有的名字
select * from students where name like ‘%小%’;
– 查询有2个字的名字
select * from students where name like ‘__’;

– 查询有3个字的名字
select * from students where name like ‘___’;

– 查询至少有2个字的名字
select * from students where name like '%’;
select * from students where name not like "
";

– 范围查询
– in (1, 3, 8)表示在一个非连续的范围内
– 查询 年龄为18或34的姓名
select * from students where age = 18 or age = 34 ;
select * from students where age in (18,34);
– not in 不非连续的范围之内
– 年龄不是 18或34岁的信息
select * from students where age not in(18,34);

– between … and …表示在一个连续的范围内
– 查询 年龄在18到34之间的的信息
select * from students where age > 18 and age < 34;
– between xxx and xxx
select * from students where age between 18 and 34; --between…and…这是包含两端的数据

– not between … and …表示不在一个连续的范围内
– 查询 年龄不在18到34之间的的信息
select * from students where age not between 18 and 34;
– 空判断
– 判空is null
– 查询身高为空的信息
select * from students where height is null;

– 判非空is not null
select * from students where height is not null;

order by 字段 asc,desc
– 排序
– order by 字段
– asc
– asc从小到大排列,即升序
– desc
– desc从大到小排序,即降序
– 查询年龄在18到34岁之间的男性,按照年龄从小到大到排序
select * from students where (age between 18 and 34) and gender=‘男’ order by age asc;

– 查询年龄在18到34岁之间的女性,身高从高到矮排序
select * from students where (age between 18 and 34) and gender =‘女’ order by height desc;
– order by 多个字段
– 查询年龄在18到34岁之间的女性,身高从高到矮排序, 如果身高相同的情况下按照年龄从小到大排序
select * from students where (age between 18 and 34) and gender = ‘女’ order by height desc,age asc;

– 如果年龄也相同那么按照id从大到小排序
select * from students where (age between 18 and 34) and gender =‘女’ order by height desc,age asc,id desc;
– 排序有优先级,第一个主排序,后面是次排序,在保证主排序不变的情况下,能排就排,不排就算了

– 聚合函数
– 总数
– count
– 查询男性有多少人 count(字段) 要注意如果值有null那么不会进行计算
select count(*) from students where gender=‘男’;

– 最大值
– max
– 查询最大的年龄
select max(age) from students;

– 查询女性的最高 身高
select max(height) from students where gender =‘女’;

– 最小值
– min
select min(age) from students ;

– 求和
– sum
– 计算所有人的年龄总和
select sum(age) from students;

– 平均值
– avg
– 计算平均年龄
select avg(age) from students;

– 计算平均年龄 sum(age)/count()
select sum(age)/count(
) from students;

– 四舍五入 round(123.23 , 1) 保留1位小数
– 计算所有人的平均年龄,保留2位小数
select round (avg(age),2) from students;

– 计算男性的平均身高 保留2位小数
select round(avg(height),2) from students where gender=‘男’;
select avg(height) from students where gender = ‘男’;

– 分组
– group by
– 按照性别分组,查询所有的性别
– select 分组字段 from 表名 group by 分组字段;
select gender from students group by gender;
select 分组字段 from 表名 group by 分组字段;

– 计算每种性别中的人数
select gender,count(*) from students group by gender;

– group_concat(…)
– 查询同种性别中的姓名
select gender,group_concat(name) from students group by gender;

– 查询每组性别的平均年龄
select gender,avg(age) from students group by gender;

– select * from students where
– group by xxx having having用在分组条件
– having(注意having和group by 连用 having后通常也要跟 聚合函数)
– 查询平均年龄超过30岁的性别,以及姓名
select gender ,avg(age) from students group by gender having avg(age) > 30;

– 查询每种性别中的人数多于2个的信息
select gender,count() from students group by gender having count() > 2;

– with rollup 汇总的作用(了解)
–select gender,count() from students group by gender with rollup;
select gender,count(
) from students group by gender with rollup having count(*) >2;

–按性别分组,平均身高大160的女性组的名字
select gender,avg(height),group_concat(name) from students group by gender having avg(height) > 160 and gender=‘女’;

– limit 起始位置,个数, 这个一定要放在最后
– 分页
– limit start, count
– limit 放在最后面(注意)
起始位置 = (页数-1)*每页的个数

– 限制查询出来的数据个数
– 查询前5个数据
select * from students limit 0,5;

– 每页显示2个,第1个页面
select * from students limit 0,2;
– 每页显示2个,第2个页面
select * from students limit 2,2;
– 每页显示2个,第3个页面
select * from students limit 4,2;
– 每页显示2个,第4个页面
select * from students limit 6,2;

– 每页显示2个,显示第6页的信息, 按照年龄从小到大排序
select * from students order by age asc limit 6,2;
– 如果重新排序了,那么会显示第一页

– 连接查询
– inner join … on
– select … from 表A inner join 表B;
– 查询 有能够对应班级的学生以及班级信息
select * from students inner join classes on students.cls_id = classes.id;

– 按照要求显示姓名、班级
select students.name,classes.name from students inner join classes on students.cls_id = classes.id;

– 给数据表起名字
select s.name,c.name from students as s inner join classes as c on s.cls_id = c.id;

– 查询 有能够对应班级的学生以及班级信息,显示学生的所有信息 students.,只显示班级名称 classes.name.
select students.
,classes.name from students inner join classes on students.cls_id = classes.id;

– 在以上的查询中,将班级名显示在第1列
select classes.name,students.* from students inner join classes on students.cls_id = classes.id;
– 查询 有能够对应班级的学生以及班级信息, 按照班级名进行排序
select classes.name,students.* from students inner join classes on students.cls_id = classes.id order by classes.name asc;

– 当时同一个班级的时候,按照学生的id进行从小到大排序
select classes.name,students.* from students inner join classes on students.cls_id = classes.id order by classes.name asc,students.id asc;
#如果是group by 条件使用having
#如果是inner join条件使用on
#其他都用where
– left join
– 查询每位学生对应的班级信息
select * from students left join classes on students.cls_id = classes.id;
左边的表不管在右边的表中是否找到数据,都显示

– 查询没有对应班级信息的学生
select * from students left join classes on students.cls_id = classes.id where classes.name is null;

– right join on
– 将数据表名字互换位置,用left join完成
select * from students right join classes on students.cls_id = classes.id;
select * from classes right join students on students.cls_id = classes.id;

– 子查询
– 标量子查询: 子查询返回的结果是一个数据(一行一列)
– 列子查询: 返回的结果是一列(一列多行)
– 行子查询: 返回的结果是一行(一行多列)

– 查询出高于平均身高的信息(height)
select avg(height) from students;
select * from students where height > 172;
select * from students where height > (select avg(height) from students);

– 查询学生的班级号能够对应的 学生名字
select * from students where cls_id in (1,2);
select id from classes;
select * from students where cls_id in (select id from classes);
省市区三级联动

–数据操作前的准备
–创建数据库表
create table areas(
aid int primary key,
atitle varchar(20),
pid int
);
–从sql文件中导入数据
– source 具体地址/areas.sql;
source areas.sql;

–查询一共有多少个省
select * from areas where pid is null;
–例1:查询省的名称为“山西省”的所有城市
select aid from areas where atitle = ‘山西省’;
select * from areas where pid = (select aid from areas where atitle = ‘山西省’);

select * from areas as a1 inner join areas as a2 on a1.pid = a2.aid where a2.atitle=‘山西省’;
–例2:查询市的名称为“广州市”的所有区县
select * from areas where pid = (select aid from areas where atitle = ‘广州市’);

select * from areas as a1 inner join areas as a2 on a1.pid = a2.aid where a2.atitle=‘广州市’;

猜你喜欢

转载自blog.csdn.net/qq_43175099/article/details/87340107