sql 基本语法
数据库是由许多表组成的一个库。
每条语句以分好;
结束。
适用于mysql
delect只能删除行,drop才是真正的remove,什么都能删。
安装
使用bmg文件安装,安装完成后输入:
mysql --version
如果安装显示command not found,执行下面的命令
$ cd /usr/local/bin/
$ sudo ln -fs /usr/local/mysql/bin/mysql mysql
mysql服务启动和关闭可以在系统偏好设置里面操作,终端命令如下:
$ sudo /usr/local/mysql/support-files/mysql.server start
$ sudo /usr/local/mysql/support-files/mysql.server stop
登录
mysql -u user -p password
登出
mysql> QUIT
进入数据库
use database_name
显示数据库中的表
show tables
显示所有的数据库
show databases
sql语法学习
http://www.w3school.com.cn/sql/sql_syntax.asp
SQL DML 和 DDL
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
查询和更新指令构成了 SQL 的 DML 部分(对数据进行操作,不是表还有其他的):
- SELECT - 从数据库表中获取数据
- UPDATE - 更新数据库表中的数据
- DELETE - 从数据库表中删除数据
- INSERT INTO - 向数据库表中插入数据
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
CREATE DATABASE 创建数据库
CREATE DATABASE 用于创建数据库。
CREATE DATABASE database_name
SHOW DATABASES 查看数据库。
CREATE TABLE 创建表
CREATE TABLE 语句用于创建数据库中的表。
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
数据类型(data_type)规定了列可容纳何种数据类型。
SELECT.....FROM... 选择表
- SELECT 列名称 FROM 表名
DISTINCT放回唯一的不同的值
- SELECT DISTINCT 列 FROM 表
选择指定的行的数量:
- 加 LIMIT number
WHERE 筛选条件
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
增加选取条件。
- SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
SELECT * FROM Persons WHERE City='Beijing'
注意:表中的字符串加单引号
-
一次性指定多个值:
WHERE column_name IN (value1,value2,...)
WHERE LastName IN ('Adams','Carter')
-
LIKE :匹配字符串
使用的通配符 -
BETWEEN
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
BETWEEN value1 AND value2
AND, OR 整合筛选条件
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
ORDER BY 排序
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用** DESC 关键字**。
顺序是从上向下看。
如果对第一列进行降序,第二列升序
在第一列中有相同的值时,第二列是以升序排列的。
不相同的值不进行排序。
INSERT INTO....VALUES... 插入新的行
在表中插入新的行。
如果单独选择几个列插入,则没有值的列为空。
- INSERT INTO 表名称 VALUES (值1, 值2,....):一行
- INSERT INTO 表名称(列1, 列2,...) VALUES (值1, 值2,....):指定选择的列
UPDATE....SET....WHERE... 修改表中的数据
UPDATE 用于修改表中的数据。
where用来选择哪一行。
- UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
DELETE 删除行
配合from和where使用
- DELETE FROM 表名称 WHERE 列名称 = 值 : 删除指定行
- DELETE * FROM table_name : 删除所有行
指定别名 AS(alias)
总的来说就是跟在原来名字的后面,原名 AS 别名。
- 给表指定别名:
SELECT column_name(s)
FROM table_name
AS alias_name
- 给列指定别名
SELECT column_name AS alias_name
FROM table_name
join 连接两个表
和pandas中的连接相似,通过主键,连接两个表。
也可以通过where实现一部分功能,但是通过join实现更加方便和完整。
跟在from后面,on指定主键
SELECT column_name(s)
FROM table_name1
INNER JOIN(可以用不同类型的join命令代替) table_name2
ON table_name1.column_name=table_name2.column_name
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
不同的 SQL JOIN
除了我们在上面的例子中使用的 INNER JOIN(内连接),我们还可以使用其他几种连接。
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。
- JOIN: 如果表中有至少一个匹配,则返回行,与INNER JOIN一样。但INNER跟直观。
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行。类似并集,把两个表都整合到一块。
- INNER JOIN: 内连接,放回交集
UNION 连接两个表的内容(不是合并)
UNION 操作符用于合并(上下连接)两个或多个 SELECT 语句的结果集。
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
SELECT INTO 选取数据插入另外一个表,备份存档
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
SQL 约束 (Constraints)
SQL 约束
约束用于限制加入表的数据的类型。
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
我们将主要探讨以下几种约束:
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
- DEFAULT
NOT NULL (not null) 约束非空
NOT NULL 约束强制列不接受 NULL 值。
下面的 SQL 语句强制 "Id_P" 列和 "LastName" 列不接受 NULL 值:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
UNIQUE 约束
UNIQUE 约束唯一标识数据库表中的每条记录。具体看看这个网站。还不是很明白什么用。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
PRIMARY KEY 约束
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
FOREIGN(foreign) KEY 约束
不是很懂作用?
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
FOREIGN KEY 约束用于预防破坏表之间连接的动作。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
CHECK 约束值范围
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
下面的 SQL 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)
一个列约束
CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
跟多的可以见这里。
DEFAULT 约束插入默认值
DEFAULT 约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
下面的 SQL 在 "Persons" 表创建时为 "City" 列创建 DEFAULT 约束:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
也可以插入系统的值
跟多可见这里。
CREATE INDEX 创建索引
CREATE INDEX 语句用于在表中***创建索引***。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
索引
您可以在表中创建索引,以便更加快速高效地查询数据。
用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name
ON table_name (column_name)
注释:"column_name" 规定需要索引的列。
CREATE UNIQUE INDEX 语法
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC:
CREATE UNIQUE INDEX index_name
ON table_name (column_name DESC)
假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
SQL 撤销索引、表以及数据库(删除表,索引和数据库)
DROP INDEX 删除索引
我们可以使用 DROP INDEX 命令删除表格中的索引。
ALTER TABLE table_name DROP INDEX index_name
DROP TABLE 删除表
DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除):
DROP TABLE 表名称
DROP DATABASE 删除数据库
DROP DATABASE 数据库名称
TRUNCATE TABLE 清空表中数据
如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?
TRUNCATE TABLE 表名称
ALTER TABLE 语句
在已有的表中添加、修改或删除列
ALTER TABLE .... ADD ... 增加列
如需在表中添加列,请使用下列语法:
ALTER TABLE table_name
ADD column_name datatype
ALTER TABLE .... DROP COLUMN... 删除列
ALTER TABLE table_name
DROP COLUMN column_name
注释:某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。
要改变表中列的数据类型,请使用下列语法:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
改变表中列的数据类型
ALTER TABLE table_name
MODIFY COLUMN column_name datatype
AUTO INCREMENT 插入表中时生成一个唯一的数字
Auto-increment 会在新记录插入表中时生成一个唯一的数字。
我们通常希望在每次插入新记录时,自动地创建主键字段的值。
我们可以在表中创建一个 auto-increment 字段。
MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
更多见这里。
VIEW(视图)
视图就好像我定义一个函数,我们规定需要显示满足某些条件的数据,这样当我们需要查看这些数据的时候,就不需要重新去写这些语句了。
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
查询视图(使用这个视图):
SELECT * FROM [Current Product List]
更多可见这里。
日期
只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。
下面的表格(在这个链接里)列出了 MySQL 中最重要的内建日期函数。
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式 YYYY-MM-DD
DATETIME - 格式: YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
YEAR - 格式 YYYY 或 YY
日期处理
如果不涉及时间部分,那么我们可以轻松地比较两个日期!
例如
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
如果日期中包含时间,那么上面的语句就无法查询到结果。
那么我们得不到结果。这是由于该查询不含有时间部分的日期。
**提示:**如果您希望使查询简单且更易维护,那么请不要在日期中使用时间部分!
NULL 值
NULL 值是遗漏的未知数据。
默认地,表的列可以存放 NULL 值。
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。
注释:无法比较 NULL 和 0;它们是不等价的。
那么我们如何测试 NULL 值呢?
无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。
我们必须使用 IS NULL 和 IS NOT NULL 操作符。
SQL IS NULL
我们如何仅仅选取在 "Address" 列中带有 NULL 值的记录呢?
我们必须使用 IS NULL 操作符:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
这里的Address是列名。
SQL IS NOT NULL
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
数值表达式
SELECT numerical_expression as OPERATION_NAME
[FROM table_name
WHERE CONDITION] ;
这里 numerical_expression 为数学运算或者任何公式。
创建数据库的例子
username$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.18 MySQL Community Server (GPL)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql> CREATE DATABASE test_db;
mysql> use test_db;
mysql> show tables;
Empty set (0.00 sec)
mysql> CREATE TABLE Persons
-> (
-> Id_P int,
-> LastName varchar(255),
-> FirstName varchar(255),
-> Address varchar(255),
-> City varchar(255)
-> );
mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| Persons |
+-------------------+
1 row in set (0.00 sec)
mysql> INSERT INTO Persons VALUES (1,'jiang','zhiqiang','hangzhou','zhejiang');
Query OK, 1 row affected (0.01 sec)
mysql> select * from Persons;
+------+----------+-----------+----------+----------+
| Id_P | LastName | FirstName | Address | City |
+------+----------+-----------+----------+----------+
| 1 | jiang | zhiqiang | hangzhou | zhejiang |
+------+----------+-----------+----------+----------+
1 row in set (0.00 sec)
mysql> QUIT
Bye