欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql数据库的使用与sql语句初识

程序员文章站 2022-03-09 11:11:06
...

一、数据库与Mysql

1、什么是数据库?
说白了就是数据仓库,用来组织存储用户数据的系统(文件).用户可以对文件中的数据运行增、删、改(更新)、查找等操作.
2、数据库管理系统(DBMS)
数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统;一般具有存储、查找,截取、安全保障、备份,共享等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系型,非关系型等.代表产品如:MySql,Oracle、SQLite、Access、MS SQL Server等

3、mysql数据库
MySql数据库是开放源代码的关系型数据库管理系统;由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,MySQL在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在Internet上的中小型网站中。随着MySQL的不断成熟,它也逐渐用于更多大规模网站和应用,比如*、Google和Facebook等网站。非常流行的开源软件组合LAMP,LNMP中的“M”指的就是MySQL.

二、安装MySQL数据库

1、windows平台
下载:http://dev.mysql.com/downloads/mysql/
选择版本与系统平台(x86_32) 目前最新是5.7.20社区版,下载免安装的zip或msi可执行格式.这里直接下载压缩格式
2、解压并初始化
MySQL解压到d:\mysql-5.7.20-win32\bin
bin 目录下有一大堆的可执行文件,执行如下命令初始化数据:

>cd d:\mysql-5.7.20-win32\bin
>mysqld --initialize-insecure

3、将mysql制作为windows系统服务

# 制作MySQL的Windows服务,在终端执行此命令:
>d:\mysql-5.7.20-win32\bin\mysqld  --install

# 移除MySQL的Windows服务,在终端执行此命令:
>d:\mysql-5.7.20-win32\bin\mysqld --remove
#注册成系统服务成功后即可通过以下命令管理mysqld服务
# 启动MySQL服务
>net start mysql

# 关闭MySQL服务
>net stop mysql

如图:
mysql数据库的使用与sql语句初识
mysql数据库的使用与sql语句初识
4、登录mysql

mysql -uroot -p
默认密码为空直接回车如图:
mysql数据库的使用与sql语句初识

5、linux下安装
Redhat/CentOS

#yum install mysql-server
Ubuntu
#apt-get install mysql-server

linux下安装一条命令就全部解决以上windows的安装配置,密码也是空
如图:
mysql数据库的使用与sql语句初识

注意事项:到mysql官方下载软件包需要用账号登录后才能下载,至些mysql的安装完成.

三、关于SQL语言

1、SQL
Structure Query Language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言,可细化为
DDL,DML,DCL三类组成

2、DDL语句
DDL(Data Definition Languages)语句:
主要针对数据库及表结构数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。 常用的语句关键字主要包括 create、drop、alter等,主要用于对数据库内部的对象进行创建, 删除,修改的操作,不像DML只是对表内部数据操作,DDL不涉及到表的定义结构的修改.DDL更多被DBA所使用.

3、DML语句
DML(Data Manipulation Language)语句:
数据操纵语句,主要针对表操作,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、udpate 和select,是开发人员使用最频繁的操作;

4、DCL语句
DCL(Data Control Language)语句:
数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke 等 ;主要是 DBA 用来管理系统中的对象权限时所使用,一般的开发人员很少使用;

四、数据库基本操作

1、登录数据库

#mysql -u root -p

说明: -u 登录用户名
-p 后面接密码,一般不加密码回车后输入
-P 指定连接端口 默认是3306 时可不加
-h 数据库所在的地址 默认本地时不需要添加
其他参数可自行查找帮助(mysql --help或查找官方手册)

2、显示数据库

show databases;

默认数据库:
mysql - 用户权限相关数据
test - 用于用户测试数据
information_schema - MySQL本身架构相关数据

3、创建数据库

mysql> create database test2 charset utf8;
Query OK, 1 row affected (0.00 sec)

mysql> create database test3 charset utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

