深入浅出SQL

创建数据库

CREATE DATABASE 数据库名称;

使用数据库

use 数据库名称;

SQL命令语句本身不区分大小写,但是命令大写是良好的SQL编程习惯。
需要注意的是分号表示命令的结束。
创建表:

CREATE TABLE 表名称
(
doughnut_name VARCHAR(10),
doughnut_type VARHAR(6)
); --'VARCHAR'是可变动字符的意思,用于保存以文本格式存储的信息,"(6)"是指这段文字的长度最多只能有6个字符。

数据类型:
VARCHAR 和DATE
DEC,DECIMAL的缩写。提供数值空间
CHAR或者CHARACTER负责的数据必须是事先设定好的长度。
DATE:记录日期
DATETIME或者TIMESTAMP记录日期和时间;
INT认为数字应该都是整数,不过他也可以出来负数

删除表:

DROP TABLE 表名称;

DROP TABLE 会删除你的表和表里面所有的数据。

数据添加进表里:

INSERT INTO 表名 (列名1,列名2,...) VALUES('VALUE1','VALUES2',...);

(值的顺序必须与对应的列名的顺序一样)
你只能说INSERT语句中的CHAR,CARCHAR,DATE,BLOB的值需加上单引号,这表示DEC、INT等数据不需要加上单引号)

控制NULL

