mysql学习记录

关系型数据库:不是把所有的数据全部存储在一起,而是分类存储在一起。
常见的数据库
关系型:oracle大型收费,mysql小型免费。
sql语言(操作数据库)
structured query language 结构化查询语言
1.DDL 数据定义语言
创建数据库 创建表 创建视图 修改数据库 删除数据库 修改表 删除表
create----创建 alter—修改 drop–删除
2.DML数据操作语言
操作数据 插入数据(insert) 修改数据update 删除数据delete
3.DCL数据控制语言(很少用,一般在代码中写)
if-else while
4.DQL 数据查询语言
从表中查询数据select
一.sql语法:
1.1 SQL语句总是以关键字开始,如SELECT、INSERT、UPDATE、DELETE、DROP、CREATE。
1.2 SQL语句以分号结尾。
1.3 SQL不区分大小写,意味着update与UPDATE相同。
SELECT - 从数据库中提取数据
UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
一.数据库
开启mysql服务(cmd: 以管理员身份运行):net start mysql
连接数据库:mysql -u root -p 或者 mysql -uroot -proot
数据库的创建
基础写法:create database +数据库名称;如:create database esl_factory;(分号必须要加)
正常写法: character set +编码 collate +校对规则;
显示创建的数据库列表: show databases; (分号必须要加)
切换数据库:use+数据库名称;
查询数据库的创建信息:show create database+数据库名称;
查询当前正在使用的数据库: select database();
删除数据库:drop database +数据库名称;
修改数据库:alter database +数据库名称+character set ‘gbk’ collate +‘校对规则’;(数据库名称不能改,只能改编码和校对规则);
二.表结构
创建表:
create table +表名称(
字段1 类型(长度) 约束,
字段2 类型(长度) 约束
);
注意:1.字段之间使用逗号,最后一个字段不能使用逗号
2.如果是字符串数据的类型,长度必须是指定的。
3.int类型的默认长度是11。
创建一张表结构:
create table employee(
id int,
name varchar(30),
birthday date,
entry_date date,
job varchar(50),
salary double,
resume text
);
一.数据库的数据类型:
1.字符串型(常用)
varchar长度是可变的,可节省空间。
char 长度是不可变的。长度不够时使用空格补全。
2.大数据类型(不常用)
BLOB (字节) TEXT (字符文本)
3.数例型(常用):
INT BIGINT FLOAT DOUBLE
3.逻辑型(不常用)
BIT(1或0),在JAVA中是true或false;
4.日期型(常用)
DATE — 只包含日期(年月日)
TIME — 只包含时间(时分秒)
DATETIME —包含日期和时间 ,传入空值时,显示空
TIMESTAMP —包含日期和时间,传入空值时,默认当前系统的时间;
二.表约束
约束的好处:保证数据的完整性。
主键约束:代表记录的唯一标识。
主键约束:primary key 通过该关键字声明某一列为主键。
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
 主键必须包含唯一的值。
 主键列不能包含 NULL 值。
 每个表都应该有一个主键,并且每个表只能有一个主键。
