SQL概述及单表查询

时间:2021-12-17 20:40:32

SQL

Structured Query Language 结构化查询语言

作用:与数据库进行交互 

是一种定义、操作、管理关系数据库的句法。大多数关系型数据库都支持。

知识扩展:

SQL标准,由ANSI(美国标准学会,属于ISO的核心成员)进行管理和维护的。

数据库厂商都支持该标准,并进行了扩展。扩展的部分,一般称之为方言。

SQL标准和方言:普通话和方言。

组成: DQL:数据查询语言 DML:数据操作语言 DDL:数据定义语言 •DCL:数据控制语言 TPL:事务处理语言 •CCL:指针控制语言

常用数据库

1、Oracle

2、DB2

3、MySQL

4、SQL Server


安装MySQL

验证是否安装成功:

登录数据库:

shell>mysql -u root -p

服务器、数据库、表的关系

l所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。l为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。l数据库服务器、数据库和表的关系如图所示:SQL概述及单表查询

数据库的基本概念

知识点:使用关键字作为表名或数据库名或字段名,使用``(反引号)引起来

约定:shell>命令 windows命令

  mysql>命令 mysql命令或语句

SQL概述及单表查询

User类对应User表结构

User对象对应User表中的一条记录


SQL语句的分类

*DDL:Data Definition Language数据定义语言

*DML:Data Manipulation Language 数据操作语言

DCL:Data Control Language 数据控制语言

*DQL:Data Query Language 数据查询语言

*TPL:事务处理语言


数据库操作

创建一个名称为mydb1的数据库。

mysql>CREATE DATABASE mydb1;       (字符集采用数据库默认的--安装时的那个)

查看数据库的创建细节

mysql>SHOW CREATE DATABASE mydb1;

查看当前所有的数据库

mysql>SHOW DATABASES;

创建一个使用gbk字符集的mydb2数据库。

mysql>CREATE DATABASE mydb2 CHARACTERSET gbk;

创建一个使用utf8字符集,并带校对规则的mydb3数据库。

mysql>CREATE DATABASE mydb3 CHARACTERSET utf8 COLLATE utf8_general_ci;

查看当前数据库服务器中的所有数据库

mysql>SHOW DATABASES;

查看前面创建的mydb2数据库的定义信息

mysql>SHOW CREATE DATABASE mydb2;

删除前面创建的mydb1数据库

mysql>DROP DATABASE mydb1;

查看服务器中的数据库,并把mydb2的字符集修改为utf8;

mysql>ALTER DATABASE mydb2 CHARACTER SETutf8;

 

#数据库的操作
#创建数据库
create database mydb ;
#查看创建数据库的语句
show create database mydb ;
#改变当前的数据库
use mydb ;
#删除数据库
drop database mydb ;
#查看所有的数据库
show databases ;
#修改数据库mydb1的字符集为utf8
alter database mydb1 character set utf8 ;

#了解
#创建数据库mydb1,字符集用gbk
create database mydb1 character set gbk ;
#查看数据库中所有的校对规则
show collation ;
#查看中文的校验规则
show collation like '%gb%' ;
#创建数据库mydb2,字符集用gbk,校验规则用gbk_bin
create database mydb2 character set gbk collate gbk_bin ;
#-----

表结构操作

SQL概述及单表查询

创建表之前要先选择数据库。

选择数据库

mysql>USE mydb2;

创建一个员工表

mysql>CREATE TABLE employee(

       id int,

       name varchar(100),

       gende rvarchar(10),

       birthday date,

       entry_datedate,

       job varchar(100),

       salary float(8,2),

       resume text

);

查看当前数据库中的所有表

mysql>SHOW TABLES;

查看表的创建细节

mysql>SHOW CREATE TABLE employee;

在上面员工表的基本上增加一个image列。

mysql>ALTER TABLE employee ADD imageblob;

修改job列,使其长度为60。

