以MySql为例
1.命令行操作
练习SQL语句还是在命令行下实践比较好
安装好MySql后,打开他自带的命令行界面后,直接输入密码即可进入
/*
* 对库的操作
*/
//查看已存在的数据库,注意复数形势:
show databases;
//创建数据库,最好带上编码格式:
create database student character set utf8;
//更改编码格式:
alter database student character set utf8;
//查看指定的某一个数据库结构:
show create database student;
//删除某一个数据库,最好带上判断:
drop database if exits student;
/*
* 对表的操作
*/
//对表操作之前要声明用哪个数据库,直接是数据库名,没带上database的声明:
use student;
//创建一张表,圆括号,不是尖括号:
create table user(id int,name varchar(20),password varchar(8),birthday date);
//查看所有的表,若没有,提示empty,复数形式:
show tables;
//查看指定的表结构:
show crate table user;
//给表加一列:
alter table student add age int;
//修改某一字段的属性:
alter table student modify name varchar(30);
//修改这一字段的名称和属性,被改的无需写上长度属性,改后的属性要标明:
alter table student change name username varchar(10);
//改变表的编码:
alter table student character set gbk;
//重命名表:
rename table student to students;
/*
* 乱码问题
* 一般中文乱码是由于数据库client编码和自己指定的编码不一致导致的,若要中文需要GBK编码
*/
//查看环境信息,注意 %
show variables like 'character%';
//更改环境里的编码
set character_set_client=gbk;
//还有显示编码也要一致
set character_set_results = gbk;
/*
* 增
*/
//第一次插入需要写入字段名称,后续则不用
insert into employee(id,username,gender,birthday,entry_date,job,salary,resume,image) values(1,'allen','male','1990-1-1','2010-1-1','CEO',9999.00,'someday','noday');
insert into employee values(2,'lisi','male','1990-1-1','2010-1-1','CEO',9999.00,'someday','noday');
//只插入部分还是需要写入字段的
insert into employee(id,username,gender,resume,image) values(3,'Kitty','female','someday','noday');
//查看所有表元素
select * from employee;
/*
* 改
*/
//修改某一列所有属性值
update employee set resume='n/a';
//修改某一列的某一行属性值
update employee set resume='yes' where id=1;
//更改某一行多个属性值
update employee set id=5,gender='femal' where username='allen';
//数值项四则运算
update employee set salary=salary+100 where id=2;
/*
* 删除表中数据 delete,若不带from来限定,则所有数据删除,但是表结构(定义)还在
* 若要删除表定义,请用drop table
* 另truncate,是删除表记录,类似不带from的delete
* 但是drop和truncate是DDL,自动提交,立即生效;delete是DML,可以回滚
*/
delete from employer where id=4;
drop table employee;
另立了一个表
/*
* 查 前面用的 * 查所有
*/
//查某两列
select name,english from pupils;
//过滤重复数据,多列时关键字distinct必须在首项,且必须多列都重复才过滤
select distinct name,english from pupils;
//查某一列并同时加上一个值
select name,math+1 from pupils;
//查询时可将列的显示位置变换,同时显示每一行的数值之和
select name,math,chinese,english,math+chinese+english from pupils;
//别名显示
select name as '用户名' from pupils;
//范围刷选,可以按照大于、小于号来,也可按照 in(可选值列表) 来定
select name,math,english,chinese from pupils where english>70 and math<99;
select name,math,english,chinese from pupils where math in(70,60,100);
//模糊查询,%
select name,math,english,chinese from pupils where name like '李%';
//排序,默认是升序,降序是order by desc
select name,math,math+chinese+english from pupils order by math+chinese+english desc;
关于Null
若在插入时,输入的内容为空,则查询时显示的为null,但这个不是真正的null,按照null为关键字查询时提示为empty
只有在插入时 不输入这一项,查询时才可以按null为关键词查询
2.主键 & 外键 & 多表查询
关于主键:
某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如:
学生表(学号,姓名,性别,班级)
其中每个学生的学号是唯一的,学号就是一个主键
用户表(用户名、密码、登录级别)
其中用户名是唯一的, 用户名就是一个主键
主键主要是用于其他表的外键关联,以及本记录的修改与删除
2.1 一对多
建一个省份表,主键是省份的id
建一个学生表,主键是学生id
每个省份id可以对应多个学生的籍贯省份信息
此时,有了主键后,插入数据时,主键不能为空,而且不能重复。
/*
* 主键、外键
*/
create table province ( id int primary key,province varchar(9));
create table student (id int primary key,name varchar(20),provinceid int);
//插入数据时,各自的主键值不能重复且不能为空
insert into province values(1,'新疆维吾尔族自治区');
insert into province values(2,'内蒙古自治区');
//此时没有外键,没有和省份表关联,省份id可以自由加
insert into student values(1,'陈金旭',1);
insert into student values(2,'田伟',2);
insert into student values(3,'李阳',3);
但是这个时候两张表没有任何关系
以省份表为学生表外键来源
此时学生表里多了一个省份3,要删掉才能添加外键,或者在省份表里加一个ID=3
//删除掉外键里没有的id
delete from student where id=3;
/*
* 添加外键
* FK_provinceid是自定义的外键名
* foreign key(province)表明这张表哪个字段需要关联外键
* province(id)表明是哪张表的哪个字段当做外键
*/
alter table student add constraint FK_provinceid foreign key(province) references province(id);
此时要用别的省份,需要在省份表里添加一个省份才行
//添加一个省份
insert into province values(3,'黑龙江');
//此时在学生表里才能用到黑龙江
insert into student values(3,'李阳',3);
2.2 多对多
师生对应关系,另建一个数据库
每个老师可以对应多个学生,每个学生也有多个老师
建立老师表和学生表,定义主键
//学生表老师表
create table teacher(id int primary key,Name varchar(10) not null);
create table student(id int primary key,Name varchar(10) not null);
//插入数据
insert into student values (1, '江峰');
insert into student values (2, '进旭');
insert into student values (3, '熊吉');
insert into student values (4, '苏浪');
insert into student values (5, '王丹');
insert into teacher values (1, 'Chinese');
insert into teacher values (2, 'math');
insert into teacher values (3, 'english');
insert into teacher values (4, 'physics');
insert into teacher values (5, 'movie');
此时应该再建立一个表,将学生与老师的ID关系对应,并分别作为学生表、老师表的外键
//外键对应表
create table course(T_ID int,S_ID int);
//分别作为外键
alter table course add constraint FK_courseT_ID foreign key (T_ID) references teacher(id);
alter table course add constraint FK_courseS_ID foreign key (S_ID) references student(id);
//给外建表插入数据
insert into course values(1,1);
insert into course values(3,1);
insert into course values(5,1);
insert into course values(4,4);
insert into course values(1,5);
insert into course values(3,5);
insert into course values(5,4);
insert into course values(4,5);
insert into course values(5,5);
可以看到对应关系
1号学生对应着1、3、4号老师,以此类推
2.3 一对一关系
夫妻关系
/*
* 一对一
*/
create table husband (id int primary key,name varchar(10));
create table wife (id int primary key,name varchar(10));
//给wife增加一个husbandid字段,作为关联
//并且这个值应该是唯一的,否则可以出现多个wife嫁给同一个husband的情况,wife表插入时husbandid可以相同
alter table wife add husbandid int;
alter table wife add constraint FK_wife_husbandid foreign key(husbandid) references husband(id);
alter table wife modify husbandid int unique;
正常的写法,另外也可以通过外键关联来实现,因为主键本身就是唯一的
/*
* 正常写法
*/
create table PERSON(ID int primary key,NAME varchar(100));
create table computer(ID int primary key,brand varchar(20),
PERSON_ID int unique,constraint FK_PERSON_ID foreign key(PERSON_ID) references PERSON(ID));
//也可以通过外键关联
create table computer(ID int primary key,brand varchar(20),
constraint FK_PERSON_ID foreign key(ID) references PERSON(ID)