常用sql语句(MySQL)
一.库操作
1. 创建
create database 数据库库名字;
例:create database ms;
创建时 确定数据库字符集:
create database 数据库名字 character set 字符集;
例:create database ms character set utf8;
创建时 确定数据库字符集 和 比较规则
create database 数据库名字 character set 字符集 collate 比较规则;
例:create database ms character set utf8 collate utf8_general_ci;
2. 修改
修改字符集:
alter database 数据库名字 character set 字符集;
例: alter database 数据库名字 character set gbk;
3. 删除
drop database 数据库名字;
例: drop database ms;
4.查看所有库
show databases; // 注意:是databases 最后有个 's'
5. 切换数据库(或者说是进入数据库)
use ms; //进入数据库
二、表操作
1. 创建表
例: 创建一个ms_user表
字段 类型
id int
name varchar
gender varchar
birthday date
要求:把 id设置为主键,并自动增长,name不能为空;
create table ms_user (
id int primary key auto_increment,
name varchar(20) not null,
gender varchar(3),
birthday date
);
2. 查看库中所有表
show tables;
3. 查询表中信息
show columns from 表名字;
例: show columns from ms_user;
查看表结构(感觉与楼上作用相同,还简单)
desc 表名字;
例: desc ms_user;
查看建表语句:
show create table 表名;
例: show create table ms_user;
4. 删除表
drop table 表名字;
例:drop table ms_user;
5.修改表
增添数据字段(列):
alter table 表名 add 字段 类型;(可以添加自增,非空等字段,和创建时相同)
例: alter table ms_user add image varchar(20);
修改字段:
alter table 表名 modify 字段 类型;(同上)
例: alter table ms_user modify gender varchar(2);
删除字段:
alter table 表名 drop 字段名;
alter table ms_user drop gender;
修改表名:
rename table 原表名 to 新表名;
例: rename table ms_user to ms_use;
修改表字符集:
alter table 表名 character set 字符集;
例: alter table ms_use character set utf8;
修改字段名(列名)
alter table ms_use change 列名 新列名 原字段的限制字段;
例: alter table ms_use change name username varchar(20) not null;
三、数据操作
1. 添加数据
方法一:
INSERT INTO ms_user
VALUES(NULL,
'lisi',
'男',
21,
'1998-02-04'
);
方法二:
INSERT INTO ms_user(name,
gender,
age,
birthday)
VALUES(
'lisi',
'男',
21,
'1998-02-04'
);
两种方法各有好出,
方法一可以省略繁琐的列名,但必须完全按照数据表中每个列的次序来写,切必须对每一个列进行赋值。且并不安全容易出问题,
方法二 编写更加安全,但也更加繁琐,不必对每一列进行赋值且顺序可以自己随意定义。(推荐)
-- 插入多行数据
只用写一个VALUES 括号之间用','隔开(当然你也可以一条一条的插入)
INSERT INTO ms_user(name,
gender,
age,
birthday)
VALUES(
'lisi',
'男',
21,
'1998-02-04'
),
(
'zhangsan',
'男',
22,
'1997-02-14'
);
-- 查询检索出来的数据
INSERT INTO customers(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country
FROM custnew;
注:
-- 查询语句中的列名并不是必须与插入语句中的列名相同,准确的说两个列名完全没有关系,他们是按照两列的顺序进行比对插入的。
-- SELECT语句可以使用WHERE子句过滤。
-- 还有数据类型必须兼容
2. 修改/更新数据
UPDATE ms_user
SET age = '18'
WHERE id = '10086';
更新多条语句
UPDATE ms_user
SET age = '18',
gender = '女'
WHERE id = '10086';
删除某个列的值可以用
UPDATE ms_user
SET age = NULL
WHERE id = '10086';
注: 注意不要省略WHERE子句,这样的话会改变整张表所有行的数据的。
3. 删除数据
DELETE FROM ms_user
WHERE id = '10086';
注: 注意不要省略WHERE子句,这样的话会删除整张表所有行的数据的。
4. 查询数据
-- 查询表中所有数据
select * from ms_user;
-- 查询表中nmae,id列的数据
select name,id from ms_user;
4.1 where
-- 条件查询 操作符:=,>,<,<=,>=,!=,<>,BETWEEN;
select * from ms_user where id>5;
-- 注:其中 != 和 <>的作用是相同的,因为习惯于其他编程语言的习惯,我们通常用的都是 !=
例: SELECT * FROM ms_user WHERE id != 3;
SELECT * FROM ms_user WHERE id <> 3;
-- 注: 当进行过滤数据时,字符串需要使用单引号 ''
例: SELECT * FROM ms_user WHERE name = 'lisi';
-- 注: 当需要同时使用 ORDER BY 子句和 WHERE 子句时,应该让 ORDER BY 位于 WHERE 之后,否则将会产生错误
例: SELECT * FROM ms_user WHERE age < 13 ORDER BY age;
BETWEEN 用法 : 使用BETWEEN必须只等连个值---所需范围的低端值和高端值。 两个值用 AND 连接
例: SELECT * FROM ms_user WHERE age BETWEEN 5 AND 10;
# 检索ms_user表中age在 5到10之间的数据;
4.1.1 空值检索
在创建表示我们可以指定一个列是否可以包含空值。在一个列不包含值的时候,称其为包含空值NULL
# 注:NULL 无值(no value), 他与字段包含0,空字符串或包含空格不同。
SELECT 中有一个特殊的WHERE 子句,可以检索具有NULL值的列 :(IS NULL)
例: SELECT * FROM ms_user WHERE name IS NULL;
4.1.2 数据过滤
1. AND OR ,与java 语言中的 && || 类似,用法也类似
例: SELECT * FROM ms_user WHERE name = 'wzy' AND age < 21;
SELECT * FROM ms_user WHERE age < 5 or age >15;
注:AND的优先级高于OR, 当AND 和 OR 同时使用的时候SQL 优先处理AND ,我们可以通过圆括号来明确分组相应的操作符,来达到自己的目的。
SELECT * FROM ms_user WHERE (age = 3 or age = 13) AND name = 'wzy';
注:任何时候使用具有 AND 和 OR 操作符的WHERE 子句,都应该使用圆括号明确地分组操作符,不要过分依赖于默认计算顺序,加括号又没坏处,还增加程序的可读性。
4.1.3 IN 操作符
2. IN 用处应该是和 OR 差不多,甚至一样。
IN 操作符用来指定条件范围,范围中的每个条件都可以进行匹配。
SELECT * FROM ms_user WHERE age IN(3,5);
SELECT * FROM ms_user WHERE age = 3 OR age = 5;
4.1.4 NOT操作符
3. NOT 用来否定其后跟的条件的关键字
SELECT * FROM ms_user WHERE age NOT IN(3,5);
#返回 ms_user 表中 age 不等于 3或5 的数据。
AND OR IN 都可以和NOT 一起使用。
4.1.5 用通配符进行过滤
1. % 百分号通配符
用法: a% :匹配以a开头的所有字符串
%a : 匹配以a结尾的所有字符串
%a% : 匹配包含a的所有字符串
a%b : 匹配以a开头以b结尾的所有字符串
在使用通配符的时候,必须使用LIKE 操作符。
LIKE 指示 MYSQL 后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
例: SELECT * FROM ms_user WHERE name LIKE '%zy';
注: WHERE name LIKE '%'; 看起来可以匹配任何值,但有一个例外 NULL, NULL 不能匹配到。
2. _ 下划线通配符,与%的用途一样,但下划线只匹配单个字符,而不匹配多个字符。
例: SELECT * FROM ms_user WHERE name LIKE '_zy';
# 他只能匹配到 wzy, 但匹配不到 wwzy,zy ,因为 _ 只能匹配到zy 前的一个字符,不能多也不能少。
4.2 Limit: 分页查找
-- limit 限定查询的条数,以及从什么时候开始查询
select name from ms_user limit 5; #限定查询界现, limit 5 表示从第一行 开始往后5行的数据
select name from ms_user limit 15,5 # limit 15,5表示从第15行开始往后5行的数据
# 注:limit 是从 0开始的与数组类似,从第0行开始计行
select name from ms_user limit 5 offset 15; #与上边的结果相同 表示 从第15行开始取5行
# 注:当limit 指定的检索行数 超过表的最大行数时,将只返回到最大行数;
4.3 order by :排序
order by / ORDER BY :以字母顺序排序 (默认为升序) 注:如果为数字默认为从小到大。
例: SELECT name FROM ms_user ORDER BY name;
-- 按多个列排序
-- 解:安多个列排序是先以第一个属性排序当第一个属性值相同时再用第二个属性排序。
例: SELECT name,gender FROM ms_user ORDER BY name,gender;
-- 排序方向是可以指定的,默认为升序,可以加上 DESC 关键字变为降序,对应的还有 ASC 关键字使排序为升序,但 ORDER BY 默认为升序所以没多大用处;
例: SELECT name FROM ms_user ORDER BY name DESC;
-- 注:当使用多列排序时,使用 DESC 关键字时,一个关键字只代表一个属性的排序方式,如果我们要让每一列都是降序排序,那么我们需要在每一个属性后面都加上一个 DESC 关键字;
例: SELECT name,age FROM ms_user ORDER BY age DESC, name DESC;
-- 通过 ORDER BY 和 LIMIT 的组合,我们能够找到一列中的最高值或最低值
例: SELECT name,age FROM ms_user ORDER BY age DESC LIMIT 1;
4.4 聚合函数
1. AVG() :返回某列的平均值
例: SELECT AVG(age) FROM ms;
2. COUNT() : 返回某列的行数
例: SELECT COUNT(*) FROM ms;
注:如果COUNT()的值不为* 则忽略NULL值
3. MAX() : 返回某列的最大值
例: SELECT MAX(age) FROM ms;
4. MIN() : 返回某列的最小值
例: SELECT MIN(age) FROM ms;
5. SUM() : 返回某列的总和
例: SELECT SUM(quantity*item_price) AS SUM_price FROM orderitems;
4.5 数据分组
4.5.1 GROUP BY子句
当我们想获得在年龄为23的人的人数是我们可以用
SELECT COUNT(*) FROM ms WHERE age==23;
但当我们想要获得所有年龄段的人的分别人数时,用这条语句就显得有点麻烦了,这时我们就可以用分组,使用GROUP BY子句了。
SELECT age,COUNT(*) AS age_count
FROM ms
GROUP BY age;
注: GROUP BY 子句要放在 WHERE 子句之后
4.5.2 过滤分组 HAVING
MySQL除了可以使用GROUP BY 分组数据外,还允许对分组进行过滤,规定包括哪些分组,排除哪些分组,这时我们就要用到HAVING子句,HAVING 子句的语法与WHERE子句的语法一样,只是操作对象,以及关键词的区别,理论上WHERE子句能做到的事,HAVING子句都可以做到
SELECT age,COUNT(*) AS age_count
FROM ms
GROUP BY age
HAVING COUNT(*)>10;
子句 | 说明 |
---|---|
SELECT | 要返回的列或表达式 |
FROM | 从中检索数据的表 |
WHERE | 行级过滤 |
GROUP BY | 分组说明 |
HAVING | 组级过滤 |
ORDER BY | 输出排序顺序 |
LIMIT | 要检索的行数 |
4.6 子句查询
1. 利用子查询进行过滤
如:订单表,通常有两张表,对于包含订单号,客户ID,订单日期的每个订单储存与orders表,各订单的物品储存在相关的orderitems表中。orders表不储存客户信息,实际信息储存在customers表中
例:现我们要列出订购物品TNT的所有客户
第一步:检索出包含物品TNT的所有订单编号,。
SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT';
第二步:检索出这些订单的客户ID
SELECT cust_id
FROM orders
WHERE order_num IN (1001,1002);
这是我们可以通过子查询对上述两条语句进行合并完成相同的功能
SELECT cust_id
FROM orders
WHERE order_num IN(SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT' );
2. 作为计算字段使用子查询
例: 假如需要显示customers表中每个客户的订单总数,订单与相应的客户ID储存在orders表中。
1. 从customers表中检索客户表
2. 对检索出的每个客户,统计其在orders表中的订单数目
例:
SELECT COUNT(*) AS orders
FROM orders
WHERE cust_id = 1;
这时我们通过子查询
例:
SELECT cust_name,(SELECT COUNT(*)
FROM orders
WHERE orders.cust_id== customers.cust_id) AS orders
FROM customers
ORDER BY cust_name;