mysql>ALTER TABLE employee MODIFYjob varchar(60);

删除image列。

mysql>ALTER TABLE employee DROP image;

表名改为user。

mysql>RENAME TABLE employee TO user;

修改表的字符集为gbk

mysql>ALTER TABLE user CHARACTER SETgbk;

列名name修改为username

mysql>ALTER TABLE user CHANGEname username varchar(100);

#针对表的操作
#创建表t
create table t(
id int ,
name varchar(30)
) ;
#查看创建表的源码
show create table t ;
#创建表t1,使用字符集gbk
create table t1(
id int ,
name varchar(30)
)character set gbk ;
#创建表t4
create table t4
(
id int ,
name varchar(30),
optime timestamp
) ;



DML:数据操作语言

作用:操作的是表中的记录(数据)

关键字:INSERT  UPDATE  DELETE

#插入数据
#设置客户端的字符集为gbk
set character_set_client=gbk;
#设置结果集的字符集为gbk
set character_set_results=gbk ;

insert into t4(id,name) values(1,'张无忌') ;
insert t4(id,name) values(2,'乔峰') ;
#省略字段,意味着所有的字段都必须给值(自增例外)
insert t4 values(3,'杨过','2014-4-3') ;

#更新
#将表t4的第三条记录姓名字段改为杨康
update t4 set name='杨康' where id = 3 ;
#将所有记录的名字都改为东方不败
update t4 set name = '东方不败' ;
#修改多个字段
update t4 set id=6,name='萧峰' where id = 2 ;

#删除
delete from t4 where id = 4 ;
#删除所有的记录
delete from t4 ;
#删除所有的记录
truncate table t4 ;


#给表t4增加一个字段address
alter table t4 add address varchar(100) ;
#删除字段address
alter table t4 drop column address ;
#查看表的结构
desc t4 ;

MySQL:

字符串类型   使用单引号引起来   ‘abcdefg’

日期时间       使用单引号引起来   ‘2001-01-08’

特殊值   null


DQL数据查询语言

作用:查询

关键字:SELECT

简单查询:

查询表中所有学生的信息。

mysql>SELECT * FROM student;

查询表中所有学生的姓名和对应的英语成绩。

mysql>SELECT name,english FROMstudent;  

过滤表中重复数据。

msyql>SELECT DISTINCT english FROMstudent;

在所有学生数学分数上加10分特长分。

mysql>SELECT name,math+10 FROM student;

统计每个学生的总分。

mysql>SELECT name,chinese+english+mathFROM student;

使用别名表示学生分数。

mysql>SELECT name AS 姓名,chinese+english+math 总分 FROM student;

 

查询姓名为王五的学生成绩

msyql>SELECT * FROM student WHERE name='王五';

查询英语成绩大于90分的同学

mysql>SELECT * FROM student WHEREenglish>90;

查询总分大于200分的所有同学

mysql>SELECT * FROM student WHERE(chinese+english+math)>200;

 

查询英语分数在 80-90之间的同学。

mysql>SELECT * FROM student WHEREenglish BETWEEN 80 AND 90;

查询数学分数为89,90,91的同学。

mysql>SELECT * FROM student WHERE mathIN (89,90,91);

查询所有姓李的学生成绩。

mysql>SELECT * FROM student WHERE nameLIKE ‘李%’;

查询数学分>80,语文分>80的同学。

mysql>SELECT * FROM student WHEREmath>80 AND chinese>80;

 

 

对数学成绩排序后输出。

mysql>SELECT name,math FROM studentORDER BY math;

对总分排序后输出,然后再按从高到低的顺序输出

mysql>SELECT name,chinese+english+mathFROM student ORDER BY chinese+english+math DESC;

对姓李的学生语文成绩排序输出(由高到低)

msyql>SELECT name,chinese FROM studentWHERE name LIKE ‘李%’ ORDER BYchinese DESC;

 

