sql语句

2019-06-02  本文已影响0人  梁庄十年

sql语言的分类

创建表的语法

create table 表名称(字段名称 字段类型(长度)约束,字段名称 字段类型(长度) 约束,...);
// 注意:
// 字段类型: 一个实体对应一个表,一个实体属性对应表的一个字段;

mysql中的数据类型:

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;

查询表的记录:

  1. 基本查询:
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;

  1. 条件查询
  • 可以使用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);

  1. 排序查询
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;
  1. 分组统计查询

聚合函数:

  • 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)
上一篇下一篇

猜你喜欢

热点阅读