sql语句
2019-06-02 本文已影响0人
梁庄十年
sql语言的分类
- DDL: 数据定义语言;如:create,drop,alter等;
- DCL:数据控制语言;如: grant,if等;
- DML:数据操纵语言; 如:insert,update,delete等;
- DQL:数据查询语言;如select等;
创建表的语法
create table 表名称(字段名称 字段类型(长度)约束,字段名称 字段类型(长度) 约束,...);
// 注意:
// 字段类型: 一个实体对应一个表,一个实体属性对应表的一个字段;
mysql中的数据类型:
- tinyint
- smallint
- int
- bigint
- float
- double
- bit
- char
- varchar
注意:
bit是布尔类型,其值只有0和1;
char和varchar的区别:
char 代表的是固定长度的字符或字符串;
varchar代表的是可变长度的字符串;
约束的作用:
保证数据的完整性;
单表的约束可以分为以下几类:
- 主键约束 :primary 默认唯一非空;
- 唯一约束:unique;
- 飞空约束: not null;
建表示例:
create table user(
id int primary key auto_increment,
username varchar(20) unique,
password varchar(20) not null,
age int,
birthday date,
)
常用的sql 语法
创建数据库:
create database web_test1;
显示所有数据库:
show databases;
使用数据库:
use web_test1;
查看某个数据库下所有的表:
use web_test1; // 切换到想看的数据库;
show tables; // 显示该数据库下所有的表;
查看某个表的结构信息:
desc 表名;
删除表:
drop table 表名;
修改表—给表添加某列:
alter table 表名 add 列名 类型 (长度)约束;
修改列的类型(长度和约束):
alter table 表名 modify 列名 类型(长度) 约束;
删除列:
alter table 表名 drop 列名;
修改列的名称:
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
修改表名:
rename table 表名 to 新的表名;
修改表的字符集:
alter table 表名 character set 字符集;
向表中插入某些列:
// 方法一:
insert into 表名 (列名1,列名2,列名3,...) vlaues (值1,值2,值3,...);
// 方法二:
insert into values(值1,值2,值3,...);
注意事项:
- 值的类型和数据库中表列的类型一致;
- 值的顺序和数据库中表的顺序一致;
- 值的最大长度不能超过列设置最大长度;
- 值的类型是字符串或者日期类型时,需要使用单引号 将值括起来;
示例:
// 添加某几列;
insert into users (id,username,password) values(null,'aaa','123');
// 添加所有的列;
insert into users values(null,'bbb','123','12','1994-01-01');
注意:如果直接往数据库中插入中文记录会报错;
解决方式:
- show variables like '%character%' // 查看数据库中与字符集相关的参数;
- 需要将mysql 数据库服务器的客户端部分的字符集改为gbk;
- 找到mysql 的安装路径 修改my.ini文件中的[client]下的字符集 default-character-set=gbk;
- 重启mysql服务器;
修改表的记录:
update 表名 set 列名=值,列名=值[where条件]
注意事项:
- 值的类型与列的类型一致;
- 值的最大长度不能超过列设置的最大长度;
- 字符串类型和日期类型添加单引号;
示例:
// 修改某一列的所有值;
update user set password ='abc';
// 按条件修改数据;
update user set password='123' where username ='张三';
// 修改多个列;
update user set password='123',age=34 where username='李四';
删除表的记录:
delete from 表名 [where 条件语句];
// 删除表中的所有记录的方法有两种;分别为:
delete from user; // 删除所有记录,属于DML语句,是一条一条记录的删除,事务可以作用在DML语句上的;删除后,可以通过回滚恢复数据;
truncate table user;// 删除所有记录,属于DDL语句,将表删除,然后重新创建一个和删除的表结构一样的表,事务不能控制DDL的;删除后,不能通过回滚恢复数据;
注意事项:
- 删除表的记录,指的是删除表中的一行记录;
- 如果没有删除条件,默认删除表中的所有记录;
示例:
// 删除表中的某一条数据;
delete from user where id=1;
// 删除表中的所有记录;
delete from user;
查询表的记录:
- 基本查询:
select[distinct] * | 列名 from 表 [条件];
// 查询所有学生的考试成绩信息;
select * from exam;
// 查询所有学生的姓名 和 英语成绩;
select name,english from exam;
// 查询英语成绩,并去除重复值;
select distinct english from exam;
// 查询学生的姓名和 成绩的总和;
select name,math+english+chinese from exam;
// 别名查询;
select name,english+chinese+math as sum from exam; // 此处as 可以省略;
select name,english+chinese+math sum from exam;
- 条件查询
- 可以使用where语句;
- 可以使用 >,<,=,>=,<=,<>;
- 可以使用like,只要使用与模糊查询;在like字句中可以使用或者%号作为占位符;只能表示一个字符,%可以表示任意个字符;示例如下:
like '李_':名字中必须是两个字,而且是姓李的;
like '李%':名字中必须是姓李的,李字后面可以是一个或者任意个字符;
like '%四':名字必须是四结尾的;
like '%王%':只要是名称中包含王这个字就可以;
- in:范围查询;
- 条件关联 and,or,not;
实例:
// 查询学生名叫李四的成绩;
select * from exam where name='李四';
// 查询名称叫李四 并且英语大于90分的学生;
select * from exam where name='李四' and english > 90;
// 查询所有姓李的学生
select * from exam name like '李%';
// 查询英语成绩是69,75,89的这几个学生的信息;
select * from exam where english in(65,79,89);
- 排序查询
order by 字段名称 asc/desc(默认是acs);
// 查询学生信息,并且按照语文成绩进行排序;
select * from exam order by chinese;
// 查询学生信息,并且按照语文成绩倒序排序;
select * from exam order by chinese desc;
// 查询学生信息,先按照语文的成绩进行倒序排序,如果成绩相同 ,再按照英语的成绩升序排序;
select * from exam order by chinese desc ,english asc;
// 查询姓李的学生信息,并按照英语的成绩倒序排序;
select * from exam where name like '李%' order by english desc;
- 分组统计查询
聚合函数:
- sum() // 求和;
- count() // 统计个数;
- max() // 获取某列的最大值;
- min() // 获取最小值;
- avg() // 获取平均值;
- ifnull() 函数;
// 获取所有学生的英语成绩的总和;
select sum(english) from exam;
// 获取所有学生的英语和数学成绩的总和;
select sum(english) + sum(math) from exam;
// 查询姓李的学生的英语成绩的总和;
select sum(english) from exam where name like '李%';
// 查询所有学生各科的总成绩
select sum(english) + sum(math) + math(chinese) from exam;
select sum(english+math+chinese) from exam;
// 注意:去除数组库中的数据有null的问题;null和任何数相加等于null;
select sum(ifnull(english,0)+ifnull(chinese,0) + ifnull(math,0)) from exam;
// 获得学生的个数;
select count(*) from exam;
// 获得姓李的学生的个数
select count(*) from exam where name like '李%';
// 获取数学成绩的最高分
select max(math) from exam;
// 获取语文成绩的最小值
select min(chinese) from exam;
// 获取语文成绩的平均值
select avg(chinese) from exam;
// 创建表
create table orderitem (
id int primary key auto_increment,
product varchar(20),
price double
);
// 插入数据;
insert into orderitem (null,'电视机',2999);
group by 字段名称;
// 按商品名称统计,每类商品所购买的个数;
select product, count(*) from orderitem group by product;
// 按商品名称统计,每一类产品的所花费的总金额;
select product,sum(price) from orderitem group by product;
// 按商品名称统计,统计每类商品花费的总金额在5000元以上的商品
select product,sum(price) from orderitem group by product having sum(price) > 5000;
// 按商品的名称统计, 统计每类商品花费的总金额在5000元以上的商品,并且按照总金额升序排序;
select product,sum(price) from orderitem group by product having sum(price) > 5000 order by sum(price) asc;
注意:
- where 的子句后面不能跟聚合函数;
总结:
- sql语法一般遵循以下原则,可以省略部分条件,但不可颠倒循序;
s(select) ... f(from)...w(where)...g(group by)..h(having)..o(order by)