CREATE TABLE 表名
(
last_name VARCHAR(30) NOT NULL,
first_name VARCHAR (20) NOT NULL

where 语句

SELECT* FROM  要搜索的表名 WHERE 列名 = ' 条件'

哪些数据类型需要单引号
文本类的数据类型:VARCHAR、CHAR、BLOB
TIMEDATE的列,只要不是数字,都算文本类。
关键字:LIKE

SELECT * FROM 表名 WHERE 列名 LIKE '%CA';
--我们要查找以CA结尾的值;
--%百分比号是任意数量的未知字符的替身
SELECT *  FROM 表名 WHERE 列名 LIKE '_CA';
--下划线只是一个未知字符的替身

NOT可以和BETWEEN或LIKE一起使用。重点记得NOT一定要紧接在WHERE后面,当NOT和AND或OR一起使用时,则直接接在AND或OR的后面。

SELECT * FROM 表名 WHERE 列名 IS NOT NULL

delete删除语句

DELETE FROM 表名称 WHERE 列名 = '条件';

改变数据(更新数据update)

UPDATE 表名 SET 列名 ='新的条件' WHERE 列名 = '旧条件' ;

主键规则:
主键用于独一无二地识别出每条记录;
主键不可以为NULL;
插入新纪录时必须指定主键值;
主键必须简洁;
主键值不可以被修改

ALTER TABLE 并添加PRIMARY KEY

修改表
CHANGE 可同时改变现有列的名称和数据类型;
MODIFY 修改现有列的数据类型或位置
ADD 在当前中添加一列——可自选类型
DROP 从表中删除某列

SEDCRIBE查看表的构成

修改表名

ALTER TABLE 表的旧名  RENAME TO 表的新名字;

我们要把number 列名改为proj_id,并把它设置为AUTO_INCREMENT,然后将它标注为主键:

ALTER TABLE 表名 CHANGE COLUMN number proj_id INT NOT NULL AUTO_INCREMENT,ADD PRIMARY KEY (proj_id);

以一条SQL语句改变两个列

ALTER TABLE table_name CHANGE COLUMN 列1 列1_新 CARCHAR(100),CHANGE COLUMN 列2 列2_新 VARCHAR(30);

以现有列的内容填入新列

UPDATE table_name SET column_name = newvalue;
UPDATE table_name SET state = RIGHT(location,2);
--截取location列的最后两个字符

使用CASE表达式来UPDATE

UPDATE table_name SET new_column = 
CASE 
  WHEN column1 = somevalue1
     THEN newvalue1
  WHEN column2 = somevalue2
     THEN newvalue2
  ELSE newvalue3
END;

ORDER BY
关键字DESC应位于ORDER BY 子句中的列名后,用来反转查询结果的顺序

SUM(求和)

SELECT SUM(sales) FROM cookie_sales WHERE first_name ='Nicole';

利用GROUP BY 完成分组汇总

 SELECT frist_name,SUM(sales) FROM cookie_sales GROUP BY first_name ORDER BY SUM(sales) DESE;

AVG/MAX/MIN 搭配GROUP BY

SELECT first_name,AVG(sales) FROM cookie_sales GROUP BY first_name;
SELECT first_name,MAX(sales) FROM cookie_sales GROUP BY first_name;
    SELECT first_name,MIN(sales) FROM cookie_sales GROUP BY first_name;

COUNT,计算天数

SELECT COUNT(sale_date) FROM cookie_sales;

唯一值 DISTINCT

SELECT DISTINCT sale_date FROM cookie_sales ORDER BY sale_date;
SELECT COUNT (DISTINCT sale_date) FROM cookie_sales;

外键:
外键使用的主键也被称为父键
主键所在的表又称为父表
外键能用于确认一张表中的行与另一张表中的行相对应
外键的值可以是NULL,即使主键值不可为NULL
外兼职不需要唯一——事实上,外键通常都设有唯一性。

创建带有外键的表

CREATE TABLE interests (
int_id INT NOT NULL AUTO_INCREMENT PAIMARY KEY,
interest VARCHAR(50) NOT NULL,
contact_id INT NOT NULL,
CONSTRAINT my_contacts_contact_id_fk FOREIGN KEY (contact_id)
REFERENCES my_contacts (contact_id)
);

交叉联接CROSS JOIN

SELECT t.toy,b.boy FROM toys AS t CROSS JOIN boys AS b;

内联接 INTER JOIN

SEKECT somecolumns FROM table1 INTER JOIN table2 ON somecondition;

外联接(OUTER JOIN)
内联接(INNTER JOIN)
笛卡尔联接(CARTESIAN JOIN)
表和列的别名

在单一查询不够用的时候:请用子查询
有多个值的非关联子查询:IN,NOT IN

子查询与EXISTS / NOT EXISTS

LEFT OUTER JOIN 左外联接

SELECT g.girl,t.toy FROM girls g LEFT OUTER JOIN toys t ON g.toy_id = t.toy_id;

右外联接

SELECT g.girl,t.toy FROM  toys t  RIGHT OUTER JOIN girls g ON g.toy_id = t.toy_id;

UNION的使用
INTERSECT(交集)与EXCEPT(差集)的使用方式与UNION大致相同——都是找出查询结果重叠的部分
INTERSECT只会返回同时在第一个与第二个查询中的列

事务:
事务是一群可完成一组工作的SQL语句。
经典的ACID检测
ACID是判断一组SQL语句是否构成一个事务的四个原则:
原子性。事务里的每一个步骤都必须完成,否则只能都不完成。不能只执行部分事务。
一致性:是否完成后应该维持数据库的一致性。在完成两组金钱事务后,钱的数量应该符合账户余额的情况。
隔离性。表示每次事务都会看到具有一致性的数据库,无论其他事务有什么行动。
持久性。事务完成后,数据库需要正确地存储数据并保护数据免受断电或其他威胁的伤害。通常把事务记录存储在主数据库意外的地方。

数据类型
BOOLEAN(布尔)只能存储“true”,“false”或者NULL
INT(整型)
创建临时表

CREATE TEMPORARY TABLE my_temp_table 
(
some_id INT,
some_date VARCHAR(50)
)

转换数据类型CAST()函数
语法是:

CAST(your_column,TYPE)

TYPE可从下列类型中选择:
CHAR()
DATE
DATETIME
DECIMAL
SIGNED[INTEGER]
TIME
UNSIGNED[INTEGER]
可能想用CAST()的一些情况
把字符串格式的时间值转换为DATE类型:

  SELECT CAST ('2018-10-25' AS DATE);

把整数转换为浮点数:

SELECT CAST(2 AS DECIMAL);

想要确认当前使用的账号:

SELECT CURRENT_USER;

当前日期与时间:

SELECT CURRENT DATE;
SELECT CURRENT_TIME;

有用的数学函数

数字函数 功能说明
ABS(x) 返回绝对值
ACOS(x) 返回x的反余弦值
CELL() 返回大于等于x的最小整数
EXP(x) 返回e的x次方
FLOOR(x) 返回小于等于x的最大整数
FORMAT(x,y) 转换x为文本字符串并四舍五入至y指定的位数
MOD(x,y) 返回x除以y的余数
ROUND(x) 返回x四舍五入最接近的整数
ROUND(x,y) 以y指定的小数位数对x四舍五入
SIGN(x) 当x是正数时,返回1,x是0 时,返回0;x是负数时,返回-1;
TRUNCATE(x,y) 返回x截断至y指定的小数位数后的值

你可能感兴趣的:(SQL学习)