说明:
第一条:创建数据库test2 设置数据库的字符集编码默认为utf8,不是utf-8
第二条:创建数据库test3 设置数据库的字符集编码默认为utf8,collate utf8_general_ci数据库的校验规则,ci是case insensitive的缩写,意思是大小写不敏感;相对的是cs,即case sensitive,大小写敏感;还有一种是utf8_bin,是将字符串中的每一个字符用二进制数据存储,区分大小写。

4、选择使用数据库

mysql> use test2;         #使用test2数据库;    使用方法 use  数据库名
Database changed
mysql> select database();    #查看当前选择的数据库
+------------+
| database() |
+------------+
| test2      |
+------------+
1 row in set (0.00 sec)

5、数据库用户管理
a、创建用户
create user '用户名'@'IP地址' identified by '密码';

创建aaa@qq.com用户密码设置为'redhat'
mysql> create user aaa@qq.com identified by 'redhat';
Query OK, 0 rows affected (0.00 sec)

b、删除用户
drop user '用户名'@'IP地址';

#删除test2用户
mysql> drop user aaa@qq.com;
Query OK, 0 rows affected (0.00 sec)

c、修改用户
rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';

#把aaa@qq.com'172.16.3.%'用户修改为aaa@qq.com
mysql> rename user aaa@qq.com'172.16.3.%' to aaa@qq.com;
Query OK, 0 rows affected (0.00 sec)

d、修改密码
set password for '用户名'@'IP地址' = Password('新密码')

#由于刚安装mysql默认root密码为空,因此设置修改root密码
mysql> mysql> set password for aaa@qq.com = password("redhat");
Query OK, 0 rows affected, 1 warning (0.00 sec)

注意:
crete user aaa@qq.com identified by "密码";
crete user aaa@qq.com'172.16.3.%' identified by "密码";
两个test账号并非同一账号,一个适用于本地登录,一个需要指定-h 172.16.3.x(数据库所在ip) 登录
且允许172.16.3.x网段的以test登录.

6、授权管理
a、查看某用户权限
show grants for '用户'@'IP地址' ;

#查看root权限
mysql> show grants for aaa@qq.com;
+---------------------------------------------------------------------+
| Grants for aaa@qq.com                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

b、对用户授权
grant 权限 on 数据库.表 to '用户'@'IP地址' ;

#创建用户test
mysql> create user aaa@qq.com identified by "redhat";
Query OK, 0 rows affected (0.00 sec)
#把test2数据库的所有权限授权给test
mysql> grant all privileges on test2.* to  aaa@qq.com;
Query OK, 0 rows affected (0.00 sec)

#查看test用户权限
mysql> grant all privileges on test2.* to  aaa@qq.com;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for aaa@qq.com;
+---------------------------------------------------------+
| Grants for aaa@qq.com                               |
+---------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'localhost'                |
| GRANT ALL PRIVILEGES ON `test2`.* TO 'test'@'localhost' |
+---------------------------------------------------------+
2 rows in set (0.00 sec)

注意:实验下来只有aaa@qq.com本地登录才能授权!
授权其他网段登录

>grant all privileges on *.* to aaa@qq.com'192.168.10.%' identified by "redhat";

c、取消授权
revoke 权限 on 数据库.表 from '用户'@'IP地址' ;

#取消test的授权
mysql> revoke all on test2.* from aaa@qq.com;
Query OK, 0 rows affected (0.00 sec)
#再次查看
mysql> show grants for aaa@qq.com;
+------------------------------------------+
| Grants for aaa@qq.com                |
+------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'localhost' |
+------------------------------------------+
1 row in set (0.00 sec)

以上为了方便演示对test2数据的所有表的所有权限授权给了test用户名,如需要细分权限的分配参考下表:

