SQL语言
1.Structured Query Language 结构化查询语言
2.SQL非过成型的语言
- 过程性的语言:以来上一条或者上几条语句执行
- 非过程性语言:一条语言,就对应一个返回的结果
SQL分类
1.DDL 数据定义语言
- 创建数据库 创建表 创建视图 创建索引 修改数据库 删除数据库 修改表 删除表
- create --创建 /alter --修改 / drop–删除
2.DML 数据操作语言
- 操作数据 / 插入数据(insert)/ 修改数据(update)/删除数据(delete)
3.DCL 数据控制语言
- if else while
4.DQL 数据查询语言
- 从表中查询数据(select)
中文乱码
具体操作:1.点击计算机右键管理->服务和应用程序->MySQL->右键停用
2.在文件夹中找到my.ini->点击->找到[client]下的[mysql]下的“default-character-set=utf8”
3.将utf8改成gbk保存
4.重启MySQL(方法和停用一样)
注意:[mysqld]下的utf8不更改
//DDL
//创建数据库
create database 数据库名称; //基本语法
create database 数据库名称 character set 编码 collate 校对规则;//标准
//查看所有数据库
show databases;
//使用数据库
use 数据库名称;
//查询数据库的创建的信息
show create database 数据库名称;
//查询当前正在使用的数据库
select database();
//删除数据库
drop database 数据库名称;
//修改
alter database 数据库名称 character set 'gbk' collate '校对规则';
//不能修改 数据库名称,只能修改 编码 或 校对规则
//创建表
create table 表名称(
字段1 类型(长度) 约束,
字段2 类型(长度) 约束,
字段3 类型(长度) 约束
);
/*注意:1.创建表的时候,后面是小括号,最后有分号
2.字段与字段之间用逗号,最后一个字段不用逗号
3.如果声明字符串数据的类型,长度是必须指定的
4.如果不指定数据的长度,有默认值的。int类型的默认长度是11
*/
/*
表类型
1.字符串
*char 长度不可变 (长度不够用空格补全)
*varchar 长度可变
2.大数据类型
*blob 字节(电影 MP3)
*text 字符(文本内容)
3.数值型
*tinyint / smallint / int /bigint /float / double
4.逻辑性
*bit(0/1)
5.日期类型
*date :只包含年、月、日
*time :只包含时、分、秒
*datetime :包含日期和时间。如果插入数据的时候,字符值为空,字段的值就是空。
*timestamp :包含日期和时间。如果插入数据的时候,字符值为空,默认获取当前的系统的时候,把时间保存到字段中。
约束
1.主键约束代表记录的唯一标识
*关键字:primary key 通过该关键字声明某一列为主键
*唯一 值就不能相同
*非空 值也不能为空
*被引用 (和外键一起来使用)
2.唯一约束
*声明字段是唯一的 关键字 unique
3.非空约束
*声明字段的值是不能空的 not null
*/
//查看表
show tables;
//查看表的详细信息
desc 表名称;
//查看创建表的信息
show create table 表名称;
//删除表
drop table 表名称;
//修改表
//1.添加新的字段
alter table 表名称 add 字段名称 数据类型(长度) 约束;
//2.修改字段数据类型、长度或约束
alter table 表名称 modify 字段名称 数据类型(长度) 约束;
//3.删除某一字段
alter table 表名称 drop 字段名称;
//4.修改字段名称
alter table 表明称 change 旧字段 新字段 数据类型(长度) 约束;
//5.修改表名称
rename table 旧名称 to 新名称;
//DML
//添加数据
insert into 表(字段1,字段2,字段3) values(值1,值2,值3);//向某几字段插入值
insert into 表 values(值1,值2,值3,...); //向全部字段加值
/*
注意:1.插入的数据要与字段数据类型相同
2.数据大小应在规定范围内
3.数据中数据的列的位置和字段位置相同
4.日期数据输入样例:'2020-2-1'
字符串输入样例:'这是一个字符串'
*/
//修改表
update 表名称 set 字段1=值1,字段2=值2 where 条件;
//如果没有where的关键字,说明修改的默认所有记录;如果有where的关键字,修改符合条件的记录
//删除表
delete from 表 where 条件;
//如果没有where的关键字,说明删除的默认所有记录;如果有where的关键字,删除符合条件的记录
//删除所有数据
delete from 表; //支持事务的操作,即误删除可以恢复
truncate 表; //不支持事务的操作
/*创建事务
start transaction;
delete form user;
rollback;
*/
//DQL
//查询
select *from 表; //默认查询所有表
select 字段1,字段2,字段3... from 表; //查询指定的字段的数据
distinct //去掉重复的数据
//查询语句可以用as起别名
select 字段1 as 别名,字段2,字段3 as 别名 from 表;
select * from 表 where 条件;
//where的一些常用符号
> < >= <= = <>不等于
in --代表范围
egg: select *from stu where math = 88; 查询一条数据,条件是数学=88
select *from stu where math in (90,95,100); 查询结果可能是多条数据,数学成绩需要在in的范围内
like --模糊查询
like关键字的值的用法
1.select *from stu where name like '张_'; --使用_占位符,结果可以为:张飞,张三。。。but 张益达 不符合
2.select *from stu where name like '张%'; --使用%占位符,结果可以为:张三,张飞,张益达, 只要姓张都可以
3.select *from stu where name like '%张'; --结果:以张结尾都行,->即使随便输个乱七八糟的东西最后是张<- 这也是符合的
4.select *from stu where name like '%张%'; --结果只要带张就行
逻辑条件
and --与
or --或
not --非
between A and B --在A和B之间
egg:1.select *from stu where math > 90 ang english > 80;
2.select *from stu where math > 90 or english > 80;
3.select *from stu where not math > 90;
4.
order by 对结果进行排序
order by 字段 asc|desc
asc --代表升序
desc --代表降序
1.select name,math from stu order by math asc;
2.select name,math from stu order by math desc;
3.select name,(math+english+chinese) as t from stu order by t desc;
4.select name,english,math from stu order by english desc,math desc; //按英语降序,英语相同后按数学降序
5.select name,chinese from stu where name like '小%' order by chinese asc; //对性小的同学按语文升序输出
//聚集函数
/* 1.都是操作某一列函数
2.Excel表格,求数量,求和,平均值,最大值,最小值
*/
//求数量
1.select count(*) from stu;
2.select count(math) from stu where math > 80;
//求和(只对数值类型的起作用)
1.select sum(math) from stu;
2.select sum(math),sum(english),sum(chinese) from stu;
//求平均
1.select sum(math)/count(math) from stu;
2.select avg(math) from stu;
//最大值和最小值
1.select max(math) from stu;
2.select min(english) from stu;
//分组查询
1.select count(*)from 表名称 group by 字段;
2.select product,sum(price) from orders group by product having sum(price)>100;
//先分组,将分组中总价格大于100的商品查询出
//having与where的功能相同 where关键字后不能使用聚合函数,而having可以
3.select product,sum(price) from orders where price > 100 group by product having sum(price)>100;
//查询购买了几类商品,并且商品的价格需要大于100,每类的总价大于100
//单表约束
//唯一 关键字unique
//非空 关键字not null
egg:create table person(
id int primary key,
username varchar(20) unique,
emall varchar(50) not null
);
/*主键
特点:1.非空2.唯一3.被引用
声明关键字:primary key 声明某一字段为主键
注意:添加数据时,声明为主键的字段,所添加的值不能重复*/
egg:create table person(
id int primary key,
username varchar(20)
);
添加1:insert into person values(1,'美美');
添加2:insert into person values(1,'小凤'); //此时报错
--id字段的值不能再为1,
/*主键的自动递增
适用于int和bigint类型
关键字:auto_increment
*/
egg:drop table person;
create table person(
id int primary key auto_increment,
username varchar(20);
);
添加1:insert into person values(null,'美美');
添加2:insert into person values(null,'小凤');
//主键回将null自动变为1,2...
//多表约束(外键)
/*用来保护数据的完整性
举个栗子:
一公司有 部门表 和 员工表
部门表 员工表
id bname id name sal bname
1 研发部 1 熊大 1600 1 //属于哪个部门
2 人事部 2 熊二 2655 1
3 小美 3000 2
好了现在公司开会说,不需要研发部了,要将部门表中的研发部去掉;
按理说,研发部是不能删除,因为部门下还有两个员工
如果是单纯建立两个表,没有加外键(两表之间没关联),则可以删除,但是这不符合常理因为熊大熊二所在的部门1没有对应的部门
如果是加上外键则不能删除,删除时会报错,此时应将员工移到别的部门,再将研发部删掉
*/
//创建部门表
create table dept(
did int primary key auto_increment,
dname varchar(30)
);
//创建员工表
create table emp(
eid int primary key auto_increment,
ename varchar(30),
sal double,
dno int,
foreign key (dno) references dept(did) //添加外键关联
);
//此时dno的取值只能从dept中的did的值中取,也可以为null
数据库表结构设计的三种方式
- 一对一
- 一对多
- 多对多
一对一:利用主键进行一一对应,不多介绍。
一对多:主表(一方) 从表(多方)
建表原则,在多方表中添加字段,把该字段作为外键,指向一方表的主键。
多对多:建表原则,用户表和角色表例子,需要创建3张表,有一张中间表,存储数据关系
未完待续。。。