Mysql基础及常用sql语句
本文最后更新于657 天前,其中的信息可能已经过时,如有错误请发送邮件到2763981847@qq.com

1.表的创建与删除

1.1 建表

CREATE关键字

CREATE TABLE IF NOT EXISTS `test` (
  `id` INT (5) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `name` VARCHAR (30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  `age` INT (3) COMMENT '年龄',
  `sex` VARCHAR (1) COMMENT '性别',
   -- 列名 数据类型(大小) 各种属性值 备注
  PRIMARY KEY (`id`)   -- 设置主键
) ENGINE = INNODB DEFAULT CHARSET = utf8  -- 设置引擎和默认字符集

1.2删表

DROP 关键字

DROP TABLE  IF EXISTS `test01`

2.增删改查

2.1增

INSERT 关键字 : 插入一行或多行数据(字段名可省略不写,但后面的值需与列一一对应)

INSERT INTO `test` (`name`,`age`,`sex`) VALUES ('张三',18,'男')

格式:INSERT INTO 表名 (字段名,字段名···),(···),(····)··· VALUES(对应值,对应值···),(···),(····)···

2.2改

UPDATE关键字 :搭配WHERE更改符合条件位置的数据

UPDATE `test` SET `name`='李四',`sex`='女' WHERE `name`='李四' AND `id`=1

格式:UPDATE 表名 SET 字段名=对应值,字段名=对应值··· WHERE 条件(可用and或or链接多个条件)

2.3删

DELETE关键字 :搭配WHERE删除符合条件的行

DELETE FROM `test` WHERE `id`=1

格式:DELETE FROM 表名 WHERE 条件

  • 注意:不加where 则删除全表数据

TRUNCATE关键字:删除全表数据

TRUNCATE `test`

格式:TRUNCATE 表名

DELETE与TRUNCATE清空全表时的不同

  1. TRUNCATE 清空全表时时会重置自增列的计数器。
  2. TRUNCATE不会影响事务。

2.4查(DQL)

SELECT关建字

-- 查询指定表中所有数据
SELECT * FROM test


-- 查询指定表中的指定字段
SELECT `name`,`age` FROM test


-- 查询时可为字段名或表名取别名,查询结果会显示其别名
SELECT `name` AS `姓名`,`age` AS `年龄` FROM test AS `测试`


-- 函数CONCAT(a,b) 拼接字符串展示在查询结果中
SELECT CONCAT('姓名:',`name`) AS `姓名` FROM test AS `测试`


-- DISTINCT关键字去重
SELECT DISTINCT `name` AS `姓名` FROM test AS `测试`


-- 查询系统版本(函数)
SELECT VERSION()


-- 查询计算结果(表达式)
SELECT 100*10-1


-- 查询自增的步长(属性)
SELECT @@auto_increment_increment 


-- 按条件查询
SELECT `name`,`age` FROM test  WHERE age<20&&age>15
SELECT `name`,`age` FROM test  WHERE age<20 AND age>15
SELECT `name`,`age` FROM test  WHERE age BETWEEN 15 AND 20

格式:SELECT 字段名 FROM 表名 or SELECT 表达式 FROM 表名

2.4.1 WHERE子句模糊查询

模糊查询:比较运算符

运算符 语法格式 描述
IS NULL x IS NULL 如果x为NULL,返回真
IS NOT NULL x IS NOT NULL 如果x不为NULL,返回真
BETWEEN x BETWEEN a AND b 若x在a,b之间,返回真
LIKE x LIKE y 如果x匹配y,返回真
IN x IN (x1,x2,x3,···) x是x1,x2,···中的某个值,返回真
-- %表示零个或多个任意字符
-- _表示一个任意字符
-- 查询姓刘的同学
SELECT `name` FROM test WHERE name LIKE '刘%'


-- 查询姓刘且刘后只有一个字的同学
SELECT `name` FROM test WHERE name LIKE '刘_'


-- 查询名字带江的同学
SELECT `name` FROM test WHERE name LIKE '%江%'


-- 查询id在1,2,3之中的同学
SELECT `name` FROM test WHERE id IN (1,2,3)

2.4.2 联表查询

jion关键字

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记

使用到的数据:

SELECT * from runoob_tbl

runoob_id runoob_title runoob_author submission_date
1 学习 PHP 菜鸟教程 2017-04-12
2 学习 MySQL 菜鸟教程 2017-04-12
3 学习 Java RUNOOB.COM 2015-05-01
4 学习 Python RUNOOB.COM 2016-03-06
5 学习 C FK 2017-04-05

 

SELECT * FROM tcount_tbl

runoob_author runoob_count
菜鸟教程 10
RUNOOB.COM 20
Google 22

2.4.2.1 INNER JOIN

img

使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取runoob_tbl表中所有runoob_author字段在tcount_tbl表对应的runoob_count字段值:

SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl AS a INNER JOIN tcount_tbl AS b ON a.runoob_author = b.runoob_author;
-- AS均可省略

查询结果如下:

runoob_id runoob_author runoob_count
1 菜鸟教程 10
2 菜鸟教程 10
3 RUNOOB.COM 20
4 RUNOOB.COM 20

2.4.2.2 LEFT JOIN

img

MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即使右边表无对应数据。

SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;

查询结果如下:

runoob_id runoob_author runoob_count
1 菜鸟教程 10
2 菜鸟教程 10
3 RUNOOB.COM 20
4 RUNOOB.COM 20
5 FK (NULL)

2.4.2.2 RIGHT JOIN

img

MySQL RIGHT JOIN 会读取右边数据表的全部数据,即使左边边表无对应数据。

SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;

查询结果如下:

runoob_id runoob_author runoob_count
2 菜鸟教程 10
1 菜鸟教程 10
4 RUNOOB.COM 20
3 RUNOOB.COM 20
(NULL) (NULL) 22

2.4.2.3 更多连接方式

10235414-410198f29927b0c2

2.4.3 SELECT完整语法格式

SELECT[ALL|DISTINCT|DISTINCTROW|TOP] 
{*|talbe.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]} 
FROM tableexpression[,…][IN externaldatabase] 
[WHERE…] 
[GROUP BY…] 
[HAVING…] 
[ORDER BY…] 
[LIMIT]
-- 用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。 

 

  1. FROM子句
    FROM子句指定了SELECT语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
  2. ALL、DISTINCT、DISTINCTROW、TOP谓词
    (1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
    例:SELECT ALL FirstName,LastName
    FROM Employees
    (2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
    (3) DISTINCTROW 如果有重复的记录,只返回一个
    (4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
  3. 分组和总结查询结果
    在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
  4. 用ORDER BY子句排序结果
    ORDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
    ORDER子句中定义了多个字段,则按照字段的先后顺序排序。
  5. LIMIT指定行数查询LIMIT 起始行数 offset 需要的行数

3.MySQL函数

3.1聚集函数

  • COUNT(expr):返回expr的行数(不包括NULL值)。
  • SUM(expr):返回expr的总和。
  • AVG(expr):返回expr的平均值。
  • MAX(expr):返回expr的最大值。
  • MIN(expr):返回expr的最小值。
  • GROUP_CONCAT(expr):将expr的值连接为一个字符串。
  • STD(expr):返回expr的标准差。
  • VARIANCE(expr):返回expr的方差。

3.2用于处理字符串的函数

  • CONCAT(str1, str2, …):将多个字符串拼接成一个字符串。
  • SUBSTRING(str, start, length):返回字符串str从第start个字符开始,长度为length的子串。
  • LEFT(str, length):返回字符串str左侧的length个字符。
  • RIGHT(str, length):返回字符串str右侧的length个字符。
  • LENGTH(str):返回字符串str的长度。
  • REPLACE(str, old_str, new_str):将字符串str中的所有old_str替换为new_str。
  • UPPER(str):将字符串str中的所有字符转换为大写。
  • LOWER(str):将字符串str中的所有字符转换为小写。
  • TRIM(str):去掉字符串str两端的空格。
  • LTRIM(str):去掉字符串str左侧的空格。
  • RTRIM(str):去掉字符串str右侧的空格。
  • REVERSE(str):将字符串str反转。
  • LOCATE(substr, str, pos):返回字符串str中substr第一次出现的位置,位置从pos开始搜索。
  • ASCII(str):返回字符串str的第一个字符的ASCII码值。

3.3用于处理数值的函数

  • ABS (x):返回 x 的绝对值。
  • CEILING (x):返回不小于 x 的最小整数值。
  • FLOOR (x):返回不大于 x 的最大整数值。
  • ROUND (x,y):对 x 进行四舍五入操作,并将结果保留为 y 个小数位。
  • TRUNCATE (x,y):截取 x 的小数部分,并将结果保留为 y 个小数位。
  • MOD (x,y):返回 x 除以 y 的余数。
  • SQRT (x):返回 x 的平方根。
  • POW (x,y):返回 x 的 y 次方。
  • EXP (x):返回 e 的 x 次幂。
  • LOG (x):返回 x 的自然对数。
  • LOG10 (x):返回 x 的以 10 为底的对数。
  • SIGN (x):返回 x 的符号,正数返回 1,负数返回 – 1,0 返回 0。
  • RAND ():返回一个 0 到 1 之间的随机数。
  • PI ():返回圆周率 π 的近似值 3.141592653589793。

3.4用于处理时间日期的函数

  • NOW():返回当前日期和时间。
  • DATE_FORMAT(date, format):将日期格式化为指定的字符串格式。
  • YEAR(date):返回日期的年份部分。
  • MONTH(date):返回日期的月份部分。
  • DAY(date):返回日期的日份部分。
  • HOUR(time):返回时间的小时部分。
  • MINUTE(time):返回时间的分钟部分。
  • SECOND(time):返回时间的秒钟部分。
  • TIMESTAMPDIFF(unit, start_time, end_time):返回从start_time到end_time之间的时间差,单位为unit。
  • DATE_ADD(date, INTERVAL expr unit):将日期date加上一个时间间隔,单位为unit。
  • DATE_SUB(date, INTERVAL expr unit):将日期date减去一个时间间隔,单位为unit。
  • STR_TO_DATE(str, format):将字符串转换为日期时间格式。
  • UNIX_TIMESTAMP():返回当前日期和时间的UNIX时间戳。
  • FROM_UNIXTIME(unix_timestamp, format):将UNIX时间戳转换为日期时间格式。

4.事务

4.1.什么是事务

事务(Transaction)是并发控制单位,是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。
事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。

4.2.事务的四大特性(ACID)

事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。

  • 原子性原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性
    数据库总是从一个一致性的状态转移到另一个一致性的状态。一致性确保了即使在执行第三、第四条语句之间时系统崩溃,前面执行的第一、第二条语句也不会生效,因为事务最终没有提交,所有事务中所作的修改也不会保存到数据库中。
  • 隔离性
    一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持续性
    指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

事务中的所有操作要么全部执行,要么都不执行; 如果事务没有原子性的保证,那么在发生系统 故障的情况下,数据库就有可能处于不一致状态。 因而,事务的原子性与一致性是密切相关的。

5.索引

1.普通索引
(1) 最基本的索引类型,没有唯一性之类的限制;
(2) 作用只是为了加快系统对数据的访问速度;
(3) 允许空值、重复值。
2.唯一索引
(1) 唯一索引是不允许其中任何两行具有相同索引值的索引;
(2) 唯一索引与普通索引类似,不同的是创建唯一性索引的目的不是为了提高访问速度,而是为了避免数据出现重复;
(3) 允许有空值。
3.组合索引
(1) 由多个字段组成的索引叫组合索引,也称为复合索引或联合索引;
(2) 一个组合索引实质上为表的查询提供了多个索引
如:创建组合索引 (c1,c2,c3),相当于创建了 (c1),(c1, c2),(c1, c2, c3) 三个索引。
注意如果不符合最左前缀原则,且也不符合覆盖索引,会导致索引失效
4.主键索引
(1) 主键索引是唯一索引的特定类型,该索引要求主键中的每个值都唯一;
(2) 不允许值重复或者值为空。
创建主键索引通常使用 PRIMARY KEY 关键字。不能使用 CREATE INDEX 语句创建主键索引。
5.全文索引
针对比较大的数据,如果要解决 like 查询效率低的问题,可以创建全文索引。
(1) 全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。
(2) 全文索引允许在索引列中插入重复值和空值。
注意对于大容量的数据表,生成全文索引非常消耗时间和硬盘空间。

-- 创建索引

-- 创建普通索引
CREATE INDEX index_name ON table_name(col_name);
-- 创建唯一索引
CREATE UNIQUE INDEX index_name ON table_name(col_name);
-- 创建普通组合索引
CREATE INDEX index_name ON table_name(col_name_1, col_name_2);
-- 创建唯一组合索引
CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2);
-- 创建全文索引
CREATE FULLTEXT INDEX index_name ON table_name(col_name);

-- 修改表
ALTER TABLE table_name ADD INDEX index_name(col_name); // 添加索引
ALTER TABLE table_name DROP INDEX index_name; // 删除索引

-- 创建表的时候指定索引
CREATE TABLE table_name ( […], INDEX [index_name] (col_name) );

-- 删除索引
DROP INDEX [index_name] ON table_name;

-- 查看索引
SHOW INDEX FROM table_name;

-- 其他命令
DESC table_name; -- 查看表结构
SHOW CREATE TABLE table_name; -- 查看生成表的SQL

 

 

文章:Mysql基础及常用sql语句
作者:oreki
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议。转载请注明文章地址及作者

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