all privileges                除grant外的所有权限
select                          仅查权限
select,insert                查和插入权限
usage                         无访问权限
alter                            使用alter table
alter routine                使用alter procedure和drop procedure
create                         使用create table
create routine             使用create procedure
create temporary tables 使用create temporary tables
create user                     使用create user、drop user、rename user和revoke  all privileges
create view                     使用create view
delete                             使用delete
drop                                使用drop table
execute                          使用call和存储过程
file                                  使用select into outfile 和 load data infile
grant option                    使用grant 和 revoke
index                              使用index
insert                              使用insert
lock tables                      使用lock table
process                          使用show full processlist
select                             使用select
show databases             使用show databases
show view                      使用show view
update                           使用update
reload                            使用flush
shutdown                       使用mysqladmin shutdown(关闭MySQL)
super                             使用change master、kill、logs、purge、master和set global。还允许mysqladmin调试登陆
replication client            服务器位置的访问
replication slave            由复制从属使用

权限格式说明:

**数据库及表的授权:**
数据库名.*                   数据库中的所有表
数据库名.表                指定数据库中的某一张表
数据库名.存储过程      指定数据库中的存储过程
 *.*                              所有的数据库

** 用户的授权:**
 用户名@IP地址              用户只能在此IP下才能访问
 用户名@172.16.3.%      用户只能在此IP段下才能访问(通配符%表示任意)
 用户名@%                     用户可以再任意IP下访问(默认IP地址为%)

五、数据库表基础操作

1、创建表

create table 表名(
    列名  类型  是否可以为空 auto_increment primary key,
    列名  类型  是否可以为空 default 值 ,
        .....
)ENGINE=InnoDB DEFAULT CHARSET=utf8

说明:
是否可以空,主要是为了在用户往表中插入此列数据时的限制,null表示空,非字符串
not null - 不可空
null - 可为空

默认值(default 值)
创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值,

自增(auto_increment)
如果为某列设置自增列,插入数据时无需设置此列,默认将自增(表中只能有一个自增列)
对于自增列,必须是索引(含主键);对于自增可以设置步长和起始值.对于步长此处不深究,有兴趣请自行查找资料.

主键(primary key)
表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。

外键
一个特殊的索引;用于与另一张表的关联;是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键.

engine
数据库表引擎
对于 mysql有两个主要引擎 ISAM和innodb
其中Innodb引擎提供了事务控制能力功能,它确保一组命令全部执行成功,或者当任何一个命令出现错误时所有命令的结果都被回退,可以想像在电子银行中事务控制能力是非常重要的。支持COMMIT、ROLLBACK和其他事务特性.
示例:

mysql> create table tb1(nid int(10) not null auto_increment primary key,name varchar(20),age int(3) not null default 18,gender varchar(6),phone int(11) not null)engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.22 sec)

2、查看某数据库下表
show tables;

#使用mysql数据库查看其他所有的表
use mysql;     
show tables;  

3、向表中插入数据
insert into 表(列名,...) value(值)...; #单条插入

insert into 表(列名,....) values(值...),(值...);#多条插入

#向tb1中插入一条数据
mysql> insert into tb1(name,age,gender,phone) value("san",28,'男',13000000001);
ERROR 1264 (22003): Out of range value for column 'phone' at row 1
mysql> insert into tb1(name,age,gender,phone) value("san",28,'男',1300000001);
Query OK, 1 row affected (0.01 sec)

4、查询表结构与表中的数据
查询表结构
desc 表; 或desc 表\G;
查询表中的数据
select * [列] from 表;

mysql> desc tb1;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| nid    | int(10)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | YES  |     | NULL    |                |
| age    | int(3)      | NO   |     | 18      |                |
| gender | varchar(6)  | YES  |     | NULL    |                |
| phone  | int(11)     | NO   |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
#查询表中的所有数据
mysql> select * from tb1;
+-----+------+-----+--------+------------+
| nid | name | age | gender | phone      |
+-----+------+-----+--------+------------+
|   1 | san  |  28 | 男     | 1300000001 |
+-----+------+-----+--------+------------+
1 row in set (0.00 sec)

5、清空表
delete from 表名; #清空表中的内容,下次再插入数据时自增列不是从1开始,从删除时的数值开始
truncate table 表名 #下次插入时就和新的一样

