数据库基本操作
1 2 3 4
| SHOW DATABASES CREATE DATABASES 数据库名 USE 数据库名称 DROP DATABASE 数据库名
|
数据类型
基础的数据类型忽略,只用重点看下面两个数据类型
enum单选
set多选
1
| set('打球','下棋','音乐','游泳')
|
定点数
- M是最大位数(精度),范围是1到65。可不指定,默认值是10。
- D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。
新增表create
创建表副本
注意,创建的副本没有定义主键和自动增加属性,要手动添加
1 2
| create table orders_archived as select * from orders
|
- 利用where语句
1 2 3
| create table orders_archived as select * from orders where order_data <'2019-01-01'
|
创建自定义表
1 2 3 4 5 6
| create table '表名'( '列名1' 数据类型 '列名2' 数据类型 '列名3' 数据类型 '列名4' 数据类型 )
|
外键的设置
- 子表的外键必须是主表的主键
1 2 3 4 5 6
| create table student_score( number int subject varchar(30) score tinyint constraint poreign key(number) references student_info(number) )
|
删除表drop
- 删除不存在的表会报错,要判断一下是否存在
1
| drop table if exists 表1,表2,表3
|
增加记录insert
表设置
Datatype |
|
PK |
主键 |
NN |
非空 |
UQ |
唯一 |
B |
二进制 |
UN |
非负数,比text更大 |
ZF |
填充,如Datatype是int(4),内容是1,显示0001 |
AI |
自动增加 |
G |
生成列,这一列由其他列计算而得 |
Default/Expression |
默认值 |
默认插入
1 2 3 4 5 6 7 8 9 10 11 12 13
| insert into customers values( default, 'first_name', 'last_name', 'birthday', null, 'address' 'city', 'state', default )
|
指定插入,多行插入
1 2 3 4 5 6 7
| insert into shippers(shipper_id,name) values ('id1','name1'), ('id2','name2'), ('id3','name3'), ('id4','name4'),
|
last_insert_id主子表连接
会返回上一次插入操作后的最后一个id值
1 2 3
| insert into orders(customer_id,order_date,status) values(1,'2019-01-02','1'); select LAST_INSERT_ID()
|
- 在子表中插入关联的id值
1 2 3 4 5 6
| insert into orders(customer_id,order_date,status) values(1,'2019-01-02','1'); insert into order_items values (last_insert_id,1,1,2.95), (last_insert_id,2,1,2.95)
|
删除delete
基础语法
若不写where语句会删除所有记录
1 2
| delete from invoices where invoice_id = 1
|
在where语句中使用select语句
和update一样
括号内的select会先执行,在另一个表中筛选出client_id作为筛选条件
1 2 3 4 5 6 7 8 9
| delete invoices set payment_totle = 1 payment_date = '2022-10-22' where client_id IN( select client_id from clients where state in('CA','NY') )
|
修改update
基本语法
1 2 3 4
| update 表名 set 键名1=键值1, 键名2=键值2 where 键名=键值
|
在where语句中使用select语句
括号内的select会先执行,在另一个表中筛选出client_id作为筛选条件
1 2 3 4 5 6 7 8 9
| update invoices set payment_totle = 1 payment_date = '2022-10-22' where client_id IN( select client_id from clients where state in('CA','NY') )
|
查询select
语句结构
1 2 3 4 5
| select '要选择的列' from '要选择的表' where '筛选条件' order by '排序条件' limit '要显示的记录数'
|
选择列
1 2 3 4 5 6 7 8 9
| select last_name, first_name, points, points+10 as 'new point' from customers
select DISTINCT state from customers
|
选择记录
关系运算符
可比较数字和时间
1 2 3 4
| select * from customers where brith_date > '1990-01-01' and point >300
|
若有多个值需要配对,可用in或not in
1 2 3
| select * from customers where state not in ('VA','FL','GA')
|
若在一个范围内,可用between … and …
可以是数字也可以是时间
1 2 3 4
| select * from customers where point between 1000 and 3000 and birth_date between '1990-01-01' and '2000-01-01'
|
like
like ‘ ‘ |
等于引号里字符的记录 |
% |
任意字符 |
_ |
一个字符 |
[] |
在括号内的任意字符 |
[^] |
不是括号内的任意字符 |
例:
1 2 3 4 5 6 7 8 9 10 11
| SELECT * FROM Persons WHERE City LIKE '%lon%';
SELECT * FROM Persons WHERE City NOT LIKE '%lon%'
SELECT * FROM Persons WHERE City LIKE 'lon[ea]'
SELECT * FROM Persons WHERE City LIKE '[^a]%'
|
regexp
regexp ‘ ‘ |
包含引号里字符的记录 |
^ |
以后面的字符开头的 |
$ |
以后面的字符结尾 |
| |
逻辑或 |
[abc] |
a,b,c中任意一个 |
[a-z] |
a到z中选一个 |
limit
- 规定要返回的记录的数目
1 2 3
| SELECT * FROM Persons LIMIT 5
|
is null 和 is not null
- 可选出特定值空的记录,或非空的记录
1 2
| SELECT * FROM Persons WHERE phone IS NOT NULL
|
结合join
结合多个表
使用using关键字,可以代替两个相同列的名称的值相等
1 2 3 4 5
| SELECT * FROM Persons JOIN Orders ON using(id_p)
|
显示所有left join
1 2 3 4 5
| SELECT * FROM Persons as p LEFT JOIN Orders as o ON using(id_p)
|
交叉结合nature join
即笛卡尔积,前表中的每一行都与后表的所有行配对
1 2 3 4
| select * from shippers sh cross join products p
|
合并结果集union
- 每个SELECT 语句必须拥有相同数量的列。
- 每个列也必须拥有相似的数据类型。
- 每条 SELECT 语句中的列的顺序必须相同。
同一个表不同列结合
1 2 3
| SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA
|
不同的表之间结合
1 2 3 4 5
| select first_name from archived_order union select name from shippers
|
对查询结果排序 order by
对查询结果分组 group by
对分组结果筛选 having
与 where 类似,区别是 having 只能作用于 group by 后面