一,SQL语句基础
- 语法要求
- 所有内容都需要使用英文符号
- 每一个语句必须使用;结尾
- SQL (structured query language)
- SQL 是操作和检索关系型数据库的标准语言(CURD)
SQL分类
DDL ,Data Definition Language,数据定义语言 定义结构
关键字: create drop alter
DML ,Data Manipulation Language,数据操作语言
关键字:insert update delete
DQL ,Data queries Language,数据查询语言,查询(检索)
关键字:select
DTL ,Data Trasaction Language ,事务处理语言
关键字: transaction commit rollback
DCL ,Data Control Language,数据控制语言,权限
关键字: 授权grant ,回收revoke
二, DDL 数据定义语言
数据库
创建: create database [IF NOT EXISTS] 数据库名称 [Character set 字符集名称]; 删除: drop database 数据库名称; 修改: alert database 数据库名称 character set 字符集名称;
表
创建: create table 表名称(字段描述1,字段描述2,…);
字段描述: 字段名称 字段类型 字段名称: 自定义 字段类型: (1)字符串string: char(n) :固定字符串 varchar(n): 可变字符串【】 (2)数字Number mysql类型 Java中类型 bit boolean tinyint byte smallint short int int【】 bigint long double(m,d) double decimal number (3)日期时间 date time datetime timestamp (4)大数据 字节: blob 64k longblog 4g 字符: text 64k longtext 4g 例如: create table user( int varchar(32), name varchar(50), age int );
删除:
drop table [IF EXISTS] 表名;
修改:
alter table 表名 rename to 新表名;
字段
添加字段
alter table 表名 add column 字段描述; 例如: alter table users add column name int;
删除字段:
alter table 表名 drop [column] 字段名称;
修改字段:
alter table 表名 change [column] old字段名称 new字段描述;
三,DML-数据操纵语言(数据)
3.1 插入数据 insert
格式
格式1: insert into 表名 values(值1,值2,...); 格式2: insert into 表明(字段名称1,字段名称2,...) values(值1,值2,...);
3.2更新数据
update 表名 set 字段1=值,字段2=值…;
例如: update users set age=35;
update 表名 set 字段1=值,字段2=值… where条件
条件的格式: 字段 运算符 值 例如:id='u01' 例如:update users set age=35 where id=2;
3.3 删除数据
delete from 表名 where 条件;
例如: delete from users where id>1;
四,DQL – Data queries Language,数据查询语言,查询(检索)
4.1 没有条件查询
查询所有
select * from users;
查询部分信息
select id,firstname,secondname from users;
查询用户编号、姓名,及格(与60分差)
select id,firstname,secondname, count-60 from users; select id,concat(firstname,secondname), count-60 from users;
修改上面查询显示字段名称,用”姓名”表示姓名,用”及格”表示及格
select id,concat(firstname,secondname) as 姓名, count-60 及格 from users; select id,concat(firstname,secondname) as `姓 名`, count-60 及格 from users; 字段别名: 字段名称 [AS] 别名
4.2 有条件查询
查询分数等于60的学生
select * from users where count=60;
查询姓”张”学生
select * from users where firstname='张';
查询年龄大于18的学生
select * from users where age > 18;
显示分数在60-80的学生
select * from users where count >=60 and count <= 80; select * from users where count between 60 and 80;
查询编号为u001和u002的学生
select * from users where id='u001' or id='u002'; select * from users where id in ('u001','u002');
查询年龄是18或20的学生
select * from users where age = 18 or age = 20;
查询名中含有”云”的学生
select * from users where secondname like '云'; #相当于= select * from users where secondname like '%云%'; 模糊查询(不完全匹配查询)格式:字段 like 值 %,匹配多个值 '%云' ,以”云“结尾 '云%' ,以”云“开头 '%云%',包含”云“ _ 匹配一个字符
查询名中第二字还有”云”的学生
select * from users where secondname like '_云%';
查询分数小于60 或 大于90分的学生
select * from users where count < 60 or count > 90;
查询分数等于60 或者 分数大于90并且年龄大于23
select * from users where count=60 or count > 90 and age > 23 ; select * from users where count=60 or (count > 90 and age > 23) ; * 注意:and 优先级高于 or
查询没有考试的学生
select * from users where count is null ;
查询所有考试的学生
select * from users where count is not null ;
如果数据包含%,查询所有数据中含有%
insert into users(`id`,`firstname`,`age`,`secondname`,`count`) values ('u009','小%乔',12,'推',100); select * from users where firstname like '%\%%'; #转义 *思考:如果数据一个引号 select * from users where firstname = '''; #效果:不能执行完成,需要继续输入内容。 * 所有数据如果含有',请使用转义\'
4.3 聚合函数的使用 ,聚合函数:将一组数据整合成一个数据函数
有多少条记录,计数count(*|字段名称|数字)
select count(*) from users; select count(id) from users; select count(co) from users; 结论: 如果是字段,不对null数据进行计算 mysql> select count(1) from users;
平均成绩,平均avg(字段名称)
select avg(成绩列名) from users;
不含null 最高成绩,max(字段)
select max(成绩字段) from users;
最小年龄,min(字段)
select min(age) from users;
班级总成绩,求和sum(字段)
select sum(count) from users;
平均成绩
select sum(count)/count(*) from users;
查询所有的年龄数
mysql> select age from users; 排序格式:select .... where ... order by 排序字段 asc|desc * asc 升序,默认可以不写 * desc 降序 mysql> select age from users order by age desc;
去重复
mysql> select distinct age from users order by age desc; mysql> select distinct age,count from users order by age desc; * age 和count 必须一样才重复 mysql> update users set count = 60 where id = 'u006'; # 两个18和60,将去重
总结: max /min/avg/sum/计算的字段类型必须是整形
* 设置没有考试 * update users set count = null where id = 'u006';
4.4 分组
添加班级字段(classes)
mysql> alter table users add column classes varchar(3); mysql> update users set classes='1' where id in ('u001','u002','u003','u004'); mysql> update users set classes='2' where id in ('u005','u006','u007');
查询1班和2班的平均成绩
* 平均成绩:mysql> select sum(count)/count(*) from users; * 分组:select ... where .. group by 分组字段 having 分组条件 mysql> select sum(count)/count(*) from users group by classes; * 注意:查询数据项select... 只能是聚合函数或分组字段 select classes , sum(count)/count(*) from users group by classes; select id, classes , sum(count)/count(*) from users group by classes; #分组之后id没有意义
查询班级平均成绩不及格的班级详细人员信息
* mysql> select * from users where classes = '2';
- 分组的条件,过滤不及格班级
mysql> select classes as 班级,sum(count)/count(*) as countAvg from users group by classes having countAvg < 60;
- 多表操作
select A.* from A,B where A.id = B.id
select a.* from ,A a,B as b where a.id = b.id
表的别名:表名 AS 别名
- 结果
select users.* from users,B as temp where users.classes = temp.classes;
select users.* from users,(select classes,sum(count)/count(*) as countAvg from users group by classes having countAvg < 60) as temp where users.classes = temp.classes;
select users.* from users,(select classes,sum(count)/count(*) as countAvg from users group by classes having countAvg < 60) as temp where users.classes = temp.classes;
总结:
select distinct *|字段|聚合函数 from 表名 where 查询条件 group by 分组字段 having 分组条件 order by 排序字段 asc|desc
五.总结
5.1 DQL
select *|id from 表名
where id='u001'
group by classes having avg < 60
order by age desc
5.2 DML
insert into 表名(字段) values(值)
update 表名 set 字段=值,字段=值,... where 条件
delete from 表名 where 条件
5.3 DDL
create database 数据库;
drop database 数据库;
create table 表名(字段描述);
* 字段描述:字段名称 类型 约束
drop table 表名;