6、修改表---列
添加列
alter table 表名 add 列名 类型 [after 列名]
不指定位置 默认是加在表中最后一列且可为空;
示例:

#在tb1表中添加一个新列mail 在gender列后
mysql> alter table tb1 add mail varchar(30) after gender;
Query OK, 0 rows affected (0.13 sec)
Records: 0  Duplicates: 0  Warnings: 0
#验证添加
mysql> desc tb1;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| nid    | int(10)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | YES  |     | NULL    |                |
| age    | int(3)      | NO   |     | 18      |                |
| gender | varchar(6)  | YES  |     | NULL    |                |
| mail   | varchar(30) | YES  |     | NULL    |                |                         <-------已经添加到指定位置
| phone  | int(11)     | NO   |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

修改表名:
alter table 表名 rename 新表;

#将tb2修改成user_info
mysql> alter table tb2 rename user_info;
Query OK, 0 rows affected (0.11 sec)

删除列
alter table 表名 drop column 列名

#删除表中mail列
mysql> alter table user_info drop column mail;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0
#查看删除后的表结构
mysql> desc user_info;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| nid    | int(10)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | YES  |     | NULL    |                |
| age    | int(3)      | NO   |     | 18      |                |
| gender | varchar(6)  | YES  |     | NULL    |                |
| phone  | int(11)     | NO   |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

修改列:
a、修改列的类型
alter table 表名 modify column 列名 类型;

#新增desct列为char类型
mysql> alter table user_info add desct char(50);
#修改desct类型为varchar(50)
mysql> alter table user_info modify desct varchar(50);
Query OK, 1 row affected (0.08 sec)
Records: 1  Duplicates: 0  Warnings: 0

b、修改列的名称
alter table 表名 change 原列名 新列名 类型;

#把desct列修改为about列
mysql> alter table user_info change desct about varchar(50);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc user_info;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| nid    | int(10)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | YES  |     | NULL    |                |
| age    | int(3)      | NO   |     | 18      |                |
| gender | varchar(6)  | YES  |     | NULL    |                |
| phone  | int(11)     | NO   |     | NULL    |                |
| about  | varchar(50) | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

添加主键:
如果一个表在创建时没有指定主键,在后期优化修改时可以修改某列为主键
alter table 表名 add primary key(列名);

