1.12种基本查询操作笔记(单表)

DB : database; 存放数据的地方,数据可以是图片、声音、视频、文字、数字、时间
DBMS: MySql Oracle DB2 SQLServer Access (关系数据库)
一个关系就是一张二维表。
关系有约束: 1、列不可以再分
2、不允许出现重复的列
3、不允许有相同的行
4、可以随便改变行和列的顺序

主键Primary Key--PK: 用来唯一区分表中每一行数据。可以是一个属性
也可以是一个属性组合。
一般每一个表都需要一个主键。
一个表中的主键是不能出现重复的。

外键:Foreign Key -- FK :
B表中有一个字段x不是这个表的主键,但它是A表的
主键,则字段x称为B的外键。

外键的作用: 连接表、约束表


mysql有一个默认的用户 root ,
mysql是一个用户管理很多数据库。
SQL : select insert update delete
ddl
dcl
dql
dml


使用密码进入到mysql的控制界面,默认的用户是root,root管理了很多数据库。
所以第一步是查询有哪些数据库
命令: show databases;
再选中一个数据库来使用:use 数据库名。
如果不想使用提供的数据库 再创建一个新的数据库:
create database 数据库名 default character uft-8;
选中一个数据库后,查询数据库中有哪些表:
show tables;
如果查询某个表的结构: desc 表名。
show columns from 表名.
查询表中的所有内容:
select * from 表名;

删除数据库:
drop database 数据库名.

sql两个作用:连接交互、嵌入到其他高级语言中使用

SQL语句Structured Query Language: 标准的结构化查询语言
所有数据库的一个官方语言。
SQL根据功能分为: DQL(select)、DML(insert update delete)
、DDL(create drop)、DCL(grant revoke)

查询:select 选择、投影、连接

查询的最基本的语法:
查询语句必须要确定 查询什么数据 从哪查询。
select *** from 表名;
select sname from t_student;

1、查询列:
select 字段1,字段2,.... from 表名
select sname,sename from t_student;
select sname,sname,sname,sname from t_student;
select sname,mname from t_student,t_man; 笛卡尔积
2、查询所有列
select * from 表名.

3、去掉重复的结果
select distinct sclass,sname from t_student;
4、使用数学表达式
例: 查询分数表中学生的编号,即语文数学的分数和
select sid,语文+数学 from t_score;
查询学生的姓名和他10年以后的年龄
select sname,sage+10 from t_student
emp(name salary comm jixiao)
select name,salary+comm+jixiao from emp;



5、处理空值,如果一个字段是空,则使用数学运算时,整个结果都是空
ifnull(字段名,值)
select sid,ifnull(语文,0)+ifnull(数学,0) from t_score;
sqlserver中使用的是isnull( ) Oracle中使用的是nvl( )
select sname,ifnull(sage,20)+10 from t_student

6、给查询的结果取别名 as
查询的结果还是一张虚拟的表格,表格的字段名来自于select 后面的查询内容

select sid , ifnull(语文,0)+ifnull(数学,0) as a from t_score;
例: 查询分数表中学生的学号,及 4门课程分数和,取别名为总分。
select sid,ifnull(语文,0)+ifnull(数学,0)+ifnull(英语,0)+ifnull(体育,0) as '总 分' from t_score;
如果别名有空格,使用引号引起来。引号可以是单引号,也可以是双引号。
优先选择单引号

String slq = "select sname as '姓 名' from t_student";

 

select "abc" from t_student;
select now() from t_student;

System.out.print(abc);

 

7、字符串的拼接 concat函数 可以拼接字段,也可以拼接自己的字符串
select sid,concat(sname,ssex,sename) from t_student;

select sid,concat(sname,'的性别是',ifnull(ssex,'不详'),ifnull(sage,0)) as aaa from t_student;


String str = sc.next();

String sql = " select sid,concat(str,'ssex','sage') from t_student ";

String name = "张三";
System.out.print("hello " + name + " ,你吃饭了吗");

8、限定结果limit (只有mysql中有)
select **** from **** limit n 取查询结果的前n行
select **** from **** limit m,n 取查询结果中从第m(0开始)行开始,一共取n行

select sname from t_student limit 3;
select * from t_student limit 5;
select * from t_student limit 1,6; (从第2行开始取,取6行)

学生表分页: 每一页显示5个学生,
第1页:select * from t_student limit 0,5;
第2页:select * from t_student limit 5,5;
第3页:select * from t_student limit 10,5;

int pageNow = 1;
int pageSize = 5;
int lineCount;
int pageCount = Math.ceil(lineCount*1.0 / pageSize);

String sql = "select * from t_student limit (pageNow-1)*pageSize,pageSize";



