Mac 学习mysql

本文介绍了在Mac上学习MySQL的基本步骤,包括如何打开MySQL、数据库的结构和分类、常见的数据库操作如CRUD,以及详细讲解了表的创建、数据操作、字段约束和基础函数的使用。还特别提到了数据库不区分大小写、时间、字符串类型的选择以及主键和唯一约束等关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、如何打开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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值