mysql> desc user_info;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| nid   | int(10)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| age   | int(3)      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
#设置nid为主键
mysql> alter table user_info add primary key(nid);
Query OK, 0 rows affected (0.59 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc user_info;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| nid   | int(10)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| age   | int(3)      | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

删除主键:
alter table 表名 drop primary key;

alter table 表名 modify 列名 int, drop primary key;

#删除主键
mysql> alter table tb2 modify nid int,drop primary key;
Query OK, 3 rows affected (0.72 sec)
Records: 3  Duplicates: 0  Warnings: 0
#添加主键
mysql> alter table tb2 add primary key(nid);
Query OK, 0 rows affected (0.51 sec)
Records: 0  Duplicates: 0  Warnings: 0
#删除主键
mysql> alter table tb2 drop primary key;
Query OK, 3 rows affected (0.75 sec)
Records: 3  Duplicates: 0  Warnings: 0

添加外键:
alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
示例:
把user_info表的course_id添加外键(courses表的nid)

添加课程表courses
mysql> create table courses(nid int(10) not null primary key,course varchar(20));
Query OK, 0 rows affected (0.23 sec)
#查看
mysql> desc courses;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| nid    | int(10)     | NO   | PRI | NULL    |       |
| course | varchar(20) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

把courses表的nid设置为 user_info中的course_id的外键
#注意course_id的数据类型需要和主表的nid数据类型操持一致,否则会报以下错:
ERROR 1215 (HY000): Cannot add foreign key constraint

#修改user_info 表course_id类型为int(10)
mysql> alter table user_info modify course_id int(10);
Query OK, 3 rows affected (0.76 sec)
Records: 3  Duplicates: 0  Warnings: 0

#为user_info course_id添加外键
mysql> alter table user_info add constraint fk_u_c foreign key user_info(course_id) references courses(nid);
Query OK, 3 rows affected (0.72 sec)
Records: 3  Duplicates: 0  Warnings: 0

#查看user_info表结构
mysql> desc user_info;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| nid       | int(10)     | NO   | PRI | NULL    | auto_increment |
| name      | varchar(20) | YES  |     | NULL    |                |
| age       | int(3)      | YES  |     | NULL    |                |
| course_id | int(10)     | YES  | MUL | NULL    |                |    <-----MUL表示外键
+-----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

删除外键
alter table 表名 drop foreign key 外键名称

修改默认值
ALTER TABLE 表 ALTER 需要修改列 SET DEFAULT 1000;
示例:

#给courses表添加一个课程价格列prices 默认值0
mysql> alter table courses add prices int not null  default 0;
Query OK, 0 rows affected (0.40 sec)
Records: 0  Duplicates: 0  Warnings: 0
#把couses表中的prices默认值从0修改为100
mysql> alter table courses alter prices set default  100;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

删除默认值
ALTER TABLE 表 ALTER 需要修改列 DROP DEFAULT;

添加列自增
alter table 表 modify nid int(10) auto_increment;

7、修改表行数据
a、增加行内容
增加一行内容
insert into 表 (列名,列名...) value (值,值,..)
增加多行内容
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)
增加的内容来自别的表查询
insert into 表 (列名,列名...) select (列名,列名...) from 表

b、删除表或指定内容
删除表
delete from 表 #如果有外键引用 是无法直接删除的;

删除符合条件的内容
delete from 表 where id=1 and name='san';

c、更新表行内容
update 表 set 列=值 where 条;
示例:
把user_info表中的san course_id修改为1003

mysql> select * from user_info;
+-----+-------+------+-----------+
| nid | name  | age  | course_id |
+-----+-------+------+-----------+
|   1 | san   |   18 |      NULL |
|   2 | where |   22 |      NULL |
|   3 | ling  |   19 |      NULL |
+-----+-------+------+-----------+
3 rows in set (0.00 sec)

mysql> update user_info set course_id=1003 where name="san";
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

d、查询表内容
查询表中的所有内容,生产不推荐,占资源,数据量大运行慢
select from 表
按条件查询
select
from 表 where id > 1
select nid,name,gender as gg from 表 where id > 1

8、其他
a、条件
select from 表 where id > 1 and name != 'san' and num = 12;
select
from 表 where id between 5 and 10;
select from 表 where id in (1,2,3)
select
from 表 where id not in (10,12,13)
select * from 表 where id in (select nid from 表)

b、通配符
以san开头的(多个字符串)
select from 表 where name like 'san%' ;
san开头的(一个字符)
select
from 表 where name like 'ale_' ;

c、分页
前5行
select from 表 limit 5;
从第2行开始的后5行
select
from 表 limit 2,5;
从第2行开始的5行(另一种写法)
select * from 表 limit 5 offset 2;

d、排序
根据 “列” 从小到大排列即升序 (默认)
select from 表 order by 列 asc;
根据 “列” 从大到小排列即降序
select
from 表 order by 列 desc ;
根据 “列1” 从大到小排列,如果相同则按列2从小到大排序
select * from 表 order by 列1 desc,列2 asc;

e、聚合与分组
当需要进行一些汇总操作,比如统计整个公司的人数或统计每个部门人数时,这个时候就要用到SQL聚合与分组操作;数据库中的分组查询可以通过group by命令来实现。常用聚合函数有sum,count(*),max,min等
select [field1,field2...fieldn] 聚合函数 from 表 [where condition] [group by field1,field2,...fieldn] [ with rollup] [having condtion]
with rollup是可选表明是否对分类聚合后的结果进行再汇总
having 关键字表示对分类的结果再进行条件过滤,不可使用where.
注意:having 和 where 的区别在于 having 是对聚合后的结果进行条件的过滤,而 where 是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用 where 先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用 having 进行再过滤。