9、order by (默认使用的是升序)
按照字段x排序: order by x asc(desc降序)
select查询的结果默认跟数据中存放的数据顺序一样。
很多时候查询的结果想安装某个字段来排序,排序使用的关键字是order by

select * from t_student order by sscore,sage desc;


可以按照多个字段排序
order by x , y; : 按照x的升序和y的升序排列。规律:按照x排序,如果x是一样就按照y排序
order by x , y desc; 按照x的升序和y的降序排列
order by x desc,y asc;
select sid,sname,sclass,sage from t_student order by sclass,sage;


select * from t_student order by 'sid' desc;
select * from emp order by salary+ifnull(comm,0)+jixiao;


select * from t_student order by sage desc limit 1;

limit 在 order by的后面使用

10、对查询的结果筛选 where
= != > < >= <= between and is null
select **** from **** where ** order by **** limit ****;
条件限制中非数字的值要使用引号

例;查询表中所有女生的信息
select * from t_student where ssex='女';
select * from goods where price >= 3000;

select * from t_student where sclass != 1;

例: 查询表中2班学生的信息,按照年龄排序,取前3个学生
select * from t_student where sclass=2 order by sage limit 3;

select sname from t_student order by sage;
查询表中分数在500大600之间
select * from t_student where sscore between 500 and 600;
查询表中年龄为空的学生
select * from t_student where sage is null;

select * from t_student where sscore >800;




用户登录: username password user(uid username password money)
String x = ( select password from user where username=****);
if(x== null){

}else if(x != password){

}else{

}

select * from t_student where sbir > '1999a09a09';

例: 查询出比Tea年龄大的学生
select sage from t_student where sename = 'Tea'; 18
select * from t_student where sage > (select sage from t_student where sename = 'Tea');


条件筛选and or not in

例: 查询1班500分以上的男生信息
select * from t_student where sclass=1 and sscore > 500 and ssex='男'
order by sage limit 1;

select * from t_student where not sclass = 1 or sclass=3;

select * from t_student where not sscore between 500 and 600;

找出90年以后出生或者1班的学生或者学号1207以后的学生,结果按照成绩降序排列。
select * from t_student where sbir >'1990-01-01' and sclass=1 and sid > 1207
order by sscore desc;


例: 查询1206、 1208 、1210、1217
select * from t_student where sid in (1206,1208,1210,1217);
select * from t_student where not sename in ('Apple','Orange','Tea','Ice');

在分数信息表中找出至少有一门成绩不及格的学生的学号。
select sid from t_score where 语文<60 or 数学<60 or 英语<60 or 体育<60;

在学生信息表中找出年龄大于等于18且是3班且学号小于等于1211的学生所有信息,
并按照成绩降序排列并取前两个人。
select * from t_student where sage >= 18 and sclass=3 and sid <= 1211
order by sscore desc limit 2;

 

 


11、模糊查询
一般查询条件的时候,如果使用的是“=” 则是值的完全判断。很多时候只知道值的一部分,则
模糊查询。关键字like
select * from goods where name like '%java%';
select * from t_student where sename ='ook';

模糊查询只有两个符号 _ %
_代表一个字符。
例: 查询姓张,且姓名只有两个字的学生信息
select * from t_student where sname like '张_';
查询表中名字是3个字的学生:
select * from t_student where sname like '___';

%代表0个或多个字符
例: 查询英文名字中含有a字母的学生,a不在开始,也不在结尾
select * from t_student where sename like '%_a_%';

例:在学生信息表中使用like找出中文名字三个字且英文名字6个字符的学生的所有信息。
select * from t_student where sname like '___' and sename like '______';
例:英文名中含有a 和e
sename like '%a%e%' or sename like '%e%a%'

select * from t_student where sscore like '5__';
select * from t_student where sphone like '%888%';
select * from t_student where sname like '张%';

12、正则表达式查询:regexp
sql中的正则表达式判断的是字串
select * from t_student where sphone regexp '^.*8{4}.*$';
select * from t_student where sename regexp '[^a-zA-Z]';

select * from t_student where sename regexp '[[:alnum:]]';
select * from t_student where sename regexp '[0-9a-zA-Z]';
select * from t_student where sename regexp '[[:punct:]]';

select * from t_student where sphone regexp '[^6]6{3}[^6]';

select * from t_student where sphone regexp '6{3}.*8{3}' or sphone regexp '8{3}.*6{3}'

select * from t_student where sename regexp '[\u4e00-\u9fa5]{3}';匹配所有中文


上一篇:数据库概论_3标准化的SQL语言_ 数据定义


下一篇:聚合函数相关计算