show databases;
查看当前选择的数据库
select database();
use test3;(使用表)
查询编码格式(这样可以避免在doc下看到的乱码)
show variables like 'character%';
set character_set_client=gbk;
set character_set_results=gbk;
开始创建表
create table student(
id int,
name varchar(20),
chinese float,
english float,
math float
);
insert into student(id,name,chinese,english,math) values(1,'陈冠希',89,78,90);
insert into student(id,name,chinese,english,math) values(2,'郭美美',67,98,56);
insert into student(id,name,chinese,english,math) values(3,'阿娇',88,98,90);
insert into student(id,name,chinese,english,math) values(4,'李一',87,78,77);
insert into student(id,name,chinese,english,math) values(5,'李来财',82,84,67);
insert into student(id,name,chinese,english,math) values(6,'张进宝',55,85,45);
insert into student(id,name,chinese,english,math) values(7,'黄蓉',75,65,30);
然后插入数据
distinct 明显的,独特的
查询表中所有的学生信息
select * from STUDENT;
查询表中所有学生的姓名和对应的英语成绩。
select NAME,ENGLISH from STUDENT;
显示英语成绩,过滤表中重复数据
select distinct ENGLISH from STUDENT;
在所有学生数学分数上加10分特长分。
select NAME,MATH+10 from STUDENT;
统计每个学生的总分。
select NAME MATH+CHINESE+ENGLISH from STUDENT;
使用别名表示学生分数。
select NAME as 姓名,MATH+ENGLISH+ENGLISH 总分 from STUDENT;(注意在使用别名的时候的as是可以省略的)
查询姓名为"陈冠希"的学生成绩
select * from STUDENT where NAME='陈冠希';
查询英语成绩大于90分的同学
select * from STUDENT where ENGLISH > 90;
查询总分大于200分的所有同学
select * from STUDENT where(MATH+CHINESE+ENGLISH)>200;
查询英语分数在 80-90之间的同学。
select * from STUDENT where ENGLISH between 80 and 90;
查询数学分数为89,90,91的同学。
select * from STUDENT where MATH in(89,90,91);
查询所有姓李的学生成绩。
select * from STUDENT where NAME like '李%';
查询数学分>80,语文分>80的同学。
select * from STUDENT where MATH>80 and CHINESE>80;
注意:not and or 优先级依次降低。一元运算符比二元的要高。
对数学成绩排序后输出。
select MANE,MATH from STUDENT order by MATH;
对总分排序后输出,然后再按从高到低的顺序输出
select NAME,MATH+CHINESE+ENGLISH 总分 from STUDENT order by 总分 desc;
对姓李的学生语文成绩排序输出
select NAME,CHINESE from STUDENT where NAME like '李%' order by CHINESE;
注意:订单,order。创建表时要注意不要和关键字冲突。
解决办法:
1、把用户定义的内容用反引号引起来。`(Esc按键的下方)
2、数据库命名习惯:表名ORDERS (建议)这样将表名变为复数形式
这样可以避免和关键字冲突
create table order(id int);
这样的输入会报错,所以我们必须加上`(Esc按键下方)的反引号
应该这样输入:
create table `order`(int int);
查看表格式
desc `order`;
二、完整性约束
数据完整性的意义:
数据完整性是为了保证插入到数据中的数据时正确的,
它防止了用户可能输入错误。
数据完整性有以下三类
1、实体完整性:
规定表中的一行(即每一条记录)在表中是唯一的实体(Entity)。
实体完整性通过表的主键来实现。
主键:不能为null;唯一
创建一个表格T1,并声明一个主键
写法一(只能指定一个字段作为主键)
create table T1(
ID int primary key,
NAME varchar(100)
);
insert into T1(ID,name) values(1'aa');
写法二:(指定联合主键)
create table T2(
ID int,
NAME varchar(100),
primary key(ID)
);
用desc T2;
查看表的结构
比较写法一和写法二:
推荐写法二:可以指定联合主键
写法三:(创建没有任何约束的表格,最后再修改约束)
create table T3(
ID int,
NAME varchar(100)
);
alter table T3 add primary key(ID);
三种方法比较后:
极力推荐写法三
写法三的好处是:如果两张表的主键受到另外一张表的约束的时候,在数据还没有插入完毕的时候,
在插入数据的过程中会报错。所以我们选择写法三的话,就可以避免这样的错误。
注意:
逻辑主键(建议):除了唯一标识一条记录外,没有别的意义,一般
取名ID
业务主键:还有一定的业务意义。
在MySql中:
create table T4(
ID int key auto_increment,#自动增长,不建议使用,
并不是所有的数据库都支持自动增长,比如Qracle就不支持。
NAME varchar(100)
);
域的完整性
指数据库表的列(即字段)必须符合某种特定的数据类型偶约束。比如NOT NULL
1、约束数据的类型:强类型
2、非空约束: not null
3、唯一约束 unique
实例:
create table T5(
ID int primary key auto_increment,
USERNAME varchar(100) not null unique,
PHONE_NUM varchar(11) unique,
GENDER varchar(10) not null
);
参照完整性(多表的设计)定义外键
注意:类和表的结构关系;对象和记录的关系(帮助学习ORM:Hibernate MyBatis)
一对多(实例:客户对订单)
CUSTOMERS ORDERS
ID(PK) NAME PADDRESS ID(PK) ORDER_NUM AMOUT CUSTOMER_ID(FK)
1 张三 四川 1 2016101301 10 1
2 李四 湖北 2 2016101302 12 2
3 2016101303 15 2
4 2016101304 16 1
如何描述订单与客户的关系呢?
我们可以在ORDERS中增加一列CUSTOMER_ID(FK),这个CUSTOMER_ID 的值受到CUSTOMERS 的ID的约束
即一个订单只能对应一个客户(一对多),反过来,一个客户可以有多个订单(多对一)
建表:
create table CUSTOMERS(
ID int primary key,
NAME varchar(100),
ADDRESS varchar(100)
);
create table ORDERS(
ID int primary key,
ORDER_NUM varchar(100),
AMOUNT float(10,2),
CUSTOMER_ID int,
constraint CUSTOMER_ID_FK foreign key (CUSTOMER_ID) references CUSTOMERS(ID)
);
说明:CUSTOMER_ID_FK为约束名称(一个库中约束名称唯一)
insert into CUSTOMERS values(1,"周莉",'四川');
insert into ORDERS values(1,'0001',100.00,2);(这句会报错的,因为有外键的约束)
我们插入:
insert into ORDERS values(1,'0001',100.00,1);这样就是完美的。