示例:
统计公司总人数:
select count(ename) from emp;

select count(1) from emp;

按部门分类统计各部门人数
select deptno,count(deptno) from emp group by deptno;
统计部门人数大于1的部门
select deptno,count(deptno) from emp group by deptno having count(deptno) >1;

f、连表
当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是內连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。我们最常用的是内连接。

外连接分为左连接和右连接,
左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录

操作前两张表的数据如下:

mysql> select * from user_info;
+-----+-------+------+-----------+
| nid | name  | age  | course_id |
+-----+-------+------+-----------+
|   1 | san   |   18 |      1003 |
|   2 | where |   22 |      1001 |
|   3 | ling  |   19 |      1002 |
|   5 | hi    |   28 |      1002 |
|   6 | while |   27 |      1006 |
|   7 | hehe  |   21 |      1007 |
|   8 | gaga  |   22 |      1006 |
|   9 | jin   |   25 |      1001 |
|  10 | ming  |   25 |      1005 |
+-----+-------+------+-----------+
mysql> select * from courses;
+------+--------+--------+
| nid  | course | prices |
+------+--------+--------+
| 1001 | 语文   |    100 |
| 1002 | 英语   |    120 |
| 1003 | IT     |      0 |
| 1004 | 数学   |    115 |
| 1005 | AI     |   1500 |
| 1006 | python |   1500 |
| 1007 | java   |   1200 |
+------+--------+--------+
mysql> select * from user_info,courses where user_info.course_id = courses.nid;
+-----+-------+------+-----------+------+--------+--------+
| nid | name  | age  | course_id | nid  | course | prices |
+-----+-------+------+-----------+------+--------+--------+
|   1 | san   |   18 |      1003 | 1003 | IT     |      0 |
|   2 | where |   22 |      1001 | 1001 | 语文   |    100 |
|   3 | ling  |   19 |      1002 | 1002 | 英语   |    120 |
|   5 | hi    |   28 |      1002 | 1002 | 英语   |    120 |
|   6 | while |   27 |      1006 | 1006 | python |   1500 |
|   7 | hehe  |   21 |      1007 | 1007 | java   |   1200 |
|   8 | gaga  |   22 |      1006 | 1006 | python |   1500 |
|   9 | jin   |   25 |      1001 | 1001 | 语文   |    100 |
|  10 | ming  |   25 |      1005 | 1005 | AI     |   1500 |
+-----+-------+------+-----------+------+--------+--------+

g、联合
我们经常会碰到这样的应用,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用 union 和 union all 关键字来实现这样的功能,具体语法:
select from t1 union| union all select from t2
....
union |union all
select * from tn;

h、子查询
某些情况下,当我们查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就要用到子查询。用于子查询的关键字主要包括 in、not in、=、!=、exists、not exists 等。
例如,从emp 表中查询出部门在 dept表中 的所有记录
select from emp where deptno in (select deptno from dept);
或转换成表连接查询
select emp.
from emp,dept where emp.deptno=dept.deptno;
表连接在很多情况下用于优化子查询

六、总结

SQL语言分三类,DDL主要是DBA使用,用来创建数据库与设计表结构(创建表)主要命令:
create drop alter 等
DML是表中数据的管理,DBA与开发人员均使用,侧重开发人员,主要命令:
insert delete update select

DCL主要是 DBA 用来管理系统中的对象权限时所使用,一般的开发人员很少使用.如对数据库表安全及授权设定.

从数据库管理系统,windows,linux系统的安装,到数据库创建,用户名管与授权;
创建数据库与表的一般格式,主键 ,外键约束,自增列等;

以上本人总结整理,如有不当之处欢迎指正~!

转载于:https://blog.51cto.com/dyc2005/2055919