一、如何打开mysql
1.首先打开终端输入如下命令: /usr/local/MySQL/bin/mysql -u root -p 其中root为用户名。
2.回车后输入密码,此时密码不可见,回车后就可以编写mysql语句了
二、数据库
1.数据库的结构
数据库 -> 表(行和列) -> 数据 database->table->data
2.数据库的分类
DML是数据操纵语言
DDL是指数据定义语言
DCL是指数据控制语言
DQL是指数据查询语言
3.数据库的常见操作
增删改查 CRUD
三、数据库的的使用
1.数据库的操作
1.创建 数据库 库名 设置中文字符集utf8,防止中文乱码
create database xiaojiejie default character set utf8;
2.查询数据库
show databases;
3.删除数据库
drop database xiaojiejie;
2.表的操作(增删改查CRUD)
1.指定使用的数据库
use xiaojiejie;
2.创建表
create table book(字段名 字段类型(字段长度),字段2,字段3...)
create table book(
-> id int(11),
-> name varchar(100),
-> price double
-> );
3.查看表
show tables;
4.修改表
alter table tea add column vipprice double;
5.描述表结构
desc tea;
6.删除表
drop table tea;
3.数据的常见操作
1.查询数据
select * from book;
2.增加数据
insert into book values(1,"红楼梦",39);
3.修改数据
update book set price = 42;
4.删除数据
delete from book;
4.数据库的使用细节
1.mysql数据库不区分大小写,多个单词用下划线分开
2. 时间: date(年月日) time(时分秒) datetime(年月日时分秒) timestamp(时间戳,毫秒数)
3.字符串: char / varchar的区别
char 是固定长度,浪费空间char(10)
varchar 是可变长度,节省空间varchar(10)
特殊场景: 数据长度如果就是固定的,优先选char,因为查的快
4.图片: 如果想存入数据库,只会存文件的磁盘路径,不是存文件本身
5.字段约束(通常在设计表创建表时就已经确定了)
1.非空约束,not null
哪个字段添加了非空约束,从此,字段值不能为空
2.主键约束,primary key
每个表都应该设计主键 , 主键是每条记录/数据的唯一标识
主键自增策略: 使用auto_increment
create table tea(
-> id int primary key auto_increment,
-> name varchar(100),
-> price double
-> );
3.唯一约束,unique
哪个字段添加了唯一约束,从此,字段值不能相同
create table user(
-> password varchar(10) not null unique
-> );
练习
CREATE TABLE dept(
deptno int primary key auto_increment ,
dname VARCHAR(20),
loc VARCHAR(13)
);
INSERT INTO dept VALUES(null,'accounting','一区');
INSERT INTO dept VALUES(null,'research','二区');
INSERT INTO dept VALUES(null,'operations','二区');
CREATE TABLE emp(
empno int primary key auto_increment,
ename VARCHAR(10),
job VARCHAR(10),
mgr int,
hiredate DATE,
sal double,
comm NUMERIC(7,2),
deptno int
);
INSERT INTO emp VALUES(100,'jack','副总',NULL,'2002-05-1',90000,NULL,1);
INSERT INTO emp VALUES(200,'tony','总监',100,'2015-02-02',10000,2000,2);
INSERT INTO emp VALUES(300,'hana','经理',200,'2017-02-02',8000,1000,2);
INSERT INTO emp VALUES(400,'leo','员工',300,'2019-02-22',3000,200.12,2);
INSERT INTO emp VALUES(500,'liu','员工',300,'2019-03-19',3500,200.58,2);
4.默认约束,default
#默认约束:给字段设置默认值而不是默认的null,使用default
CREATE TABLE a(
id INT PRIMARY KEY AUTO_INCREMENT,
sex VARCHAR(10) DEFAULT '男'#默认约束
)
5.检查约束,check
#检查约束:使用check,了解
CREATE TABLE b(
id INT PRIMARY KEY AUTO_INCREMENT,
age INT,
CHECK(age<200 AND age>0)#检查约束
#数据要满足检查条件才可以
)
6.外键约束
foreign key(当前表的主键名) references 对方表(对方的主键)
#外键约束:先创建外键+再使用外键
CREATE TABLE tb_user(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
sex CHAR(10) DEFAULT '男'#默认约束
)
CREATE TABLE tb_user_address(
user_id INT PRIMARY KEY,
address VARCHAR(200),
#foreign key(当前表的主键名) references 对方表(对方的主键)
FOREIGN KEY(user_id) REFERENCES tb_user(id)#1.创建外键
)
#2.使用外键
#约束的情况1:子表的主键值 必须 取自 主表的主键值
#约束的情况2:主表的记录不能随便删,要保证没有被子表使用才可以删
基础函数的使用
lower–全转小写
upper–全转大写
length–求长度
substr–截取子串
concat–拼接字符串
replace–替换
#SQL中的函数
#SELECT 列名1,列名2 FROM 表名
SELECT * FROM emp #查询所有列
SELECT ename FROM emp #查名字
SELECT empno,ename FROM emp #查编号和名字
SELECT empno a FROM emp #给列设置别名
#UPPER转大写 列名 列的别名
SELECT ename,UPPER(ename) a FROM emp
#lower转小写 列名
SELECT ename,LOWER(ename) FROM emp
#length求长度,根据u8,一个字母或数字长度为1,一个汉字长度为3
SELECT ename,LENGTH(ename) FROM emp#查ename的长度
SELECT ename,job,LENGTH(job) FROM emp#查job的长度
#substr截取子串
#SUBSTR(a,b)-a是截取谁b是从哪个字符开始
SELECT ename,SUBSTR(ename,2) FROM emp
#SUBSTR(a,b,c)-a是截取谁b是从哪个字符开始c是截取的长度
SELECT ename,SUBSTR(ename,2,2) FROM emp
#concat(a,b,...)拼串-a是列名b是要拼接的数据
#...是指可以有多个参数
SELECT ename,CONCAT(ename,"hello",1,2) FROM emp
#替换replace(a,b,c)-a是字段名把b换成c
SELECT ename,REPLACE(ename,'a','666') FROM emp
#ifnull(a,b)-a是字段名b是要换成的值
SELECT comm,IFNULL(comm,100) FROM emp#如果是null就换成100
#查询每个员工的月薪
SELECT sal,comm,sal+IFNULL(comm,0) FROM emp
#对小数的函数:
SELECT comm,ROUND(comm) FROM emp#四舍五入,取整
SELECT comm,ROUND(comm,1) FROM emp#四舍五入,保留1位小数
SELECT comm,CEIL(comm) FROM emp#ceil向上取整
SELECT comm,FLOOR(comm) FROM emp#floor向下取整
#对日期数据的函数:
SELECT NOW() #当前时间
SELECT YEAR('1999-1-1')
SELECT YEAR( NOW() )#当前年
SELECT MONTH( NOW() ),DAY( NOW() )#当前月,当前日
#hour时 minute分 second秒
SELECT HOUR( NOW() ),MINUTE( NOW() ),SECOND( NOW() )
#生成一个32位的随机数
SELECT UUID()
#\表示转义符号,把'当做普通的字符在使用而不是字符串的标记
SELECT 'xi\'an'
6.条件查询
1.and,or,in(),like'%a%'
#条件查询
#1.去重distinct
SELECT DISTINCT loc FROM dept #查询部门地址
#2.where连接查询的条件
#select 字段名 from 表名 where 字段名=字段值
#练习1:查询编号为1的部门信息
SELECT * FROM dept WHERE deptno=1
#练习2:查询编号>1的部门信息
SELECT * FROM dept WHERE deptno>1
SELECT * FROM dept WHERE deptno<2
SELECT * FROM dept WHERE deptno!=1
SELECT * FROM dept WHERE deptno<>1 #表示!=,同上
#练习3:查询名称是research的部门编号
SELECT deptno FROM dept WHERE dname='research'
#练习4:查询地址在二区编号为3的部门名称
SELECT dname FROM dept WHERE
loc='二区' AND deptno=3 #并且关系
#练习5:查询部门名称是accounting/research的部门地址
SELECT loc FROM dept WHERE
#dname='accounting' or dname='research'#或者关系
dname IN('accounting','research')#in子句in(a,b),同上
#练习6:查询编号是1 2 3的部门信息
SELECT * FROM dept WHERE
deptno IN(1,2,3)
#3.like--模糊查询,%通配符0~n个字符,_通配符1个字符
#练习1:查询名字包含a的员工信息
SELECT * FROM emp WHERE
ename LIKE '%a%' #包含a
#ename LIKE 'a_' #a后只有一个,了解
#练习SQL语句:
#练习1:查询部门地址在二区的部门名称
SELECT dname FROM dept WHERE loc='二区'
#练习2:查询部门地址在二区名字里有o的部门编号
SELECT deptno FROM dept WHERE
loc='二区' AND dname LIKE '%o%'
#练习3:查询名字以l开头的员工岗位并去重
SELECT DISTINCT job FROM emp WHERE ename LIKE 'l%'
#练习4:查询15年到19年入职的员工姓名和岗位
SELECT ename,job FROM emp WHERE
#year(hiredate)>=2015 and YEAR(hiredate)<=2019
hiredate>='2015-1-1' AND hiredate<='2019-12-31'
#练习5:查询副总的年薪
SELECT sal*12+IFNULL(comm,0)*12 FROM emp WHERE job='副总'
2.null
#1.null的数据用is /is not关键字来过滤
#练习1:查询没有奖金的员工信息
SELECT * FROM emp WHERE comm IS NULL
#练习2:查询有奖金的员工信息
SELECT * FROM emp WHERE comm IS NOT NULL
3.between ...and...
#练习3:查询工资5000~10000的员工信息
SELECT * FROM emp WHERE
#sal>=5000 and sal<10000
sal BETWEEN 5000 AND 10000 #[5000,10000]
#练习4:查询2019年入职的员工姓名
SELECT ename FROM emp WHERE
#hiredate between '2019-1-1' and '2019-12-31'
YEAR(hiredate)=2019
4.limit 分页
#练习5:展示前两条员工数据
SELECT * FROM emp LIMIT 2 #只取前n条
SELECT * FROM emp LIMIT 0,2 #从0+1的数据开始,总共展示2条
#练习6:查询岗位是员工的第一条记录
SELECT * FROM emp WHERE job='员工' LIMIT 0,1#limit通常放最后
5.order by 排序
#4.order by排序,按照字典顺序排,默认是升序ASC
#练习7:按照工资排序
SELECT * FROM emp ORDER BY sal DESC #按数值降序
#练习8:按照名字排序
SELECT * FROM emp ORDER BY ename DESC #按字母降序
#练习9:按照岗位排序
SELECT * FROM emp ORDER BY job ASC #按汉字对应的编号升序
#练习10:查询15年到19年入职的员工信息只取前两条并按照工资升序排
SELECT * FROM emp WHERE
YEAR(hiredate) BETWEEN 2015 AND 2019 #区间[2015,2019]
ORDER BY sal #排序,默认的升序
LIMIT 2 #分页,只取前两条,通常放最后
#统计需求
#练习1:统计每个员工的年薪
SELECT sal,comm,sal*16+IFNULL(comm,0)*16 FROM emp
#练习2:统计19年以前入职的员工信息
SELECT * FROM emp WHERE
YEAR(hiredate)<2019