lmysql有六处使用了字符集,分别为:clientconnectiondatabaseresultsserversystemclient是客户端使用的字符集。connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。      database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。   results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。      server是服务器安装时指定的默认字符集设定。      system是数据库系统使用的字符集设定。SQL概述及单表查询

lOrder by指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的列名。lAsc 升序、Desc 降序lORDER BY子句应位于SELECT语句的结尾。

#创建一个学生表
create table stu
(
id int primary key, #主键约束
name varchar(30) unique, #唯一约束
sex char(2) not null, #非空约束
age int check (age > 0 and age < 100), #检查约束
address varchar(50) default '北京' #默认约束
) ;

insert into stu values(1,'张无忌','男',20,'北京') ;
insert into stu values(2,'小龙女','女',18,'古墓') ;
insert into stu values(3,'黄蓉','女',15,'桃花岛') ;
insert into stu values(4,'韦小宝','男',24,'扬州') ;
insert into stu values(5,'乔峰','男',34,'雁门关') ;
insert into stu values(6,'张果老','男',30,'雁门关') ;
insert into stu values(7,'老张','男',38,'黒木崖') ;
insert into stu values(8,'张','男',34,'桃花岛') ;
insert into stu values(9,'韦小宝','女',24,'新东方') ;
insert into stu(id,name,sex,age) values(10,'令狐冲','男',27) ;



#查看所有数据
select * from stu ;
#查看小龙女的信息
select * from stu where id = 2 ;
select * from stu where name='小龙女' ;
#查看年龄在20~30之间的人
select * from stu where age >=20 and age <=30 ;
select * from stu where age between 20 and 30 ; # 包括20和30
#查看所有的的姓名
select name from stu ;
#查看所有的的姓名,年龄,性别
select name,age,sex from stu ;
#模糊查询
select * from 表名 where 字段名 like 字段表达式
% 表示任意字符数
_ 表示任意的一个字符
[] 表示在某个区间

#查询所有以张开头的人
select * from stu where name like '张%' ;
#查询姓名中含有张这个字的人
select * from stu where name like '%张%' ;
#查询姓名中含有张这个字的人并且姓名的长度是3个字的人
select * from stu where name like '张__' or name like '_张_' or name like '__张' ;

#查询表中有几种性别
select distinct sex from stu ;
#查找姓名和性别整体都不同的记录
select distinct name,sex from stu ;

#创建新表分数表
create table score
(
id int primary key,
sid int ,
china int,
english int ,
history int,
constraint sid_FK foreign key(sid) references stu(id)
) ;

insert into score values(1,1,68,54,81) ;
insert into score values(2,3,89,98,90) ;
insert into score values(3,4,25,60,38) ;
insert into score values(4,6,70,75,59) ;
insert into score values(5,8,60,65,80) ;

#字段可以有表达式
select id,china+10,english,history from score ;
#给字段起别名
select id as 编号,china as 语文,english as 英语,history as 历史 from score ;
select id 编号,china 语文,english 英语,history 历史 from score ;
#查看所有人考试的总分是多少
select id,china + english + history 总分 from score ;
#查看总分大于200的人
select * from score where china + english + history > 200 ;

#查询家在桃花岛或者黒木崖的人
select * from stu where address = '桃花岛' or address = '黒木崖' ;
select * from stu where address in('桃花岛','黒木崖') ;

#查询没有参加考试的人
select id ,name from stu where id not in(select sid from score) ;

#查询没有地址的人
select * from stu where address = null ; #错误的
select * from stu where address is null ;
#查询有地址的人
select * from stu where address is not null ;

#排序(order by )
#对考试的人的语文升序排列
select * from score order by china asc;
#对考试的人的历史降序排列
select * from score order by history desc;
#根据多个字段进行排序(语文升序,对语文成绩一样的人再进行历史降序类排)
select * from score order by china asc,history desc;
#根据考试总分降序进行排序
select *,china + english + history 总分 from score order by china + english + history desc ;