Views reduce code duplication because a great deal of data-oriented logic can be encapsulated in the view at the time of definition. The resulting manipulated data can be accessed by the application without the application including the logic or even being aware of it.
For example, imagine a view OrderDetailsEx:
CREATE VIEW OrderDetailsEx
(OrderID, OrderDate, ProductID, Description,
UnitPrice, Quantity, ExtendedPrice, Tax, TotalPrice) AS
SELECT O.OrderID, O.OrderDate, D.ProductID, P.Description,
D.UnitPrice, D.Quantity, (D.Quantity * D.UnitPrice),
C.TaxRate, (C.TaxRate * D.Quantity * D.UnitPrice)
FROM Orders O
INNER JOIN OrderDetails D ON O.OrderID = D.OrderID
INNER JOIN Products P ON P.ProductID = D.ProductID
INNER JOIN Customers C ON C.CustID = O.CustID
Now, the application is free to select records from this table whenever order information is needed. There's no need to encode the line extension, tax calculation, and join logic into the application.
If this information is used only one place that means you've simply relocated the logic from the application to the database. However, it's much, much more likely that use of this information is going to be scattered and repeated throughout the application — in shopping module, when invoices are printed, when statements are printed, when accounts are reviewed, and so on. If that's true, then you've eliminated all that duplicated logic and stuck it into a single declarative statement in the database.