被引用(和外键一起来使用)
唯一约束(unique) 值就不能相同
每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
非空约束(not null) 值也不能为空
索引约束:快速创建检索数据
default约束:默认值
DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。
外键约束:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
check约束:
三.操作表
删除表:drop table +表名
查看标签:
show tables -----查看当前数据库中所有的字段
desc + 表名 -----查询表的信息
sow create table +表名 -----查看表的创建的信息
四.操作表结构:
1.添加一个新字段
alter table +表名称 +add +字段名称 +数据类型(长度) 约束;
2.修改字段的数据类型,长度或者约束
alter table 表名称 modify 字段名称 数据类型(长度) 约束;
3.删除某一个字段
alter table 表名称 drop 字段名称;
4.修改字段的名称
alter table 表名称 change 旧字段 新字段 数据类型(长度) 约束;
5.修改表的名称
rename table 旧表名 to 新表名;
五.向表中添加数据
1.添加数据,使用insert关键字来添加数据
insert into 表 (字段1,字段2,字段3) values (值1,值2,值3)
或者 insert into 表 values (值1,值2,值3)
注意事项:插入的数据与字段数据的类型相同;数据的大小 应该在规定的范围内,数据中的列的位置和字段位置是相同的;字符串和日期类型的数据,必须要使用单引号括起来。
如:insert into user_info (username,job,entry_date,age) values (‘chenxiaoyun’,‘teacher’,‘2019-10-11’,20);
六.解决中文乱码问题
插入中文,会产生乱码问题;
修改MYSQL客户端的编码即可;
1.停止MYSQL服务器;
2.找到MYSQL安装路径,找到my.ini的配置文件;
3.修改客户端的编码,改成GBK;
[client]
port=3306
[mysql]
default-character-set=gbk
4.重启MYSQL服务;
七.修改数据的sql语句
update 表名称 set 字段1=值1,字段2=值2 where 条件;
如果没有where,默认选择所有记录,如果有where,修改符合条件的记录。
1.所有员工薪水修改为5000元: update user set salary=5000;
2.将姓名为‘熊大’的员工修改为2000:update user set salary=2000 whre username=‘熊大’;
3.将姓名为‘熊二’的员工薪水改为4000,job改为‘保洁’:update user set salary=4000,job=‘保洁’ where username=‘熊二’;
4.将小明的薪水在原来基础上加300:update user set salary=salary+300 where username=‘小明’;
八.删除数据的sql语句。
1.删除语句:delete from 表 where 条件;
例:delete from user where username=“Allen”;
2.删除所有的数据
2.1 delete from 表;
一行一行的数据;支持事务的操作。
start transaction;
delete from user where username=“Allen”;
rollback;
(Allen被删除后,回滚恢复)
2.2.truncate 表: 先把整个表删除,再创建一个与原来一样的空数据的表。
truncate user;
九.查询语句(重点)
1.select * from 表;(检索所有列)
2.select 字段1,字段2 from 表;(检索多列,逗号隔开)
select 字段1 from 表(检索单列)
3.distinct 去掉重复的关键字 select distinct name from user;
4.limit限制返回的数量
SELECT prod_name from products limit 5;
limit 3,4代表从第3行开始的4行,limit5代表从第0行开始的5行,0省略。
5.可以对查询的列进行运算;
查询语句可以使用as作关键字起别名(alias),as常被省略;列名和表名均可起别名。
练习
select * from stu;
select username,role from user;
select distinct english from user;
select username,math+10,english+10,chinese+10 from stu;
select username,(math+english+chinese) as t from stu;
select * from stu where username=“chenchen”;
select username,english from stu where english > 90;
select uername,(math+english+chinese) from stu where (math+english+chinese) > 150;
十.查询语句(where子句)
select 字段1,字段2 | * from 表 where 条件的过滤; WHERE 子句用于过滤记录。
WHERE 子句用于提取满足指定标准的记录。
where 子句后可以使用的运算符有: > < >= <= = <> (不等于) in(代表的范围),like,between,
like运算符-----模糊查询
与like一起使用的通配符(%表示一个或多个字符,代表单个字符)
select * from stu where username like '张
’; (_占位符,代表一个位置,结果可以是张飞,但不不能是张翼德);
select * from stu where username like ‘张%’;(%占位符,可以代表多个位置,结果是张开始的,张飞,张三四);
select * from stu where username like ‘%张’;(以张结尾的,李张);
select * from stu where username like ‘%张%’;(username中有带张字的);
and ----与
or -----或
not ----非
between …… and 在……之间(值可以是数字,文本或日期)
SELECT * FROM Orders WHERE OrderDate BETWEEN #07/04/1996# AND #07/09/1996#;
IN指定条件范围 (功能与or相同)
select prod_name from where price in(1002,1003)查询价格是1002或者1003的商品名称。
select prod_name from products where id not in (1002,1003);
SQL 中,NULL 用于表示缺失的值。数据表中的 NULL 值表示该值所处的字段为空。使用IS NULL来查找空值
SELECT column_names FROM table_name WHERE column_name IS NULL;
SELECT column_names FROM table_name WHERE column_name IS NOT NULL;
练习:
select username,english from stu where english >= 60 and english <=90;
相当于select username,english from stu where english between 60 and 90;
select username,english from stu where english in (60,70,80);
MySQL 的 WHERE 子句的字符串比较是不区分大小写的。
你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。
SELECT * from runoob_tbl WHERE BINARY runoob_author=‘RUNOOB.COM’;
select prod_name from products where prod_price IS MULL
十一.查询语句(order by对结果进行排序)
order by 字段 asc | desc; (asc 代表升序,desc代表降序); order by 放在select 语句末尾。
select username,math from stu order by math desc;(对数学成绩排序后输出);
select username,(math+english+chinese) as t from stu order by t desc;
select * from stu order by english desc,math desc; (按照英语降序排,英语相同的按照数学降序排);
select * from stu where username like ‘陈%’;
十二.聚集函数(Aggregate function)基于一组数据进行计算,返回一个输出结果
聚集函数:excel表格:求数量,求和,平均值,最大值,最小值;
聚焦函数操作的都是某一列的数据。
1.求数量:count()
select count(*) from stu where (math+english+chinese) > 220;(统计总分大于220的人数有多少?)
select count(distinct sno) from sc; //从sc中求数量,去重sno相同的内容。
2.求某一列数据的和:sum(),sum只对数值类型起作用;
select sum(math),sum(chinese),sum(english) from stu;
select sum(math+chinese+english) from stu;
3.求平均分avg()
select avg(chinese) from stu;
4.max()—最大值;
5.min()—最小值;
十三.标量函数(Scalar function)针对每个输入参数,返回一个输出结果
1.UPPER()或者UCASE()----转换成大写字母
2.LOWER()或者LCASE()—转换成小写字母
select upper(sno) from student;
select upper(sno) from student;
3.MID(column_name,start,length); //column_name和start必填。start不从0开始,从1开始,length可选。
MID() 函数用于从文本字段中提取字符。
select mid(sname,1,2) from student;
4.LENGTH() 函数返回文本字段中值的长度。
5.ROUND() 函数用于把数值字段舍入为指定的小数位数。
SELECT ROUND(column_name,decimals) FROM table_name; //column_name必填,decimals必填(小数位)
6.SELECT NOW() FROM table_name; //NOW() 函数返回当前系统的日期和时间。
7.FORMAT() 函数用于对字段的显示进行格式化。
SELECT FORMAT(column_name,format) FROM table_name; //column_name必填,format必填,格式
SELECT FORMAT(100.3111,0);//取整,得出:100
8.DATA_FORMAT() //日期格式化
select DATE_FORMAT(NOW(),‘%Y-%m-%d’) from sc; //date_format用于日期格式化
9.SQRT() // 函数用于计算得出任何数值的平方根。
10.RAND 函数,用于产生 0 至 1 之间的随机数
11.CONCAT 函数用于将两个字符串连接为一个字符串;
select concat(column1,column2,column3) from student;
12.REPLACE()字符串替换函数
replace(original-string,search-string,replace-string) original-string: 被搜索的字符串。可为任意长度 。search-string: 要搜索并被 replace-string 替换的字符串。replace-string: 该字符串用于替换 search-string
select replace(title,‘陈小芸’,‘金瑜辉’);
13.TRIM()函数去除字符串头尾空格,ltrim去掉左边空格,rtrim去掉右边空格。
select trim(tname) from student;
十四.查询语句(分组查询group by)使用关键字group by ** 根据字段进行分组。
select * from orders group by product; 按照商品归类查询
select product,sum(price) from orders group by product having sum(price) > 100; 查询总共有几类商品,并且每类商品总价大于100的商品
select product,sum(price) from orders where price > 40 group by product having sum(price) > 100; 查询购买了几类商品,并且商品的价格大于40,每类总价大于100的商品
注意:使用where的条件,如果有分组,where的条件是分组之前的条件;
新的关键字,having关键字(子句)进行分组的条件过滤;
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与 Aggregate 函数一起使用。
HAVING子句已添加到SQL中,因为WHERE关键字不能用于聚合函数。
//where后面不能使用聚合函数,having可以使用聚合函数。
十四.单表约束
1.主键约束(非空,唯一,作为一条记录的标识被引用),声明主键用primary key,主键可以用auto_increment自增长,自增长只能使用int和bigint类型。开发中,主键基本上是必须要设置的。
2.唯一约束,使用关键字unique;
3.非空约束not null;
create table person(
id int primary key auto_increment,
username varchar(30) unique,
email varchar(30) not null
);
外键约束
目的是保证表结构中的数据完整性。
create table emp(
id int primary key auto_increment,
name varchar(30),
salary double,
dno int,
foreign key(dno) references esl_factory(id);
);
十五.一对多表结构设计
表结构设计常用方式:一对一,一对多,多对多;
一对一(很少用),两张表主键一致;
一对多(最常用)
两张表,主表(一方),从表(多方)
比如下部门表和员工表中,一个部门下有多个员工,每个员工只属于一个部门。那么部门是一方,员工是多方。
建表原则:在多方表中添加字段,把该字段作为外键,指向一方表的主键。
多对多(较常用)
场景:用户与角色,一个用户有多个角色,一个角色被多个用户所拥有。
建表原则:多对多拆分成2个一对多场景,创建一张中间表,存储数据关系。

十六.多表查询之内链接
笛卡尔积
内连接:
1.普通内链接:……inner join ……on 条件
select * from dept inner join emp on did=dno;
2.隐式内链接
语法:select …… from 表1,表2 where 表1.字段1=表2.字段2;
语句:select * from dept,emp where dept.did=emp.dno;
别名:select * from dept d,emp e where d.did=e.dno;
指定字段:select d.dname,e.ename,e.sal from dept d,emp e where did=e.dno;
十七.多表查询之外链接
左外链接:使用关键字select * from 表1 left outer join 表2 on 条件;
outer关键字可以省略不写;
select * from dept left outer join emp on dept.did=emp.dno;
右外链接:select * from 表1 right outer join 表2 on 条件;
select * from dept right outer join emp on dept.did=emp.dno;
内连接查询的是2张表交集数据,主外键关联的数据。
左外连接查询的是左表中所有的数据和2张表主外键关联的数据。
右外连接查询的是右表中所有的数据和2张表主外键关联的数据。
十八.子查询:把查询语句的结果作为另一条查询语句的条件。
select username,english from stu where english > (select avg(english) from stu);

你可能感兴趣的:(SQL,mysql)