1.数据库术语
数据库(database):保存有组织的数据的容器
数据表(table):某种特定类型数据的结构化清单
模式(schema):关于数据库和表的布局及特性信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分是信息如何命名等信息。数据库和表都有模式。
列(column):表中的一个字段,所有表都是由一个或多个列组成。
行(row):表中的一个记录。
主键(primary key):一列或一组列,其值能够唯一区分表中每个行(主键列不允许Null)。
-
SQL语法要点
语句不区分大小写,表名、列名、值是否区分,依赖具体的DBMS配置。
多条语句以分号分隔。
处理SQL语句时,所有空格都被忽略。SQL语句可以写成一行,也可以写成多行。
SQL支持3种注释:## -- /* -
数据定义语言(DDL)
Data Definition Language是SQL中负责数据结构定义与数据对象定义的语言,主要功能是定义数据库对象,核心指令是CREATE、 ALTER、DROP -
数据操纵语言(DML)
Data Manipulation Language是用于数据库操作,对数据库其中的对象和数据运行访问工作。主要功能是访问数据,核心指令是INSERT、UPDATE、DELETE、SELECT。这四个指令合称CRUD(create,read,update,delete)。 -
事务控制语言(TCL)
Transaction Control Language用于管理数据库中的事务,用于管理DML语句所做的更改,允许将语句分组为逻辑事务,核心指令是COMMIT、ROLLBACK。 -
数据控制语言(DCL)
Data Control Language是可对数据访问权进行控制的指令,核心指令是GRANT、REVOKE。可以控制用户的如下访问权限:CONNECT, SELECT, INSERT, UPDATE, DELETE, EXECUTE, USAGE, REFERENCES。 -
增删改查
插入数据
INSERT INTO user VALUES (10, 'root', 'root'); ## 插入完整的行
INSERT INTO user (username, password, email) VALUES ('admin', 'admin', 'xx@126.com'); ##插入行的一部分
INSERT INTO user(username) SELECT name FROM account; ##插入查询出来的数据
更新数据
UPDATE user SET username = 'robot', password = 'robot' where username = 'root';
删除数据
DELETE FROM user WHERE username = 'robot'; ## 删除指定数据
TRUNCATE TABLE user; ## 清空所有行
查询数据
SELECT prod_name FROM products; ## 查询单列
SELECT prod_id, prod_name, prod_price FROM products; ## 查询多列
SELECT * FROM products; ## 查询所有列
SELECT DISTINCT vend_id FROM products; ## 查询不同的值,distinct作用于所有列,所有列的值都相同才算相同
limit 5 ## 返回结果不多于5
limit 3,4 ## 返回从第3行开始的4行(mysql检索出的行数从0开始)
limit 4 offset 3 ## 返回从第3行开始的4行
-
子查询
子查询可以用比较运算符,如<,>,=。子查询必须用圆括号()括起来。
IN在WHERE子句中使用,作用是在指定的几个特定值中任选一个值。
BETWEEN在WHERE子句中使用,作用是取介于某范围内的值。
AND、OR、NOT是用于对过滤条件的逻辑处理指令。AND优先级高于OR。
LIKE在WHERE子句中使用,用于确认字符串是否匹配模式。只用文本值才能使用LIKE,支持%和通配符。通配符位于开头会匹配非常慢。%表示字符出现任意次数,表示任何字符出现一次。
LIKE '[sad]%' ## 以s, a, d开头
LIKE '[!sad]%' ## 不以s, a, d开头
LIKE '[^sad]%' ## 不以s, a, d开头
-
连接:连接可以替换子查询,并且比子查询效率一般要快。
内连接:使用INNER JOIN关键字,条件语句用ON,没有条件语句的情况下返回笛卡尔积。
SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;
自然连接:自动连接所有同名列。
SELECT * FROM products NATURAL JOIN customers;
左连接:保留左表没有关联的行。
SELECT customers.cust_id, orders.order_num FROM customers LEFT JOIN orders ON customers.cust_id = orders.cust_id;
右连接:保留右表没有关联的行。
SELECT customers.cust_id, orders.order_num FROM customers RIGHT JOIN orders ON customers.cust_id = orders.cust_id;
-
组合(UNION)
UNION运算符将两个或更多查询的结果组合起来并生成一个结果集。
基本规则:
所有查询的列数和列顺序必须相同
每个查询中涉及表的列的数据类型必须相同或兼容。
通常返回的列名取自第一个查询。
默认会去除相同行,如需保留相同行,使用UNION ALL。
只能包含一个ORDER BY子句,并且必须位于语句的最后。
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_state IN ('IL', 'IN', 'MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_name = 'Fun4All';
JOIN和UNION
JOIN中连接表的列可能不同,UNION所有查询的列数和列顺序必须相同。
UNION将查询之后的行放在一起(垂直放置),JOIN将查询之后的列放在一起(水平放置)。
-
函数
| 函数 | 说明 |
| ---- | ---- |
| LEFT(), RIGHT() | 左边或者右边的字符 |
| LOWER(), UPPER() | 转换为小写或者大写 |
| LTRIM, RTIM() | 去除左边或者右边的空格 |
| LENGTH() | 长度 |
| SOUNDEX() | 转换为语音值 |
SELECT * FROM mytable WHERE SOUNDEX(col1) = SOUNDEX('apple') ## 查询col1列中有发音类似apple的值
- 选择数据库:USE database。
- 查看数据库:SHOW DATABASES。
- 查看表:SHOW TABLES。
-
查看表说明:
SHOW COLUMNS FROM tablename;
DESCRIBE tablename;
DESC tablename;
- 空值检查:使用is NULL,匹配条件过滤时不返回具有NULL值的行。
- 查询语句中先分组还是先排序?
先分组,Group By 和 Having, Where ,Order by这些关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by