注意:这里以mariadb为例
启动mysql服务
systemctl start mariadb
登录mysql
mysql -u root -p
SQL语言分类
- 数据定义语言:简称【DDL】(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等- 数据操作语言:简称【DML】(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等- 数据控制语言:简称【DCL】(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户;关键字:grant等- 数据查询语言:简称【DQL】(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等
如果要了解标准的内容,比较推荐的方法是【泛读SQL92】(因为它涉及了SQL最基础和最核心的一些内容),然
后增量式的阅读其他标准。
DDL语句
数据库操作:database
创建数据库
create database 数据库名;create database 数据库名 character set 字符集;
查看数据库
查看数据库服务器中的所有的数据库:show databases;
查看某个数据库的定义的信息:
show create database 数据库名;
删除数据库(慎用)
drop database 数据库名称;
其他数据库操作命令
切换数据库:
use 数据库名;
查看正在使用的数据库:
select database();
表操作:table
创建表
create table 表名( 字段名 类型(长度) 约束, 字段名 类型(长度) 约束);
比如创建一个用户表
单表约束:
主键约束:primary key- 唯一约束:unique- 非空约束:not null
主键约束 = 唯一约束 + 非空约束
查看表
查看数据库中的所有表:show tables;
查看表结构:
desc 表名;
删除表
drop table 表名;
修改表
alter table 表名 add 列名 类型(长度) 约束; --修改表添加列.alter table 表名 modify 列名 类型(长度) 约束; --修改表修改列的类型长度及约束.alter table 表名 change 旧列名 新列名 类型(长度) 约束; --修改表修改列名.alter table 表名 drop 列名; --修改表删除列.rename table 表名 to 新表名; --修改表名alter table 表名 character set 字符集; --修改表的字符集
字段类型常用的类型有:
DML语句
插入记录:insert
insert into 表 (列名1,列名2,列名3..) values (值1,值2,值3..); -- 向表中插入某些列insert into 表 values (值1,值2,值3..); --向表中插入所有列insert into 表 (列名1,列名2,列名3..) values select (列名1,列名2,列名3..) from 表insert into 表 values select * from 表
注意:1. 列名数与values后面的值的个数相等2. 列的顺序与插入的值得顺序一致3. 列名的类型与插入的值要一致.4. 插入值得时候不能超过最大长度.5. 值如果是字符串或者日期需要加引号’’ ,一般是单引号
注意插入的时候如果没有申明列,那么需要插入每一列,不然会报错:column count doesn`t match value count at row xx.
更新记录:update
update 表名 set 字段名=值,字段名=值;update 表名 set 字段名=值,字段名=值 where 条件;
注意:
1. 列名的类型与修改的值要一致.2. 修改值得时候不能超过最大长度.3. 值如果是字符串或者日期需要加’’
删除记录:delete
delete from 表名 [where 条件];
删除表中所有记录使用【delete from 表名】,还是用【truncate table 表名】?
删除方式:- delete :一条一条删除,不清空auto_increment记录数。- truncate :直接将表删除,重新建表,auto_increment将置为零,从新开始。
DQL语句
DQL语法顺序
完整DQL语法顺序SELECT DISTINCT < select_list >FROM < left_table > < join_type >JOIN < right_table > ON < join_condition >WHERE < where_condition >GROUP BY < group_by_list >HAVING < having_condition >ORDER BY < order_by_condition >LIMIT < limit_number >
简单查询
查询所有的商品
select * from product;
* 表示表的所有字段,也可以指定具体字段,甚至可以给字段取别名
select pname ,price from product;
别名查询,使用的as关键字,as可以省略的
select * from product as p;
去掉重复值
select distinct price from product;
运算查询
select pname,price+10 from product;
数据库的运算查询是很消耗时间的,不建议在数据库这样操作,应该将数据在后台程序进行操作,数据库只处理数据,不应该处理逻辑。
条件查询
查询商品价格>60元的所有的商品信息
select * from product where price > 60;
符号说明
> ,<,=,>=,<=,<>like 使用占位符 _ 和 % _代表一个字符 %代表任意个字符. select * from product where pname like '%新%';in在某个范围中获得值(exists). select * from product where pid in (2,5,8);
排序
查询所有的商品,按价格进行排序.(asc-升序,desc-降序)
默认就是asc
select * from product order by price;
聚合函数(组函数)
特点:只对单列进行操作
常用的聚合函数
sum():求某一列的和avg():求某一列的平均值max():求某一列的最大值min():求某一列的最小值count():求某一列的元素个数
获得所有商品的价格的总和:
select sum(price) from product;
获得所有商品的个数
select count(*) from product;
分组
根据cid字段分组,分组后统计商品的个数
select cid,count(*) from product group by cid;
根据cid分组,分组统计每组商品的平均价格,并且平均价格> 60;
select cid,avg(price) from product group by cid having avg(price)>60;
注意事项
select语句中的列(非聚合函数列),必须出现在group by子句中group by子句中的列,不一定要出现在select语句中聚合函数只能出现select语句中或者having语句中,一定不能出现在where语句中。
分页查询
分页分为逻辑分页和物理分页
逻辑分页:将数据库中的数据查询到内存之后再进行分页。物理分页:通过LIMIT关键字,直接在数据库中进行分页,最终返回的数据,只是分页后的数据。
lIMIT 关键字不是 SQL92 标准提出的关键字,它是 MySQL 独有的语法。
通过 limit 关键字, MySQL 实现了物理分页SELECT * FROM table LIMIT [offset,] rows
子查询
子查询允许把一个查询嵌套在另一个查询当中。子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询。子查询可以包含普通select可以包括的任何子句,比如:distinct、 group by、order by、limit、join和union等;但是对应的外部查询必须是以下语句之一:select、insert、update、delete
其他查询语句
union 集合的并集(不包含重复记录)unionall 集合的并集(包含重复记录
SQL解析顺序
SELECT DISTINCT < select_list >FROM < left_table > < join_type >JOIN < right_table > ON < join_condition >WHERE < where_condition >GROUP BY < group_by_list >HAVING < having_condition >ORDER BY < order_by_condition >LIMIT < limit_number >
然而它的执行顺序是这样的
1 FROM2 ON 3 JOIN 第二步和第三步会循环执行4 WHERE 第四步会循环执行,多个条件的执行顺序是从左往右的。5 GROUP BY 6 HAVING 7 SELECT 分组之后才会执行SELECT8 DISTINCT 9 ORDER BY 10 LIMIT 前9步都是SQL92标准语法。limit是MySQL的独有语法。
关于sql解析还有很多,另开一个篇章专门介绍吧